在嵌入式设备上将字节流转换为C89中的数据包流的方法
我正在研究使用rs232(通过USB连接的rs232)连接到PC的嵌入式设备。
我正在考虑开发自己的协议:
但我不想重新发明轮子。
请注意 :我正在考虑相当受限的设备:4kb的RAM,没有内核,也没有标准的C lib。
你能想到一个标准的方法来做到这一点(也许是开源库)?
如果您编写自己的解决方案,是否有任何最佳实践?
- 你是否也在包的末尾使用MAGIC字节?
- 也许最好使用时间间隔而不是分隔符?
- 如何在流二进制数据中找到包的开头?
- 也许最好使用文本协议?
更新:请重新阅读问题。 我不应该要求图书馆,而是要求良好做法。
看到这个答案,我给出了一个关于简单协议细节的非常类似的问题 。
回应您的具体要点:
- 数据包末尾的“魔术”字节不会造成任何伤害,但如果您已经知道数据包应该有多长时间并且具有CRC,则它们是多余的。
- 指定超时时间是明智的,因此如果一个数据包中的字节之间的间隙太大,则会标记错误。 使用Modbus后 ,我不相信在其他地方使用基于时间的分隔符的价值。
- 你是说,“你怎么在二进制数据流中找到数据包的开头”? 如果是这样,可以指定数据包之间的最小间隙,和/或要求接收者在每个数据包之后进行acknolwedge。
- 使调试更容易,并且PC上不需要任何特殊软件,但效率不高。 当然,如果可用性比效率更重要,那么基于文本的系统是完全合适的。
对于类似的东西,当你得到一个现有的解决方案在你的设备上工作时,重新发明轮子会更容易。
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位,请参阅微控制器数据表。
关于I / O原语之外的唯一事情是CRC计算。 这里有一篇精彩的文章和代码。