4.5. 使用配置实用程序

现在让我们花一些时间看看两个最有用的串行设备配置实用程序:setserialstty

4.5.1. setserial 命令

内核会尽最大努力正确判断您的串行硬件是如何配置的,但是串行设备配置的多样性使得在实践中很难 100% 可靠地实现这种判断。一个很好的例子是我们之前谈到的内置调制解调器。它们使用的 UART 具有 16 字节的 FIFO 缓冲区,但对于内核设备驱动程序来说,它看起来像一个 16450 UART:除非我们明确告诉驱动程序这个端口是一个 16550 设备,否则内核将不会使用扩展缓冲区。另一个例子是允许在多个串行设备之间共享单个 IRQ 的哑 4 端口卡。我们可能需要明确告诉内核它应该使用哪个 IRQ 端口,以及 IRQ 可能是共享的。

创建 setserial 是为了在运行时配置串行驱动程序。setserial 命令最常在启动时从一个名为以下内容的脚本执行0setserial在某些发行版上,以及rc.serial在其他发行版上。此脚本负责初始化串行驱动程序,以适应机器中任何非标准或不寻常的串行硬件。

setserial 命令的通用语法是
setserial device [parameters]
其中 device 是串行设备之一,例如 ttyS0

setserial 命令有大量的参数。其中最常见的参数在表 4-1中描述。有关其余参数的信息,您应该参考 setserial 手册页。

表 4-1. setserial 命令行参数

参数描述
端口 端口号

指定串行设备的 I/O 端口地址。端口号应以十六进制表示法指定,例如,0x2f8.

irq 数字

指定串行设备正在使用的中断请求线。

uart uart_类型

指定串行设备的 UART 类型。常用值是16450, 16550等等。将此值设置为none将禁用此串行设备。

fourport

指定此参数指示内核串行驱动程序,此端口是 AST Fourport 卡的一个端口。

spd_hi

当进程请求 38.4 kbps 时,将 UART 编程为使用 57.6 kbps 的速度。

spd_vhi

当进程请求 38.4 kbps 时,将 UART 编程为使用 115 kbps 的速度。

spd_normal

当请求时,将 UART 编程为使用 38.4 kbps 的默认速度。此参数用于反转以下操作的效果spd_hispd_vhi在指定的串行设备上执行。

auto_irq

此参数将导致内核尝试自动确定指定设备的 IRQ。这种尝试可能不是完全可靠的,因此最好将其视为请求内核猜测 IRQ。如果您知道设备的 IRQ,则应指定它使用irq参数代替。

autoconfig

此参数必须与端口参数结合使用。当提供此参数时,setserial 指示内核尝试自动确定位于提供的端口地址的 UART 类型。如果auto_irq参数也提供,则内核也会尝试自动确定 IRQ。

skip_test

此参数指示内核在自动配置期间不要费心执行 UART 类型测试。当内核错误地检测到 UART 时,这是必要的。

一个典型且简单的rc用于在启动时配置串行端口的文件可能看起来像示例 4-1中所示的那样。大多数 Linux 发行版将包含比这更复杂一些的内容。

示例 4-1. rc.serial setserial 命令示例

# /etc/rc.serial - serial line configuration script.
#
# Configure serial devices
/sbin/setserial /dev/ttyS0 auto_irq skip_test autoconfig
/sbin/setserial /dev/ttyS1 auto_irq skip_test autoconfig
/sbin/setserial /dev/ttyS2 auto_irq skip_test autoconfig
/sbin/setserial /dev/ttyS3 auto_irq skip_test autoconfig
#
# Display serial device configuration
/sbin/setserial -bg /dev/ttyS*

-bg /dev/ttyS*最后一个命令中的参数将打印所有活动串行设备的硬件配置的整齐格式的摘要。输出将看起来像示例 4-2中所示的那样。

示例 4-2. setserial -bg /dev/ttyS 命令的输出

/dev/ttyS0 at 0x03f8 (irq = 4) is a 16550A
/dev/ttyS1 at 0x02f8 (irq = 3) is a 16550A

4.5.2. stty 命令

