MFC单文档之串口数据发送和接收的校验

    xiaoxiao2021-04-15  32

    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

    最新回复(0)