2

可能重复:
UART ISR Tx Rx 架构

我现在正在使用 TI micro,它包括一个 DMA UART 驱动程序和一个支持并行任务的操作系统。UART驱动的功能包括:

  • 静态无效 HalUARTInitDMA(void);
  • 静态无效 HalUARTOpenDMA(halUARTCfg_t *config);
  • 静态 uint16 HalUARTReadDMA(uint8 *buf, uint16 len);
  • 静态 uint16 HalUARTWriteDMA(uint8 *buf, uint16 len);
  • 静态无效 HalUARTPollDMA(void);
  • 静态 uint16 HalUARTRxAvailDMA(void);
  • 静态无效 HalUARTSuspendDMA(void);
  • 静态无效 HalUARTResumeDMA(void);

我正在尝试与另一个外围设备通信,该外围设备接受以回车符终止的消息,然后以回车符响应消息。

我很好奇构建这种类型的通信状态机的最佳方法是什么。我的问题是为 UART 端口设计回调函数,使其...

  1. 不会挂起系统等待响应。(某种超时)
  2. 如果响应被读取得太快,它会将响应连接在一起
  3. 回车将表示消息的结束

基本理论是这样的:

//send messsage to peripheral
HalUARTWriteDMA("tx\r",4);

//wait a little bit for the device to process the message

//start reading from the peripheral    
do {
    //how many bytes are at the RX port?
    int len = HalUARTRxAvailDMA();

    //Read those bytes
    HalUARTReadDMA(msg, len);

    //append the rx msg to the buffer
    strcat(rxbuf, msg)

    //does the response contain a CR?
} while(strchr(rxbuf, 0x0D));

这个想法有几个明显的缺陷。我希望有人可以就如何进行这种类型的交流分享一些想法?

谢谢!

4

2 回答 2

1

如果您打算阻止等待消息的线程,那么您所描述的设计存在一个直接问题 - 这是使用可变大小的消息和 aCR作为分隔符。

我想这HalUARTReadDMA()旨在阻止调用线程,直到len收到字节,因此您显然无法可靠地使用它来阻止可变长度消息。

代码看起来像(做一些假设):

while (1) 
{
    static const size_t bufferSize = sizeof(Message_t);
    uint8_t buffer[bufferSize];

    // blocks until message received 
    unsigned len = HalUARTReadDMA(buffer, bufferSize);

    if (len == bufferSize)
        processMessage(buffer);
}

对于不涉及轮询的 DMA 使用可变大小消息的问题,没有特别好的或可靠的解决方案 - 除非 DMA 控制器可以为您检测消息结束分隔符。
如果您无法更改消息格式,则最好使用中断驱动的 IO,在该 IO 中阻止接收单个消息字节 - 特别是在数据速率相对较低的 UART 的情况下。

于 2012-10-22T08:35:25.293 回答
0

除非您的 DMA 驱动程序具有接受缓冲区指针队列的功能,可以在接收到 CR 时生成中断并自行移动到下一个缓冲区指针,否则您将陷入迭代 rx 数据,寻找铬。

如果您必须迭代数据,您也可以在“经典”ISR 中执行此操作,从 rx FIFO 中逐个获取字符并将它们推入缓冲区,直到收到 CR。

然后,您可以将缓冲区指针排队到一个合适的循环队列中,从另一个“空”缓冲区的循环池队列中获取另一个缓冲区以获取下一条消息,发出信号量,以便将要处理消息的线程运行并退出通过操作系统从您的 ISR 中获取,以便立即执行重新安排。

rx 线程可以使消息出列、处理它,然后将其重新排队到池队列以供 ISR 重用。

使用 strchr() 连续搜索完整缓冲区以查找 CR 可能不是特别有效或容易 - CR 可能位于 DMA 缓冲区的中间,并且您需要自己参与挖掘部分缓冲区的数据复制。

.

于 2012-10-22T23:20:57.417 回答