Hello, what does you believe about the problem of checksum? For we see here that ck_a will be greater than 255 probably. it can't work, do I wrong?
for (int i=0;i<ck+2;i++) Serial.print (IMU_buffer[i]);
for (int i=0;i<ck+2;i++) {
IMU_ck_a+=IMU_buffer[i]; //Calculates checksums
IMU_ck_b+=IMU_ck_a;
}
Serial.print(IMU_ck_a);
Serial.print(IMU_ck_b);
Look my solution with this little test code
int main(int argc, const char** argv) {
byte IMU_ck_a = 0;
byte IMU_ck_b = 0;
unsigned int Corrected_IMU_ck_a = 0;
unsigned int Corrected_IMU_ck_b = 0;
byte IMU_buffer[] = {
4, 5, 10, 56, 74, 43, 87, 100, 34, 68, 29
};
for (int i=0;i<10;i++) {
IMU_ck_a+=IMU_buffer[i]; //Calculates checksums
IMU_ck_b+=IMU_ck_a;
}
for (int i=0;i<10;i++) {
Corrected_IMU_ck_a+=IMU_buffer[i]; //Calculates checksums
Corrected_IMU_ck_b+=IMU_ck_a;
}
std::cout << (unsigned int)IMU_ck_a << std::endl;
std::cout << (unsigned int)IMU_ck_b << std::endl;
std::cout << Corrected_IMU_ck_a << std::endl;
std::cout << Corrected_IMU_ck_b << std::endl;
}
Replies
What we use is also the checksum used by u-blox. We chose this checksum format for consistency.
(byte)255 + (byte)1 = (byte)0
void printdata(void)
{
/*
IMU Message format
Byte(s) Value
0-3 Header "DIYd"
4 Payload length = 6
5 Message ID = 2
6,7 roll Integer (degrees*100)
8,9 pitch Integer (degrees*100)
10,11 yaw Integer (degrees*100)
12,13 checksum
*/
// This section outputs a binary data message
// Conforms to new binary message standard (12/31/09)
byte IMU_buffer[20];
int tempint;
int ck;
uint8_t tempuint;
long templong;
unsigned int Corrected_IMU_ck_a = 0;
unsigned int Corrected_IMU_ck_b = 0;
Serial.print("DIYd"); // This is the message preamble
IMU_buffer[0]=0x06;
ck=6;
IMU_buffer[1] = 0x02;
tempint=ToDeg(roll)*100; //Roll (degrees) * 100 in 2 bytes
IMU_buffer[2]=tempint&0xff;
IMU_buffer[3]=(tempint>>8)&0xff;
tempint=ToDeg(pitch)*100; //Pitch (degrees) * 100 in 2 bytes
IMU_buffer[4]=tempint&0xff;
IMU_buffer[5]=(tempint>>8)&0xff;
tempint=ToDeg(yaw)*100; //Yaw (degrees) * 100 in 2 bytes
IMU_buffer[6]=tempint&0xff;
IMU_buffer[7]=(tempint>>8)&0xff;
for (int i=0;i
for (int i=0;i
Corrected_IMU_ck_a+=IMU_buffer[i]; //Calculates checksums
Corrected_IMU_ck_b+=Corrected_IMU_ck_a;
}
byte Sended_IMU_ck_a[4] = {
((Corrected_IMU_ck_a >> 32) & 0xFF),
((Corrected_IMU_ck_a >> 16) & 0xFF),
((Corrected_IMU_ck_a >> 8) & 0xFF),
((Corrected_IMU_ck_a >> 0) & 0xFF)
};
byte Sended_IMU_ck_b[4] = {
((Corrected_IMU_ck_b >> 32) & 0xFF),
((Corrected_IMU_ck_b >> 16) & 0xFF),
((Corrected_IMU_ck_b >> 8) & 0xFF),
((Corrected_IMU_ck_b >> 0) & 0xFF)
};
for (int i = 0; i < 4; i++) Serial.print(Sended_IMU_ck_a[i]);
for (int i = 0; i < 4; i++) Serial.print(Sended_IMU_ck_b[i]);
// This section outputs the gps binary message when new gps data is available
/*GPS Message format
Byte(s) Value
0-3 Header "DIYd"
4 Payload length = 18
5 Message ID = 3
6-9 longitude Integer (value*10**7)
10-13 latitude Integer (value*10**7)
14,15 altitude Integer (meters*10)
16,17 gps speed Integer (M/S*100)
18,19 gps course not used
20-23 TOW GPS Millisecond Time of Week
24,25 checksum
*/
if(gpsFixnew==1)
{
gpsFixnew=0;
Corrected_IMU_ck_a = 0;
Corrected_IMU_ck_a = 0;
Serial.print("DIYd"); // This is the message preamble
IMU_buffer[0]=0x12;
ck=18;
IMU_buffer[1] = 0x03;
templong=convert_to_dec(lon); //Longitude *10**7 in 4 bytes
IMU_buffer[2]=templong&0xff;
IMU_buffer[3]=(templong>>8)&0xff;
IMU_buffer[4]=(templong>>16)&0xff;
IMU_buffer[5]=(templong>>24)&0xff;
templong=convert_to_dec(lat); //Latitude *10**7 in 4 bytes
IMU_buffer[6]=templong&0xff;
IMU_buffer[7]=(templong>>8)&0xff;
IMU_buffer[8]=(templong>>16)&0xff;
IMU_buffer[9]=(templong>>24)&0xff;
tempint=alt_MSL*10; // Altitude MSL in meters * 10 in 2 bytes
IMU_buffer[10]=tempint&0xff;
IMU_buffer[11]=(tempint>>8)&0xff;
tempint=speed_3d*100; // Speed in M/S * 100 in 2 bytes
IMU_buffer[12]=tempint&0xff;
IMU_buffer[13]=(tempint>>8)&0xff;
tempint=ground_course*100; // course in degreees * 100 in 2 bytes
IMU_buffer[14]=tempint&0xff;
IMU_buffer[15]=(tempint>>8)&0xff;
IMU_buffer[16]=iTOW&0xff; //TOW GPS Millisecond Time of Week
IMU_buffer[17]=(iTOW>>8)&0xff;
IMU_buffer[18]=(iTOW>>16)&0xff;
IMU_buffer[19]=(iTOW>>24)&0xff;
for (int i=0;i
for (int i=0;i
Corrected_IMU_ck_a+=IMU_buffer[i]; //Calculates checksums
Corrected_IMU_ck_b+=Corrected_IMU_ck_a;
}
byte Sended_IMU_ck_a[4] = {
((Corrected_IMU_ck_a >> 24) & 0xFF),
((Corrected_IMU_ck_a >> 16) & 0xFF),
((Corrected_IMU_ck_a >> 8) & 0xFF),
((Corrected_IMU_ck_a >> 0) & 0xFF)
};
byte Sended_IMU_ck_b[4] = {
((Corrected_IMU_ck_b >> 24) & 0xFF),
((Corrected_IMU_ck_b >> 16) & 0xFF),
((Corrected_IMU_ck_b >> 8) & 0xFF),
((Corrected_IMU_ck_b >> 0) & 0xFF)
};
for (int i = 0; i < 4; i++) Serial.print(Sended_IMU_ck_a[i]);
for (int i = 0; i < 4; i++) Serial.print(Sended_IMU_ck_b[i]);
}
}
long convert_to_dec(float x)
{
return x*10000000;
}