串口多字節(jié)接收
1 /* 數(shù)據(jù)發(fā)送格式:
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(); // 讀接收寄存器數(shù)據(jù)到緩沖區(qū)
19
20 #if (FRAME_HEADER1 != FRAME_HEADER2) // 檢測幀頭,兩字節(jié)幀頭不同
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 // 檢測幀頭,兩字節(jié)幀頭相同
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 // 數(shù)據(jù)接收完畢
50 {
51 if(CheckSum == ReceiveDataBuffer[DataBufferCnt]) // 數(shù)據(jù)校驗成功
52 {
53 // 數(shù)據(jù)校驗完畢且正確
54 }
55 DataBufferCnt = 0x02;
56 }
57 }