我正在编写一个计算机程序,它利用了我办公室里很少有的一些设备的输入。为了开发和测试这个程序,我试图使用Arduino板来模拟来自实际设备的通信。为此,我在Arduino上创建数据包,并通过串口将它们发送给我的计算机。数据包被形成为标题和十六进制整数,表示一些传感器数据。
标题应包含校验和(2' s补256-模)。但我不知道如何计算它。在设备的数据表中(我尝试模拟的通信),声明我应首先计算数据包中所有字节的总和,然后取总和的256模数并执行8位2&#39 ; s补充结果。
但是,由于我是比特,字节和串行通信的新手,我不明白以下内容:
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)
}
谢谢!
答案 0 :(得分:4)
你应该理解的第一件事是mod 256与查看底部日志(256)=>是一回事。 8位。
要理解这一点,你必须首先意识到' mod'操作以及如何在硬件中表示数字。
Mod是老派分区后的剩余部分(即只有整数)。 例如5%2 = 1
硬件中的数字存储在'位中。这可以解释为基数2数学。
因此,如果你想采用2的幂的mod操作,你实际上不需要做任何数学运算。
这就像你想要剩余的10的幂,你只需要取较低的数字。
即。 157%100 = 57。
这可以通过使用字节应该自行溢出的事实来加速。这意味着你需要做的就是将一堆数字中的%256加到一个字节上,而arduino将负责其余的数据。
对于两个人的赞美,请看这个问题: