A.1. Linux 内核中的流控制

可以要求 Linux 内核使用 CTS/RTS 流控制,通过r选项在console=参数中。例如,一个波特率为 9600bps、8 个数据位、无奇偶校验且采用 CTS/RTS 流控制的串行链路配置如图 A-1 所示。

图 A-1. 一个内核console参数,采用 CTS/RTS 流控制

console=9600n8r

因为 Linux 内核只发送数据,CTS/RTS 流控制的实现方式是检查 Clear to Send (CTS) 信号是否未被置位。实现此功能的代码位于/usr/src/linux/drivers/char/serial.c,相关部分见图 A-2

图 A-2. 用于控制台 CTS/RTS 流控制的内核源代码

static inline void wait_for_xmitr(struct async_struct *info)
{
…
  /* Wait for flow control if necessary */
  if (info->flags & ASYNC_CONS_FLOW) {
    tmout = 1000000;
    while (--tmout &&
           ((serial_in(info, UART_MSR) & UART_MSR_CTS) == 0));
  }       
}

tmout值为 1000000 驱动的循环会导致等待约一秒钟,直到 CTS 线路被置位。

此代码忽略了 RS-232 数据集就绪 (Data Set Ready) 和数据载波检测 (Data Carrier Detect) 状态线的状态。这会产生一些后果。

由于这些错误,本 HOWTO 不再建议使用内核级流控制。作者有一个内核补丁,修复了所有当前报告的错误,并正在尝试将该补丁集成到主线内核中。一旦内核错误得到纠正,本 HOWTO 将再次建议使用内核级流控制。