Possible Duplicate:
UART ISR Tx Rx Architecture
我现在正在使用一个TI-micro,它包括一个DMA UART驱动程序和一个支持并行任务的操作系统UART驱动程序的功能包括:
静态空隙(空隙);
静态void HalUARTOpenDMA(halUARTCfg_t*config);
静态uint16 haluartraddma(uint8*buf,uint16 len);
静态uint16 HalUARTWriteDMA(uint8*buf,uint16 len);
静态void HalUARTPollDMA(void);
静态uint16 HalUARTRxAvailDMA(void);
静态空隙haluartuspenddma(空隙);
静态空隙(空隙);
我正在尝试与另一个外围设备通信,该外围设备接收以回车结束的消息,然后用回车来响应消息。
我很好奇构建这种通信状态机的最佳方法是什么我的问题是为UART端口设计回调函数,以便它。。。
不会挂起系统等待响应(某种超时)
如果响应读取得太快,它将把响应集中在一起
回车表示信息结束
基本理论是这样的:

//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));

这个想法有几个明显的缺陷我希望有人能分享一些关于这种交流方式的想法?
谢谢!

最佳答案

如果您打算阻塞等待消息的线程(使用可变大小的消息和一个CR作为分隔符),那么在描述设计时,会遇到一个直接的问题。
我认为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的情况下。

关于c - UART DMA Tx/Rx架构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13003971/

10-11 21:04