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

来源:互联网 发布:qt语言编程 编辑:程序博客网 时间:2024/06/04 17:48

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);        }    }
0 0
原创粉丝点击