我正在使用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呢?会有什么结果?
我应该如何解决此问题并让服务器收到有效的包?谢谢!
答案 0 :(得分:1)
我认为问题在于您将有符号数加在一起,而且不会将输出限制为8位。当您将字节用作无符号时,最好明确告诉编译器,以免它出现草率假设。