Y_G_G 发表于 2021-11-12 16:53 学习了谢谢 |
|
//串口接收上位机,可以用strstr函数查找,比如,上位机发送 数据:255 //单片机可以先查找"数据:",查找到之后再处理后面的255,这样的代码可以简单明了很多 void Uart2_Isr() interrupt 8 //串口2中断 { char *p,Uart_S[15]; static unsigned char RX_Count; unsigned a; if(S2CON&0x02) { S2CON&=~0x02; //清除中断发送标示位 Busy=0; // return; } //──────────────────────────────────────────────────────────────────────────── if(S2CON&0x01) { S2CON&=~0x01; //清除中断接收标示位 Uart_S[RX_Count]=S2BUF; RX_Count++; p=strstr(Uart_S,"数据:"); //查找指令结束符"数据:" if(NULL!=p) //如果没有查找到"数据:",指针返回值为空 { //指针返回值不为空,就表示串口接收到"数据:",处理......... } } //────────────────────────────────────────────────────────────────────────────── } |
188610329 发表于 2021-11-12 15:43 好的谢谢 |
|
用for 循环 假定你的 dat 长度为64 for(j=0, j<63,j++) //循环63次 { dat[j] = dat[j+1]; } 然后再去对比指令。 |
188610329 发表于 2021-11-12 14:30 利用 dat[j] = dat[j+1]; 具体怎么实现的呢? |
|
首先需要确认,你的 i 是全局变量, 然后, 你即使 sflag == FALSE 也要 i=0 不然,只要有一个错误指令,后面你的指令位置都不会从0开始,永远指令都是错误的。 通常有两个方案, 1)按照波特率的 105倍计时,超过后,判断超时(表示所有指令都已经接受完毕),开始验证指令,验证完毕后,不管指令对不对,都把 i=0 准备接受下一个指令。 2)利用 dat[j] = dat[j+1]; 进行移位,多次反复比较指令,那么就不在乎 i 有没有归零了。 |