如何在arduino上计算256模校验和

如何在arduino上计算256模校验和,arduino,Arduino,我正在写一个计算机程序,它利用我办公室里很少有的一些设备的输入。为了开发和测试该程序,我尝试使用Arduino板模拟实际设备的通信。为此,我在Arduino上创建数据包,并通过串行端口将它们发送给我的计算机。数据包被格式化为一个报头和一个十六进制整数,表示一些传感器数据 报头应该包含一个校验和(2的补码256模)。不过,我不知道如何计算。在设备的数据表(我尝试模拟的通信)中指出,我应该首先计算数据包中所有字节的总和,然后取总和的256模,并对结果执行8位2的补码 但是,由于我是位、字节和串行通信

我正在写一个计算机程序,它利用我办公室里很少有的一些设备的输入。为了开发和测试该程序,我尝试使用Arduino板模拟实际设备的通信。为此,我在Arduino上创建数据包,并通过串行端口将它们发送给我的计算机。数据包被格式化为一个报头和一个十六进制整数,表示一些传感器数据

报头应该包含一个校验和(2的补码256模)。不过,我不知道如何计算。在设备的数据表(我尝试模拟的通信)中指出,我应该首先计算数据包中所有字节的总和,然后取总和的256模,并对结果执行8位2的补码

但是,由于我是位、字节和串行通信的新手,我不了解以下内容:

1) 假设我想将值5500作为两个字节(高字节和低字节)发送。在十六进制编码中,高字节是“15”,低字节是“7c”,对应于十进制值中的21和124。然后,在取256模之前,我是将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)
}

谢谢

您应该了解的第一件事是mod 256与查看底部日志(256)=>8位是一样的

要理解这一点,您必须首先了解“mod”操作的作用以及数字在硬件中的表示方式

Mod是旧的学校除法后的余数(即只有整数)。 例5%2=1

硬件中的数字存储在“位”中,可以解释为基数2

因此,如果你想要取2的幂的mod运算,你实际上不需要做任何数学运算

这就好比如果你想得到10的剩余幂,你只需要取较低的数字

即157%100=57

这可以通过使用字节本身应该溢出的事实来加速。这意味着您只需将一组数字中的%256添加到一个字节中,arduino就会处理剩下的部分

关于两个赞美词,请参见以下问题: