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);
}
}