我正在编写一个计算机程序,它利用一些我在办公室很少使用的设备的输入。为了开发和测试这个程序,我尝试使用 Arduino 板来模拟来自实际设备的通信。为此,我在 Arduino 上创建了数据包,并通过串行端口将它们发送到我的计算机。数据包的格式为标头和十六进制整数,代表一些传感器数据。
标头应该包含校验和(2 的补码 256 模)。但是,我不确定如何计算它。在设备的数据表中(我尝试模拟哪种通信),它规定我应该首先计算数据包中所有字节的总和,然后取总和的 256 模并对上执行 8 位二进制补码结果。
但是,由于我是位、字节和串行通信的新手,我不明白以下内容:
1)假设我想将值 5500 作为两个字节(高字节和低字节)发送。那么十六进制编码的高字节是'15',低字节是'7c',对应十进制的21和124。在取 256-modulo 之前,我是否将贡献 21 和 124 添加到校验和中,或者我必须事先做一些位魔术?
2)我如何表达两个人的赞美?
这是一个代码,应该说明我的想法。这个想法是发送一个带有标头的数据包,其中包含一个说明数据包长度的字节、一个说明数据包类型的字节和一个用于校验和的字节。然后将代表某个传感器值的两字节整数值分为高字节和低字节,并先传输低字节。
int intVal;
byte Len = 5;
byte checksum;
byte Type = 2;
byte intValHi;
byte intValLo;
void setup(){
Serial.begin(9600);
}
void loop(){
intVal = 5500; //assume that this is a sensor value
intValHi = highByte(intVal);
intValLo = lowByte(intVal);
//how to calculate the checksum? I unsuccessfully tried the following
checksum = 0;
checksum = (Len+checksum+Type+intValHi+intValLo) % 256;
//send header
Serial.write(Len);
Serial.write(checksum);
Serial.write(Type);
//send sensor data
Serial.write(intValLo);
Serial.write(intValHi)
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
您应该了解的第一件事是 mod 256 与查看底部 log(256) => 8 位相同。
要理解这一点,您必须首先了解“mod”操作的作用以及数字在硬件中的表示方式。
Mod 是旧式除法后的余数(即只有整数)。例如 5%2 = 1
硬件中的数字以“位”存储,可以解释为基数 2 数学。
因此,如果您想对 2 的幂进行模运算,您实际上不必做任何数学运算。
这就像如果您想获得 10 的幂的余数,您只需取较低的数字。
IE。157% 100 = 57。
这可以通过使用字节应该自己溢出的事实来加速。这意味着要获取一堆数字中的 %256,您所要做的就是将它们添加到一个字节中,而 arduino 将处理其余部分。
对于两人的赞美,请参阅这个问题: