12

我正在使用使用 rs232(通过 USB 的 rs232)连接到 PC 的嵌入式设备。

我正在考虑开发自己的协议:

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

但我不想重新发明轮子。

注意:我正在考虑非常受限的设备:4kb 的 RAM,没有内核,也没有标准的 C 库。

你能想出一个标准的方法来做到这一点(也许是开源库)?

如果您编写自己的解决方案,是否有任何最佳实践?

  • 您是否也在包的末尾使用 MAGIC 字节?
  • 也许使用时间间隔而不是分隔符更好?
  • 如何在流二进制数据中找到包的开头?
  • 也许使用文本协议更好?

更新: 请重新阅读问题。我不应该要求图书馆,而是要求良好的做法。

4

3 回答 3

4

请参阅我对一个非常相似的问题给出的关于简单协议细节的答案。

回应您的具体观点:

  1. 数据包末尾的“魔术”字节不会造成任何伤害,但如果您已经知道数据包应该有多长并且具有 CRC,它们就是多余的。
  2. 指定超时时间是明智的,因此如果一个数据包内的字节之间的间隙太大,则会标记错误。使用Modbus后,我不相信在其他地方使用基于时间的分隔符的价值。
  3. 您的意思是“如何在二进制数据流中找到数据包的开头”?如果是这样,可以指定数据包之间的最小间隔,和/或要求接收者在每个数据包后确认。
  4. 使调试更容易,并且不需要PC上的任何特殊软件,但效率不高。当然,如果可用性比效率更重要,那么基于文本的系统是完全合适的。
于 2009-05-03T14:10:14.200 回答
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 位,请查看您的微控制器数据表。

于 2009-05-02T17:58:18.280 回答
0

除了 I/O 原语之外,唯一的事情就是 CRC 计算。这里有一篇带代码的漂亮文章。

于 2009-05-02T16:28:41.570 回答