This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好,我想实现串口的单字节发送,就是当上位机有查询指令后,TM4C响应时单字节响应,当将一个字节的响应放到FIFO中发送时,使用ROM_UARTCharPutNonBlocking()这个函数将其发送到串口发送器上。关于判断一个字节是否全部已经从移位寄存器,包括停止位什么的,手册上有说:只有当发送FIFO为空,并且最后一个字符包括停止位已经从移位寄存器被发送时,Busy位失效。我想发送一个字节时,先判断当前FIFO是否为空,再判断Busy位是否无效,再进入发送。
(1)这个busy位是否可以使用UARTBusy函数来处理?
(2)我想请教下这个函数ROM_UARTCharPutNonBlocking()是使用FIFO发送字符,具体执行流程是什么?将字符发送到移位寄存器上,不等待其是否全部发完就返回吗?
(3)UART发送还有一种模式是不使用FIFO的,直接使用UARTCharput函数发送字符,那这个函数是将接受到的数据直接发送到移位寄存器上,每次发送字符前应该也是需要先判断Busy位是否无效?
(4)TM4C的UART手册上说的,好像是默认不启用FIFO的情况时单字节处理的,其实也是使用了FIFO,只是是单字节触发的,是这样的吗?上一个的UARTCharput其实也是说的使用了FIFO,但只是单字节触发的?单字节触发的话UART就要使用阻塞模式处理发送和接收,如果设置FIFO深度的话,UART便可使用不阻塞的方式处理了是吗?
有一些多,谢谢大家看完,给指点下。
关于UARTBusy您可以参考下面文档的30.2.2.6 UARTBusy
可以采用如下的方式:
while(UARTBusy(UART0_BASE));
2 在例程中的使用方式如下
//***************************************************************************** // // Send a string to the UART. // //***************************************************************************** void UARTSend(const uint8_t *pui8Buffer, uint32_t ui32Count) { // // Loop while there are more characters to send. // while(ui32Count--) { // // Write the next character to the UART. // ROM_UARTCharPutNonBlocking(UART0_BASE, *pui8Buffer++); } }
ROM_UARTCharPutNonBlocking的使用意味着,如果Tx FIFO中的字符串空间不足,则UARTSend函数将丢弃字符串中的字符。
具体您可以看一下 http://www.ti.com/lit/ds/symlink/tm4c1294ncpdt.pdf
16.3.8 FIFO Operation 以及 Figure 16-1. UART Module Block Diagram
3 是的
pei gong 说:我现在是这么处理的:查询长度20个字节,将一个字节放置到发送器后,系统跳出UARTSend函数去执行其他任务,等发送器一个字节内容发送完毕后系统再继续执行UARTsend函数发送第二个字节。
我对此有些不太理解。您现在是不想循环发送,而是
先发送1个字节---> 退出UART去执行其他任务---->继续UART任务
是上面的流程吗?
您是否可以给出相关代码?
pei gong 说:但系统同时会有多个串口任务,我想请教下,是否有多串口间一个字节发送的这种案例?
请问能否详细说明一下?谢谢
您现在是假设一共要发20个字节,对比两种方式的效率?
1 UART0 和 UART1交替发送
2 单独一个UART全部发送
所以您现在两个串口都是连到另外一个芯片的两个串口上?总共就需要发送20字节?
若是这样的话,单独一个UART全部发送会更好一些。 因为UART0 和 UART1交替发送的话,执行的语句会更多,反而会效率低