计算算术和以通过串行方式与机器通信

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 &amp; 255) + (sum &gt;&gt; 8)]。这就是为什么我在求和过程中没有截断。 @wallyk:明白了.. 它似乎不是那样工作的。感谢您的帮助【参考方案2】:

使用无符号 8 位类型(uint8_t 或无符号字符)作为累加器,在生成数据包时将每个字节添加到其中,然后将其作为校验和字节发送。具体如何取决于您打算如何构建数据包。

【讨论】:

我正在使用 char buff[256] 并将每个字节设置为十六进制值。

以上是关于计算算术和以通过串行方式与机器通信的主要内容,如果未能解决你的问题,请参考以下文章

工业机器人-串口通信技术与MODBUS协议

串口工作原理

与科学仪器的串行通信

串行输入输出和并行输入输出的区别解析

单片机

串行通信协议I2CSPIUART