名称 stty 可能意味着“set tty”,但 stty 命令也可以用于显示终端的配置。也许比 setserial 更甚,stty 命令提供了令人眼花缭乱的特性,您可以配置。我们稍后将介绍其中最重要的特性。您可以在 stty 手册页中找到其余的描述。

stty 命令最常用于配置终端参数,例如字符是否会被回显,或者哪个键应该生成中断信号。我们之前解释过串行设备是 tty 设备,因此 stty 命令同样适用于它们。

对于串行设备,stty 更重要的用途之一是在设备上启用硬件握手。我们之前简要地谈到了硬件握手。串行设备的默认配置是禁用硬件握手。此设置允许“三线”串行电缆工作;它们不支持硬件握手的必要信号,如果默认启用硬件握手,它们将无法传输任何字符来更改它。

令人惊讶的是,某些串行通信程序不启用硬件握手,因此如果您的调制解调器支持硬件握手,您应该配置调制解调器以使用它(查看您的调制解调器手册以了解要使用的命令),并且还配置您的串行设备以使用它。stty 命令有一个crtscts标志,用于在设备上启用硬件握手;您需要使用此标志。该命令最好从rc.serial文件(或等效文件)在启动时使用类似于示例 4-3中所示的命令发出。

示例 4-3. rc.serial stty 命令示例

#
stty crtscts < /dev/ttyS0
stty crtscts < /dev/ttyS1
stty crtscts < /dev/ttyS2
stty crtscts < /dev/ttyS3
#

默认情况下,stty 命令作用于当前终端,但通过使用 shell 的输入重定向(“<”)功能,我们可以让 stty 操作任何 tty 设备。忘记您应该使用“<”还是“>”是一个常见的错误;现代版本的 stty 命令为此提供了更简洁的语法。要使用新语法,我们将重写我们的示例配置,使其看起来像示例 4-4中所示的那样。

示例 4-4. 使用现代语法的 rc.serial stty 命令示例

#
stty crtscts -F /dev/ttyS0
stty crtscts -F /dev/ttyS1
stty crtscts -F /dev/ttyS2
stty crtscts -F /dev/ttyS3
#

我们提到 stty 命令可以用于显示 tty 设备的终端配置参数。要显示 tty 设备上的所有活动设置,请使用

$ stty -a -F /dev/ttyS1

此命令的输出(如示例 4-5中所示)为您提供了该设备的所有标志的状态;带有前导减号的标志,如–crtscts,表示该标志已关闭。

示例 4-5. stty -a 命令的输出

speed 19200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; 
         eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
         werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon
        -ixoff -iuclc -ixany -imaxbel
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0
         bs0 vt0 ff0
-isig -icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop
         -echoprt echoctl echoke

这些标志中最重要的标志的描述在表 4-2中给出。通过将其提供给 stty 可以启用这些标志中的每一个,通过在 stty 前面加上 – 字符可以禁用它们。因此,要在ttyS0设备上禁用硬件握手,您将使用
$ stty -crtscts -F /dev/ttyS0

表 4-2. stty 标志,与配置串行设备最相关

标志描述
N

将线路速度设置为N比特每秒。

crtsdts

启用/禁用硬件握手。

ixon

启用/禁用 XON/XOFF 流控制。

clocal

启用/禁用调制解调器控制信号,例如 DTR/DTS 和 DCD。如果您使用的是“三线”串行电缆,这是必要的,因为它不提供这些信号。

cs5 cs6 cs7 cs8

分别将数据位设置为 5、6、7 或 8。

parodd

启用奇校验。禁用此标志启用偶校验。

parenb

启用奇偶校验。当此标志被否定时,不使用奇偶校验。

cstopb

启用每个字符使用两个停止位。当此标志被否定时,每个字符使用一个停止位。

echo

启用/禁用将接收到的字符回显给发送者。

下一个示例组合了其中一些标志并设置ttyS0设备为 19,200 bps,8 个数据位,无奇偶校验,以及禁用回显的硬件握手
$ stty 19200 cs8 -parenb crtscts -echo -F /dev/ttyS0