3

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

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

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

非常感谢你

4

5 回答 5

8

只需给调用者到目前为止您收到的任何字节。UART 驱动程序不应该尝试实现应用程序协议,应用程序应该这样做。

于 2012-12-27T06:40:18.347 回答
3

看门狗似乎是错误的用途。我最终为这个问题提供了三种解决方案:

  1. 使用固定大小的数据包和 DMA;因此,您每次交易都会收到一个数据包。显然,在你的情况下这是不可能的。
  2. 逐个字符地接收消息,直到收到消息结束字符。容易出错,因为 EOM 字符可能会出现在数据中。
  3. 在每个数据包之前使用固定大小的标头。在标头中,存储有效负载大小和/或消息类型 ID。

第三种方法可能是最好的方法。您可以将它与第一个相结合,即使用 DMA 接收标头,然后接收数据(在第二个事务中,在从标头中知道数据大小之后)。它也是最灵活的方法之一。

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

编辑

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

于 2012-12-27T06:04:57.087 回答
2

真正的嵌入式 uart 驱动程序通常使用环形缓冲区。字节按顺序存储,客户端承诺在缓冲区满之前从缓冲区中读取。然后状态机可以多次处理消息,而无需看门狗告诉它接收结束

于 2012-12-27T06:48:16.450 回答
0

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

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

于 2012-12-27T07:19:00.230 回答
0

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

于 2012-12-27T07:25:52.733 回答