Arduino Mega 2560中的求和计算错误

时间:2014-11-13 01:57:47

标签: arduino checksum

我正在使用Arduino Mega 2560与服务器进行通信。

我创建一个字节数组,使用第一个数字作为指示符(告诉服务器此消息来自arduino设备)和最后一个数字用于校验和。

// for creating msg
void createmsg(){
int index = 0;
memset(MSGpack,0,sizeof(MSGpack));
byte sum;
MSGpack[0] = 0x23; // for identifing it is arduino


// for current readings
index = 14;
for (int i = 0; i < 7; i++){
  float voltage = readcurrent(i);
  injectByte(voltage, index);    
  index = index + 4;
}


////////////////////////////////////////////////////////////DATE
myRTC.updateTime();
index = 162;
int timeVAR = myRTC.dayofmonth;//reporting day
injectByte(timeVAR, index);

timeVAR = myRTC.month;
injectByte(timeVAR, 166); //reporting month

timeVAR = myRTC.year;
injectByte(timeVAR, 170); //reporting year

timeVAR = myRTC.year + myRTC.month + myRTC.dayofmonth; //sum of date
injectByte(timeVAR, 158);
////////////////////////////////////////////////////////////DATE

////////////////////////////////////////////////////////////TIME
myRTC.updateTime();
timeVAR = myRTC.hours;
injectByte(timeVAR, 146); //reporting hour

timeVAR = myRTC.minutes; 
injectByte(timeVAR, 150); //reporting second

timeVAR = myRTC.hours + myRTC.minutes;
injectByte(timeVAR, 154); //sum of time
////////////////////////////////////////////////////////////TIME

//to pass buffer verification
for (int i = 0; i < 186; i++) {
  sum += MSGpack[i];
}
MSGpack[186] = sum;

}

void injectByte(float value, int index){
  byte * b = (byte *) &value;
  MSGpack[index] = b[3];
  MSGpack[index + 1] = b[2];
  MSGpack[index + 2] = b[1];
  MSGpack[index + 3] = b[0];  
}

在服务器端,它检查最后一位数是否等于前一位数的总和,如果是,则表示收到的包是有效的。

问题是,如果我注释掉日期和时间数据,服务器可以将包识别为有效。但是如果我将数据添加回包中,服务器会说包没有效。

所以我得出结论是Arduino方面的校验和错误。

According to here,&#34;一些不断计算可能会溢出&#34; &安培;&安培; &#34;知道你的变量将在什么时候翻转&#34; &#34;等等#34;编程提示:&#34;

一个字节存储一个8位无符号数,从0到255.那么如果计算的校验和大于255呢?会有什么结果?

我应该如何解决此问题并让服务器收到有效的包?谢谢!

1 个答案:

答案 0 :(得分:1)

  1. 我建议将字节数组更改为无符号字节数组
  2. 然后将sum更改为unsigned int或unsigned short(16位就足够了)
  3. 你计算总和的地方:  sum =(sum + MSGpack [i])&amp;为0xFF;
  4. MSGpack [186] =(无符号字节)总和;
  5. 我认为问题在于您将有符号数加在一起,而且不会将输出限制为8位。当您将字节用作无符号时,最好明确告诉编译器,以免它出现草率假设。