2009-05-02 38 views
11

我正在使用使用rs232(rs232 over USB)連接到PC的嵌入式設備。在嵌入式設備上將字節流轉換爲C89中的數據包流的方法

我在考慮發展我自己的協議:

<MAGIC><LENGTH><BINARY DATA><CRC>

,但我不想推倒重來。

注意說:我正在考慮相當有限的設備:4kb的RAM,沒有內核,也沒有標準的C庫。

你能想到一個標準的方法來做到這一點(也許是開源庫)嗎?

如果您編碼自己的解決方案是否有任何最佳做法?

  • 你使用魔法字節也是在包的結束?
  • 也許最好是使用時間間隔而不是分隔符?
  • 如何在流二進制數據中找到包的開始?
  • 也許最好是使用文本協議?

UPDATE: 請重新閱讀的問題。我不應該要求圖書館,而是要求好的做法。

+0

類似於:http://stackoverflow.com/questions/815758/ – 2009-05-03 14:08:26

+0

第3個要點應該是:「你怎麼在二進制數據流中找到數據包的開始」? – 2009-05-03 14:17:17

+0

謝謝史蒂夫:) – 2009-05-03 15:15:48

回答

3

有關簡單協議的詳細信息,請參閱this answer I gave to a very similar question

要回復您的具體問題:

  1. 「魔術師」個字節的數據包的結束不會做任何傷害,但它們是多餘的,如果你已經知道該數據包應該要等多久,並有一個CRC。
  2. 指定超時時間可能是明智的,因此如果一個數據包內的字節之間的間隔太大,則會標記錯誤。使用Modbus後,我不相信在其他地方使用基於時間的分隔符的價值。
  3. 你的意思是,「你怎麼在二進制數據流中找到數據包的開始」?如果是這樣,可以指定數據包之間的最小間隔,並且/或者要求接收者在每個數據包之後進行檢查。
  4. 使其更易於調試,並且不需要PC上的任何特殊軟件,但效率不高。當然,如果可用性比效率更重要,那麼基於文本的系統是完全合適的。
0

關於超出你的I/O原語的唯一的東西就是CRC計算。有一篇漂亮的文章,代碼爲here

3

對於在您獲得現有解決方案以在設備上工作時的情況,只需重新發明輪子就可以輕鬆完成。

void buffer_packet(unsigned char rx_byte) 
{ 
    static unsigned char byte_count = 0; 
    static unsigned char packet[8]; 

    packet[byte_count++] = rx_byte; 
    if (byte_count == 8) 
    { 
     unsigned char crc = calculate_crc(packet, 8); 

     write_uart(0x55); 
     write_uart(8); 
     while (byte_count--) 
     { 
      write_uart(packet[7 - byte_count]); 
     } 
     write_uart(crc); 
    } 
} 

或者也許我低估了你的問題。如果您正在尋找如何生成RS232位,請查看您的微控制器數據表。

相關問題