C++Builder 程序员博客
30 Jul
通讯协议包括头文件(Soh) 地址码(Addr) 数据块长(Len) 数据块(Data) 检验和(Checksum) 尾块(LF)
其中Checksum为从Addr开始到数据快捷素所有字节之和(即字符的ASC码之和),取14位(最高2为丢弃),分高、低两个7bit字节,将bit8置1.低字节在前,高字节在后。
例如 ,从Addr开始到数据块结束所有字节之和为32341(7E55H),则对其2 位最高位后为3E55H,氛围两个7字节7CH和55H,最高位置1后为FCH和D5H,所以检验和为D5H,FCH(低字节在前)。
请问这个检验和的计算如何实现?
BYTE Data[8];
WORD wCheckSum;
BYTE b1,b2;
wCheckSum = 0;
for ( int i = 0; i < 8; i++ )
{
wCheckSum += Data[i];
}
wCheckSum &= 0×3FFF; // 去掉最高的两位
b1 = (BYTE)wCheckSum; // 低字节
b1 ¦= 0×80; // 将最高位置1
b2 = (BYTE)((wCheckSum >> 7); // 高字节
b2 = ¦= 0×80; // 将最高位置1
wCheckSum = ((WORD)b1) < < 8;
wCheckSum ¦= b2; // 最后的校验值
写的非常清楚,很是感谢。
我还想问下,发送到串口缓冲区的数据是十六进制的形式,我想吧接受到的数据在解析以前先在Memo控件里显示,请问这个格式应该怎么样转化呢?
谢谢!
答者必有分!