这是一个将char输出到串行控制台的示例代码:
#define COM1 0x3F8 // base port address
#define COM_LSR 5 // In: Line Status Register
#define COM_LSR_TXRDY 0x20 // Transmit buffer avail
static void
serial_putc(int c)
{
int i;
for (i = 0;
!(inb(COM1 + COM_LSR) & COM_LSR_TXRDY) && i < 12800;
i++)
delay();
outb(COM1 + COM_TX, c);
}
以上代码循环检查串口是否可用,如果可用,则发送一个字符c
。但是,为什么选择的数字12800
而不是任何其他数字?
答案 0 :(得分:2)
串口设备支持的时钟速率,以每秒位数为单位。
答案 1 :(得分:2)
我非常怀疑这是波特率。这里似乎是轮询一个状态字来检查发送缓冲区何时可用(因此COM_LSR_TXRDY
,发送就绪)。如果是,它会发送一个char。 12800只是等待时间的限制。如果它不在这里,问题可能导致无限循环。 12800可能是任意的,低到足以在出现问题时快速结束,但足够高以至少等待一个发送周期(这里它取决于波特率,但12800不是波特率)。这段代码在10000或20000时可能完全正常。
答案 2 :(得分:0)