在C中的UART中接收未定义大小的消息

时间:2012-12-27 05:35:20

标签: c arm uart lpc

我正在为LPC2148编写自己的驱动程序,我想到了一个问题。 如何在UART中收到未指定大小的消息?

我们想到的唯一两件事是:1 - 配置看门狗并在时间用完时结束接收。 2-使它无论何时向其发送消息都必须有消息字符结束。

在我看来,第一选择似乎更好,但我想知道是否有人有更好的答案,我知道必须有。

非常感谢

5 个答案:

答案 0 :(得分:8)

告诉来电者到目前为止收到的任何字节数。 UART驱动程序不应该尝试实现应用程序协议,应用程序应该这样做。

答案 1 :(得分:2)

看门狗看起来像是错误的用法。我最终得到了三个解决这个问题的方法:

  1. 使用固定大小的数据包和DMA;所以,每个事务收到一个数据包。显然,在你的情况下是不可能的。
  2. 接收消息char-by-char,直到收到消息结束字符。有点容易出错,因为EOM char可能会出现在数据中。
  3. 在每个数据包之前使用固定大小的标头。在标头中,存储有效负载大小和/或消息类型ID。
  4. 第三种方法可能是最好的方法。您可以将它与第一个组合,即使用DMA接收标头然后使用数据(在第二个事务中,在从标头中获知数据大小之后)。它也是最灵活的方法之一。

    要担心的另一件事是保持字节流同步。 UART输入缓冲区中可能存在垃圾,可能会被读取为数据,或者在MCU上电后只能获取数据包的一部分(即数据包的开始时间已经发送)。为避免这种情况,您可以在数据包标头中添加魔术字节,可能还有CRC。

    修改

    好的,还有一个选项:)只需将收到的所有内容存储在不断增长的缓冲区中供以后使用。这基本上就是PC驱动程序所做的。

答案 2 :(得分:2)

真正的嵌入式uart驱动程序通常使用ring buffer。字节按顺序存储,客户端承诺在缓冲区满之前从缓冲区读取。 然后,状态机可以多次处理消息,而不需要监视器来告知接收已结束

答案 3 :(得分:0)

最好选择2)将传输结束字符附加到传输字符串。

但我建议添加传输开始以验证您是否正在接收实际传输。

答案 4 :(得分:0)

看门狗定时器用于在设备出现意外行为时重置系统。我认为最好使用一个可以存储应用程序所需数据大小的缓冲区。