计算算术和以通过串行方式与机器通信
Posted
技术标签:
【中文标题】计算算术和以通过串行方式与机器通信【英文标题】:Compute Arithmetic Sum to Communicate with Machine Over Serial 【发布时间】:2010-01-06 16:23:24 【问题描述】:我正在通过串口与机器通信。协议通信规范的一部分指出,控制和是“从 (包括)、 到 的字节的算术和”
报文的结构如下:
,其中:
- 数据包大小
长度:1
值:0x02 到 0x63
最大数据包长度为 99 字节
- 数据
长度:1...90 字节
值:0x00 - 0xFF
数据部分的长度取决于命令。
- 校验和
长度 - 1 个字节
值:0x00 - 0xFF
例子:
ACK 数据包:0x02 0x01 0x03 其中 0x03 是校验和。
那么如何在 C++ 中计算这些字节的校验和?
【问题讨论】:
“算术和”是重言式。你也可以称之为“总和”。 【参考方案1】:看起来校验和是一个简单的和,模 256。
int sum = 0;
for (int j = 0; j < number_of_bytes_in_message; ++j)
sum += message [j];
sum %= 256; // or, if you prefer sum &= 255;
【讨论】:
接受了,但我最终使用了unsigned char cs = 0;
,所以如果它大于 255,它会重置为 0
不要忘记在校验和中包含长度。 sum = number_of_bytes_in_message。
这些示例没有显示 8 位环绕总和会发生什么。一些校验和算法也添加了高字节 [sum = (sum & 255) + (sum >> 8)
]。这就是为什么我在求和过程中没有截断。
@wallyk:明白了.. 它似乎不是那样工作的。感谢您的帮助【参考方案2】:
使用无符号 8 位类型(uint8_t 或无符号字符)作为累加器,在生成数据包时将每个字节添加到其中,然后将其作为校验和字节发送。具体如何取决于您打算如何构建数据包。
【讨论】:
我正在使用 char buff[256] 并将每个字节设置为十六进制值。以上是关于计算算术和以通过串行方式与机器通信的主要内容,如果未能解决你的问题,请参考以下文章