2009-05-02 30 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位,请查看您的微控制器数据表。

相关问题