先设计一个FIFO的数据队列UART0SendBuf,然后在UART发送函数中如下操作。如你所看到的,UART0Putch发1个数据往队列里写1个数据,判断LSR的THRE位是否为1,即THR如果空则发送1个最先进入队列的数据到THR寄存器,该寄存器再写入硬件FIFO。在发送THRE中断中判断数据队列为空,非空则继续写数据到THR。
/******************************************************************************
** 函数名称: UART0Putch
** 功能描述: 发送一个字节数据
** 输 入: Data:发送的数据数据
** 输 出:无
** 全局变量: 无
** 调用模块: 无
******************************************************************************/
API void UART0Putch(IN uint8 Data)
{
uint8 temp;
QueueWrite((void *)UART0SendBuf, Data); // 数据入队
OS_ENTER_CRITICAL();
if ((U0LSR & 0x00000020) != 0)
{ // UART0发送保持寄存器空
QueueRead(&temp, UART0SendBuf); // 发送最初入队的数据
U0THR = temp;