java - Arduino CRC计算和串口读取

标签 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[11] bufferline bufferline = ":0100000035"

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

我错过了什么吗?

谢谢

最佳答案

crc_string 函数计算字节数组的 CRC,直到找到\0 字节。当你定义 bufferline 变量时,你定义它的大小为 11,没有给你的目标字符串的\0 留出空间,所以函数 crc_string 将在 bufferline 之后继续扫描内存,直到它在内存中找到一个\0 ...解决问题,将变量 bufferline 定义为大小 12 或更大。

关于java - Arduino CRC计算和串口读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23721933/

相关文章:

java - 应用 xss 跨站脚本编码 jsp/servlet 应用程序的有效方法

android - 使同一屏幕上的 2 个 Android ListViews 具有相同的高度

java - 有什么方法可以将 # 这样的符号传递给 android CallIntents 吗?

c++ - 您认为不为小程序释放内存是个好主意吗?

java - java中的桌面共享

Java String 到一种类型的字符

java - Selenium +JUnit。怎样干燥?

java - Eclipse自动构建Android项目很糟糕

c++ - 从 Makefile 中的 C++FLAGS 中删除标志?

c++ - 如何调用仅给出其名称的方法?