1、引言
上一篇中收发数据讲的是数据格式的转换,现在来讲讲最关键的部分:串口通信协议,即收发数据的规则制定同时怎么防止数据出错。
2、校验和的形式校验
收发数据协议:
1、发送和接收信号数组结构: 0xAA55(cmd)(data1, data2,……,data32)(check1)(check2); 2、cmd、data、check范围:01-FF 3、所有数据加起来的和得到的高位为(check1),低位为(check2),然后收到数据方再累加一次与(check1)(check2)进行比较,可以有效防止数据出错,出错概率为1/256*1/256。
校验和的实现
怎么把累加得到的三字节或者四字节的16进制数拆成两半分别放置呢,用一个&就可以完美实现了。
data37 =
(data36 & 0xff00) >> 8, data38 = (data36 & 0xff);
实现代码
CByteArray receivedata;
int receivedatalen;
receivedatalen = Str2Hex(buffer, receivedata);
int data36 = receivedata[
0] + receivedata[
1] + receivedata[
2] + receivedata[
3] + receivedata[
4] + receivedata[
5] + receivedata[
6] + receivedata[
7] + receivedata[
8] + receivedata[
9]
+ receivedata[
10] + receivedata[
11] + receivedata[
12] + receivedata[
13] + receivedata[
14] + receivedata[
15] + receivedata[
16] + receivedata[
17] + receivedata[
18] + receivedata[
19]
+ receivedata[
20] + receivedata[
21] + receivedata[
22] + receivedata[
23] + receivedata[
24] + receivedata[
25] + receivedata[
26] + receivedata[
27] + receivedata[
28] + receivedata[
29]
+ receivedata[
30] + receivedata[
31] + receivedata[
32] + receivedata[
33] + receivedata[
34],
data37 = (data36 &
0xff00) >>
8, data38 = (data36 &
0xff);
if ((receivedata[
35] == data37) && (receivedata[
36] == data38))
{
if ((receivedata[
2] ==
0x01))
{
MyPublicData.Public_card = strcard;
m_cardnum = strcard;
SetDlgItemText(IDC_CARDSHOW, m_cardnum);
AfxMessageBox(_T(
"已识别卡号!"));
m_StateLed1.SetIcon(m_hIconLedGreen);
}
}
转载请注明原文地址: https://ju.6miu.com/read-671249.html