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