Arduino CRC计算和串行读取

时间:2014-05-18 12:33:01

标签: java android c++ arduino crc32

我有一个字符串:":0100000035" 我通过蓝牙从Android发送到Arduino,在Android中此字符串的CRC是:E9601FB

在我的草图中,CRC计算功能是:

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;
}

读取循环构造一个char数组:char[11] bufferline bufferline = ":0100000035"

但是当我打印CRC Serial.println(crc_string(bufferline), HEX);时,它给出了:F1D51E33 如果我喜欢这样:Serial.println(crc_string(":0100000035"), HEX);它给出正确的CRC:E9601FB

我错过了什么吗?

由于

1 个答案:

答案 0 :(得分:1)

crc_string函数计算字节数组的CRC,直到找到\ 0字节。当您定义缓冲区变量时,将其定义为大小为11,而不是为目标字符串的\ 0提供空间,因此函数crc_string将继续在缓冲区之后扫描内存,直到它在内存中找到\ 0 ...来解决问题是,将变量缓冲行定义为12或更大。