2014-05-18 737 views
0

我有一個字符串:「:0100000035」,我從安卓發送到通過藍牙Arduino的,在Android中該字符串的CRC是:E9601FBArduino的CRC計算和串行讀

在我的素描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

我錯過了什麼嗎?

由於

+0

您可以決定使用該代碼的語言嗎? –

+0

這是寫在C我認爲這不是我的長處。我懷疑轉換問題從字節到字符 – Houssem

回答

1

的crc_string函數計算字節數組的CRC,直到找到一個\ 0字節。當你定義緩衝行變量時,你將它定義爲11號大小,不會給你的目標字符串的\ 0留出空間,所以函數crc_string將繼續在緩衝行之後掃描內存,直到它在內存中找到\ 0爲止該問題將變量緩衝行定義爲12或更大。

+0

事實上,在我閱讀的問題是:(字節)BTSerial.read();當我改變(char)BTSerial.read();該功能給出正確的CRC – Houssem

+0

@Houssem,只是要小心你的字符串大小。你必須考慮字符串末尾的\ 0,否則事情會變得非常糟糕...... – guga