一种在嵌入式设备上用C89将字节流转换为数据包流的方法[关闭]
-
03-07-2019 - |
题
我正在使用使用 rs232(通过 USB 的 RS232)连接到 PC 的嵌入式设备。
我正在考虑开发自己的协议:
<MAGIC><LENGTH><BINARY DATA><CRC>
但我不想重新发明轮子。
请 笔记 那:我正在考虑非常受限的设备:4kb RAM,无内核,也无标准 C 库。
您能考虑一个标准方法来做到这一点(也许是开源库)?
如果您编写自己的解决方案是否有任何最佳实践?
- 您是否也在包的末尾使用 MAGIC 字节?
- 也许使用时间间隔而不是分隔符更好?
- 如何在流二进制数据中找到包的开头?
- 也许使用文本协议更好?
更新:请重新阅读问题。我不应该要求图书馆,而应该要求良好的实践。
解决方案
看 我对一个非常相似的问题给出了这个答案 关于简单协议的细节。
回应您的具体观点:
- 数据包末尾的“魔术”字节不会造成任何损害,但如果您已经知道数据包应该有多长并且有 CRC,那么它们就是多余的。
- 指定超时时间是明智的,因此如果一个数据包内的字节之间存在太大的间隙,则会标记一个错误。使用过 MODBUS, ,我不相信在其他地方使用基于时间的分隔符的价值。
- 您的意思是“如何在二进制数据流中找到数据包的开头”?如果是这样,可以指定数据包之间的最小间隙,和/或要求接收者在每个数据包后进行确认。
- 使调试更容易,并且不需要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 计算。有一篇很棒的文章,带有代码, 这里.
不隶属于 StackOverflow