单片机串口接收数据的一些经验与教训
一些好文章
一種單片機數(shù)據(jù)解析方法:https://mp.weixin.qq.com/s/GVH8MZrlbVKXanD45wOYOw
單片機串口接收數(shù)據(jù)需要注意以下幾點
1.接收數(shù)據(jù)要有順序,接收到在通信指令范圍內(nèi)的數(shù)據(jù)就設(shè)置接收下一個數(shù)據(jù),否則下一個還是從頭數(shù)據(jù)開始
2.頭數(shù)據(jù)設(shè)定在有效范圍內(nèi)才接收下一個數(shù)據(jù),其他數(shù)據(jù)接收視情況定,如果中斷接收沒處理,需要后期對接收的數(shù)據(jù)處理,不在通信指令范圍內(nèi)的剔除掉不做處理
3.超時處理:超過一定時間沒接收到下一個數(shù)據(jù)時,下一個數(shù)據(jù)從頭數(shù)據(jù)開始,比如一組4個數(shù)據(jù),結(jié)果收到5個數(shù)據(jù),并且第5個數(shù)據(jù)是另一組的頭數(shù)據(jù),如果沒有超時處理會造成下一次數(shù)據(jù)無法處理
4.用2個數(shù)組接收數(shù)據(jù):A數(shù)據(jù)接收一組數(shù)據(jù)完成后轉(zhuǎn)移到B數(shù)據(jù),預防處理混亂,比如一組4個數(shù)據(jù),結(jié)果收到5個數(shù)據(jù),并且第5個數(shù)據(jù)是另一組的頭數(shù)據(jù),結(jié)果覆蓋了第一個的頭數(shù)據(jù)導致處理出錯。
實例:波特率1200,一組4個數(shù)據(jù)的串口中斷處理函數(shù)
#define RE_START 0x01 #define RE_DATA 0x02 #define RE_SUM 0x03 //#define RE_END 0X04void UC_IrqServerRec(void) interrupt 4 {static unsigned char i=0;unsigned char temp; static unsigned char XDATA count=0;if(RI){temp = SBUF; //接收緩沖數(shù)據(jù)RI = 0;switch(g_McuRecvState) // 默認g_McuRecvState=RE_START{case RE_START:if((temp >= 0x20)&&(temp <= 0x80)) // 如果接收的頭在設(shè)定的通信指令范圍內(nèi){ g_McuRecvState = RE_DATA; // 下一個數(shù)據(jù)處理地方count=0;g_McuUartDataBuf[count] = temp;count++; g_UartTimeFlag=8; //接收超時處理,定時器中斷里如果大于0則每5毫秒減1,減到0后設(shè)置g_McuRecvState = RE_START;}else // 如果接收的頭數(shù)據(jù)不在通信范圍內(nèi),下一次還從頭開始{g_McuRecvState = RE_START;}break;case RE_DATA: //DATAg_McuUartDataBuf[count] = temp;count++; if(count==3){g_McuRecvState = RE_SUM; } break;case RE_SUM: //CR VERIFYcount=0;for(i=0;i<3;i++){g_McuDataBuf[i]=g_McuUartDataBuf[i];//轉(zhuǎn)移數(shù)據(jù)到另一個數(shù)組,防止出錯時收到5個數(shù)據(jù)第5個數(shù)據(jù)時把第一個數(shù)據(jù)刷掉了count += g_McuDataBuf[i];}g_McuRecvState = RE_START;if(count==temp){g_UartData=1; // 表示正確接收完一組數(shù)據(jù)}break; default: break;}} }總結(jié)
以上是生活随笔為你收集整理的单片机串口接收数据的一些经验与教训的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用导线截面积和载流量数据总结
- 下一篇: Neo4j(一):图数据库基础