我已经阅读了很多关于UART的规范和代码,但是如果发送FIFO已满,我找不到有关如何通过软件接口查找的任何指示。 FIFO为空时有一个中断。然后我可以写至少N个字符,其中N是fifo大小。但是当我写完这N个字符时,其中一些已被发送。所以我实际上可以写出超过N个字符,但是没有FIFO完全中断。规格说,当fifo满时,芯片上的TXREADY引脚被反转。有没有办法通过软件找到它?线路状态寄存器位仅表示fifo不为空,这并不意味着它已满: 有人可以帮忙吗?我想写字符直到fifo满了......
答案 0 :(得分:1)
在我看来他们也忽略了这一点,但是大多数人都对这件事感到满意。通常的使用方法是获取中断,填充FIFO(通常与串行数据速率相比非常快),然后返回。
有一种情况,在我看来,你要求的东西可能很好......如果以轮询模式发送...你想发送10个字节,你的轮询显示FIFO不是空的,所以你无法知道你是否可以发送它们...要么你在那里等到它是空的,这会破坏FIFO的目的,或者你继续轮询其他东西,直到你回到检查FIFO空的,也许这会降低你的整体传输速度。猜猜这不是一种非常通常的操作方式,所以没有人担心它。
答案 1 :(得分:0)
16550D数据表说明如下:
发送器保持寄存器中断(02)在XMIT时发生 FIFO是空的;一旦变送器保持,它就会被清除 寄存器写入( 1到16个字符可写入XMIT 在服务此中断时使用FIFO )或读取IIR。
这意味着当线路状态寄存器寄存器(端口基址+5)指示发送器空状态(位5)时,发送FIFO完全为空,您最多可以向发送器保持寄存器写入16个字节(端口基址) + 0)。重要的是不要在发送器空位发生之间写入超过16个字节。
如果您不需要在收到IRQ时写入16个字节(或者看到发送器寄存器空位设置,如果轮询),您可以跟踪自写入以来您写入的字节数最后一个发送器空状态,或者,只是推迟写入更多字节,直到下一个发送器空状态。