我正在为 LPC2148 编写自己的驱动程序,我想到了一个问题。如何在 UART 中接收未指定大小的消息?
唯一想到的两件事是: 1 - 配置看门狗并在时间用完时结束接收。2- 使得无论何时向其发送消息,都必须有消息结束字符。
在我看来,第一个选择似乎更好,但我想知道是否有人有更好的答案,我知道肯定有。
非常感谢你
只需给调用者到目前为止您收到的任何字节。UART 驱动程序不应该尝试实现应用程序协议,应用程序应该这样做。
看门狗似乎是错误的用途。我最终为这个问题提供了三种解决方案:
第三种方法可能是最好的方法。您可以将它与第一个相结合,即使用 DMA 接收标头,然后接收数据(在第二个事务中,在从标头中知道数据大小之后)。它也是最灵活的方法之一。
还要担心的另一件事是保持字节流同步。UART输入缓冲区中可能有垃圾,可能会被读取为数据,或者在MCU上电后您只能获得一部分数据包(即此时数据包的开头已经发送)。为避免这种情况,您可以在数据包标头中添加魔术字节,可能还有 CRC。
编辑
好的,还有一个选项 :) 只需将收到的所有内容存储在不断增长的缓冲区中以备后用。这基本上就是 PC 驱动程序所做的。
真正的嵌入式 uart 驱动程序通常使用环形缓冲区。字节按顺序存储,客户端承诺在缓冲区满之前从缓冲区中读取。然后状态机可以多次处理消息,而无需看门狗告诉它接收结束
最好选择选项 2)将传输字符的结尾附加到传输字符串。
但我建议添加传输开始也以验证您正在接收实际传输。
看门狗定时器用于在设备出现意外行为时重置系统。我认为最好使用可以存储应用程序所需数据大小的缓冲区。