Houssem
Houssem

Reputation: 2069

Arduino CRC calculation and Serial reading

I have a string : ":0100000035" that I sent from Android to Arduino via bluetooth, In Android the CRC of this string is : E9601FB

In my sketch the CRC calculation function is :

static PROGMEM prog_uint32_t crc_table[16] = {
    0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
    0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
    0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
    0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
};

unsigned long crc_update(unsigned long crc, byte data)
{
    byte tbl_idx;
    tbl_idx = crc ^ (data >> (0 * 4));
    crc = pgm_read_dword_near(crc_table + (tbl_idx & 0x0f)) ^ (crc >> 4);
    tbl_idx = crc ^ (data >> (1 * 4));
    crc = pgm_read_dword_near(crc_table + (tbl_idx & 0x0f)) ^ (crc >> 4);
    return crc;
}

unsigned long crc_string(char *s)
{
  unsigned long crc = ~0L;
  while (*s)
    crc = crc_update(crc, *s++);
  crc = ~crc;
  return crc;
}

the reading loop constructs a char array : char[11] bufferline bufferline = ":0100000035"

but when I print the CRC Serial.println(crc_string(bufferline), HEX); it gives : F1D51E33 and if I do like this : Serial.println(crc_string(":0100000035"), HEX); it gives the right CRC : E9601FB

Am I missing anything ?

Thanks

Upvotes: 0

Views: 5149

Answers (1)

guga
guga

Reputation: 724

The crc_string function computes the CRC of an array of bytes until it finds a \0 byte. When you define the bufferline variable, you define it as size 11, not giving room for the \0 of your target string, so the function crc_string will continue scanning the memory after bufferline until it finds a \0 in memory... To solve the problem, define the variable bufferline as size 12 or more.

Upvotes: 1

Related Questions