×
嵌入式 > 技术百科 > 详情

串口多字节接收

发布时间:2020-06-05 发布时间:
|

 1 /* 数据发送格式:

 2  *   0       1          2             3        4   ...   DataLenth-1  DataLenth

 3  * HEAD1 - HEAD2 - DataLenth(n+1) - data_1 - data_2 - ... - data_n - CheckSum

 4  * CheckSum = HEAD1 + HEAD2 + DataLenth + data_1 + data_2 + ... + data_n

 5  */

 6 

 7 #define FRAME_HEADER1 0xFA    // 定义帧头 1

 8 #define FRAME_HEADER2 0xFA    // 定义帧头 2

 9 unsigned char ReceiveDataBuffer[16] = {FRAME_HEADER1, FRAME_HEADER2, 0x00};

10 unsigned char DataBufferCnt = 0x02;

11 unsigned char CheckSum = FRAME_HEADER1 + FRAME_HEADER2;

12 // 串口接收中断程序

13 void USART_IRQHandler(void)

14 {

15     static unsigned char headBufCnt = 0x00;

16     unsigned char buf;

17 

18     buf = ReadRegisterReceiveBuffer();    // 读接收寄存器数据到缓冲区

19 

20 #if (FRAME_HEADER1 != FRAME_HEADER2)    // 检测帧头,两字节帧头不同

21     if(FRAME_HEADER1 == buf) { headBufCnt = 0x01;}

22     else if(0x00 != headBufCnt)

23     {

24         headBufCnt = 0x00;

25         if(FRAME_HEADER2 == buf)

26         {

27             DataBufferCnt = 0x02;

28             CheckSum = FRAME_HEADER1 + FRAME_HEADER2;

29             return;

30         }

31     }

32 #else    // 检测帧头,两字节帧头相同

33     if(FRAME_HEADER1 == buf) { headBufCnt ++;}

34     else if(headBufCnt >= 2)

35     {

36         headBufCnt = 0x00;

37         DataBufferCnt = 0x02;

38         CheckSum = FRAME_HEADER1 + FRAME_HEADER2;

39     }

40     else { headBufCnt = 0x00;}

41 #endif /* FRAME_HEADER1 != FRAME_HEADER2 */

42     

43     ReceiveDataBuffer[DataBufferCnt] = buf;

44     if((DataBufferCnt-2) < ReceiveDataBuffer[2])

45     {

46         CheckSum += ReceiveDataBuffer[DataBufferCnt];    // 计算校验和

47         DataBufferCnt ++;

48     }

49     else    // 数据接收完毕

50     {

51         if(CheckSum == ReceiveDataBuffer[DataBufferCnt])    // 数据校验成功

52         {

53             // 数据校验完毕且正确

54         }

55         DataBufferCnt = 0x02;

56     }

57 }


 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
无人机新突破:或将利用手机发射塔追踪无人机