第二十九章 串行通信

第二十九章 串行通信29.1. 简介29.2. 串行术语和硬件29.2.1. 串行电缆和端口29.2.2. 串口配置29.3. 终端29.3.1. 终端设置29.3.2. 连接故障排除29.4. 拨入服务29.4.1. 调制解调器设置29.4.2. 排错29.5. 拨出服务29.5.1. 使用Stock Hayes调制解调器29.5.2. 使用AT命令29.5.3. @符号不起作用29.5.4. 从命令行拨号29.5.5. 设置bps速率29.5.6. 通过终端服务器访问多个主机29.5.7. tip 使用多行29.5.8. 使用Force角色29.5.9. 大写字符29.5.10. 使用 tip 传输文件29.5.11. 将zmodem与 tip 结合使用?29.6. 设置串行控制台29.6.1. 快速串行控制台配置29.6.2. 深入串行控制台配置29.6.3. 设置更快的串行端口速度29.6.4. 从串行线进入DDB调试器

29.1. 简介

UNIX®一直支持串行通信,因为最早的UNIX®机器依赖串行线进行用户输入和输出。与普通终端由每秒10个字符的串行打印机和键盘组成的时代相比,情况发生了很大变化。本章介绍了在FreeBSD上使用串行通信的一些方法。

阅读本章以了解:

• 如何将终端连接到FreeBSD系统。 • 如何使用调制解调器拨出到远程主机。 • 如何允许远程用户使用调制解调器登录FreeBSD系统。 • 如何从串行控制台启动FreeBSD系统。

在阅读本章之前: • 知道如何配置和安装自定义内核。 • 了解FreeBSD的权限和流程。 • 可以访问FreeBSD使用的串行硬件的技术手册。

29.2. 串行术语和硬件

串行通信中经常使用以下术语:

当提及通信数据速率时,本节不使用术语 baud(波特)。Baud是指在一段时间内进行的电气状态转换的次数,而 bps 是正确的术语。

要将串行终端连接到FreeBSD系统,需要计算机上的串行端口和连接到串行设备的正确电缆。已经熟悉串行硬件和布线的用户可以安全地跳过本节。

29.2.1. 串行电缆和端口

有几种不同类型的串行电缆。最常见的两种类型是零调制解调器电缆和标准RS-232电缆。硬件文件应描述所需的电缆类型。

这两种类型的电缆在电线连接到连接器的方式上有所不同。每条线代表一个信号,定义的信号汇总在【表41. RS-232C信号名称】中。标准串行电缆直接传递所有RS-232C信号。例如,电缆一端的“传输数据”引脚连接到另一端的“发送数据”引脚。这是用于将调制解调器连接到FreeBSD系统的电缆类型,也适用于某些终端。

零调制解调器(null-modem)电缆将一端连接器的“传输数据”引脚与另一端的“接收数据”引脚切换。连接器可以是DB-25或DB-9。

零调制解调器电缆可以使用【表42. DB-25至DB-25零调制解调器电缆】、【表43. DB-9至DB-9零调制解调器电缆】和【表44. DB-9至DB-25零调制解调器电缆】中总结的引脚连接来构建。虽然标准要求使用直通引脚1到引脚1的“保护接地”线,但通常会被省略。一些端子仅使用引脚2、3和7工作,而另一些则需要不同的配置。如有疑问,请参阅硬件文档。

表41. RS232C信号名称

首字母缩写名称
RDReceived Data(接收数据)
TDTransmitted Data(发送数据)
DTRData Terminal Ready(数据终端就绪)
DSRData Set Ready(数据集就绪)
DCDData Carrier Detect(数据载体检测)
SGSignal Ground(信号地)
RTSRequest to Send(请求发送)
CTSClear to Send(清除以发送)

表42. DB-25至DB-25零调制解调器电缆

信号引脚号 引脚号信号
SG7连接至7SG
TD2连接至3RD
RD3连接至2TD
RTS4连接至5CTS
CTS5连接至4RTS
DTR20连接至6DSR
DTR20连接至8DCD
DSR6连接至20DTR
DCD8连接至20DTR

表43. DB-9至DB-9零调制解调器电缆

信号引脚号 引脚号信号
RD2连接至3TD
TD3连接至2RD
DTR4连接至6DSR
DTR4连接至1DCD
SG5连接至5SG
DSR6连接至4DTR
DCD1连接至4DTR
RTS7连接至8CTS
CTS8连接至7RTS

表44. DB-9至DB-25零调制解调器电缆

信号引脚号 引脚号信号
RD2连接至3TD
TD3连接至2RD
DTR4连接至6DSR
DTR4连接至8DCD
SG5连接至7SG
DSR6连接至20DTR
DCD1连接至20DTR
RTS7连接至5CTS
CTS8连接至4RTS

串行端口是FreeBSD主机和终端之间传输数据的设备。存在几种串行端口。在购买或建造电缆之前,请确保它适合终端和FreeBSD系统上的端口。

大多数终端都有DB-25端口。个人电脑可能有DB-25或DB-9端口。多端口串行卡可以具有RJ-12或RJ-45端口。有关端口类型的规格,请参阅硬件随附的文档,或目视验证端口类型。

在FreeBSD中,每个串行端口都是通过 /dev 中的一个条目访问的。有两种不同类型的条目:

FreeBSD还提供初始化设备(/dev/ttyuN.init/dev/cuauN.init/dev/cuadN.init )和锁定设备(/dev/ttyuN.lock/dev/cuauN.lock/dev/cuadN.lock )。初始化设备用于在每次打开端口时初始化通信端口参数,例如用于使用RTS/CTS信令进行流控制的调制解调器的 crtscts 。锁定装置用于锁定端口上的标志,以防止用户或程序更改某些参数。有关终端设置、锁定和初始化设备以及设置终端选项的信息,请分别参阅 termios(4)uart(4)stty(1)

29.2.2. 串口配置

默认情况下,FreeBSD支持四个串行端口,通常称为COM1、COM2、COM3和COM4。FreeBSD还支持哑多端口串行接口卡(dumb multi-port serial interface cards),如BocaBoard 1008和2016,以及更智能的多端口卡,如Digiboard制造的卡。但是,默认内核只查找标准COM端口。

要查看系统是否识别串行端口,请查找以 uart 开头的系统启动消息:

如果系统无法识别所有需要的串行端口,可以在 /boot/device.hints 中添加其他条目。此文件已包含COM1的 hint.uart.0.* 条目和COM2的 hint.uart.1.* 条目。为COM3添加端口条目时,使用 0x3E8 ,为COM4添加端口条目的时候,使用 0x2E8 。常见的IRQ地址是COM3的 5 和COM4的 9

要确定端口使用的默认终端I/O设置集,请指定其设备名称。此示例确定COM2上呼入端口的设置:

串行设备的系统范围初始化由 /etc/rc.d/serial 控制。此文件影响串行设备的默认设置。要更改设备的设置,请使用 stty 。默认情况下,更改的设置将一直有效,直到设备关闭,当设备重新打开时,它将恢复到默认设置。要永久更改默认设置,请打开并调整初始化设备的设置。例如,要为ttyu5打开 CLOCAL 模式、8位通信和 XON/XOFF 流控制,请键入:

为防止应用程序更改某些设置,请调整锁定装置。例如,要将ttyu5的速度锁定为57600 bps,请键入:

现在,任何打开ttyu5并试图更改端口速度的应用程序都将被限制在57600 bps。

29.3. 终端

终端提供了一种方便且低成本的方式,可以在不在计算机控制台或连接的网络上访问FreeBSD系统。本节介绍如何将终端与FreeBSD一起使用。

最初的UNIX®系统没有控制台。相反,用户通过连接到计算机串行端口的终端登录并运行程序。

在串行端口上建立登录会话的能力仍然存在于今天几乎所有类似UNIX®的操作系统中,包括FreeBSD。通过使用连接到未使用的串行端口的终端,用户可以登录并运行任何通常可以在控制台或xterm窗口中运行的文本程序。

许多终端可以连接到FreeBSD系统。旧的备用计算机可以用作连接到运行FreeBSD的更强大计算机的终端。这可以将原本可能是单用户计算机的东西变成一个强大的多用户系统。

FreeBSD支持三种类型的终端:

29.3.1. 终端设置

本节介绍如何配置FreeBSD系统以在串行终端上启用登录会话。它假设系统识别终端连接的串行端口,并且终端连接了正确的电缆。

在FreeBSD中,init 读取 /etc/ttys 并在可用终端上启动 getty 进程。getty 进程负责读取登录名并启动 login 程序。FreeBSD系统上允许登录的端口列在 /etc/ttys 中。例如,第一个虚拟控制台 ttyv0 在此文件中有一个条目,允许在控制台上登录。此文件还包含其他虚拟控制台、串行端口和伪tty(pseudo-ttys)的条目。对于硬连线终端,串行端口的 /dev 条目列出时没有 /dev 部分。例如,/dev/ttyv0 被列为 ttyv0

默认的 /etc/ttys 配置了对前四个串行端口 ttyu0ttyu3 的支持:

将终端连接到其中一个端口时,修改默认条目以设置所需的速度和终端类型,打开设备,并在需要时更改端口的安全设置。如果终端连接到另一个端口,请为该端口添加一个条目。

【示例:配置终端条目】在 /etc/ttys 中配置两个终端。第一个条目配置了连接到COM2的Wyse-50。第二项配置运行模拟VT-100终端的Procomm终端软件的旧计算机。计算机连接到多端口串行卡上的第六个串行端口。

示例:配置终端条目

在对 /etc/ttys 进行任何更改后,向 init 进程发送SIGHUP(hangup)信号,迫使它重新读取其配置文件:

由于 init 始终是系统上运行的第一个进程,因此它的进程ID始终为 1

如果一切设置正确,所有电缆都已就位,终端已通电,那么现在每个终端上都应该运行 getty 进程,并且每个终端上应该都有登录提示。

29.3.2. 连接故障排除

即使对细节进行了最细致的关注,在设置终端时仍然可能会出现问题。以下是常见症状列表和一些建议的修复方法。

29.4. 拨入服务

为拨入服务配置FreeBSD系统类似于配置终端,除了使用调制解调器而不是终端设备。FreeBSD支持外部和内部调制解调器。

外部调制解调器更方便,因为它们通常可以通过存储在非易失性RAM中的参数进行配置,并且它们通常提供指示灯,显示重要RS-232信号的状态,指示调制解调器是否正常工作。 内部调制解调器通常缺少非易失性RAM,因此其配置可能仅限于设置DIP开关。如果内部调制解调器有任何信号指示灯,当系统盖就位时,很难看到它们。

使用外部调制解调器时,需要合适的电缆。标准RS-232C串行电缆就足够了。

FreeBSD需要RTS和CTS信号以2400 bps以上的速度进行流量控制,CD信号用于检测呼叫何时被应答或线路何时被挂断,DTR信号用于在会话完成后重置调制解调器。有些电缆没有连接所有所需的信号,因此如果线路挂断时登录会话没有消失,则电缆可能有问题。有关这些信号的更多信息,请参阅【29.2.1. 串行电缆和端口】。

与其他类UNIX®操作系统一样,FreeBSD使用硬件信号来确定何时应答了呼叫或挂断了线路,并在呼叫后挂断和重置调制解调器。

FreeBSD避免向调制解调器发送命令或监视调制解调器的状态报告。FreeBSD支持基于NS8250、NS16450、NS16550和NS16550A的RS-232C(CCITT V.24)通信接口。8250和16450设备具有单字符缓冲区。16550设备提供了一个16个字符的缓冲区,可以提高系统性能。普通16550设备中的错误会阻止使用16个字符的缓冲区,因此如果可能的话,请使用16550A设备。由于单字符缓冲设备比16字符缓冲设备需要更多的操作系统工作,因此首选基于16550A的串行接口卡。如果系统有许多活动串行端口或负载很重,基于16550A的卡更适合低错误率通信。

本节的其余部分将演示如何配置调制解调器以接收传入连接,如何与调制解调器通信,并提供一些故障排除提示。

29.4.1. 调制解调器设置

与终端一样,init 为用于拨入连接的每个配置的串行端口生成一个 getty 进程。当用户拨打调制解调器的线路并且调制解调器连接时,调制解调器会报告“Carrier Detect(载波检测)”信号。内核注意到已检测到载体,并指示 getty 打开端口,以指定的初始行速显示 login: 提示符。在典型的配置中,如果收到垃圾字符,通常是由于调制解调器的连接速度与配置的速度不同,getty 会尝试调整线路速度,直到收到合理的字符。在用户输入登录名后, getty 执行 login ,通过询问用户的密码并启动用户的shell来完成登录过程。

关于拨号调制解调器有两种思想流派。+

当将调制解调器的数据通信速率锁定在特定速度时,不需要更改 /etc/gettytab 。然而,对于匹配的速度配置,可能需要额外的条目来定义调制解调器使用的速度。此示例使用8位无奇偶校验连接配置了一个最高接口速度为19.2 Kbps的14.4 Kbps调制解调器。它配置 getty 以19.2 Kbps的速度启动V.32bis连接的通信速率,然后循环9600 bps、2400 bps、1200 bps、300 bps,最后回到19.2 Kbps。通信速率循环是通过 nx= (next table)功能实现的。每行使用 tc= (table continuation)条目来获取特定数据速率的其余设置。

对于28.8 Kbps调制解调器,或要利用14.4 Kbps调制解调器上的压缩,请使用更高的通信速率,如本例所示:

对于速度较慢的CPU或没有基于16550A的串行端口的负载过重的系统,这种配置可能会在57.6 Kbps的速度下产生 uart “silo(筒仓)”错误。

/etc/ttys 的配置类似于【示例40. 配置终端条目】,但传递给 getty 的参数不同,dialup 用于终端类型。将xxx替换为 init 将在设备上运行的进程:

dialup 终端类型可以更改。例如,将 vt102 设置为默认终端类型允许用户在其远程系统上使用VT102仿真。

对于锁定速度配置,请使用 /etc/gettytab 中列出的有效类型指定速度。此示例适用于端口速度锁定在19.2Kbps的调制解调器:

在匹配的速度配置中,条目需要引用 /etc/gettytab 中相应的起始“autobaud”条目。要继续以19.2 Kbps开始的匹配速度调制解调器的示例,请使用以下条目:

编辑 /etc/ttys 后,等待调制解调器正确配置和连接,然后再发送 init 信号:

高速调制解调器,如V.32、V.32bis和V.34调制解调器,使用硬件(RTS/CTS)流控制。使用 stty 为调制解调器端口设置硬件流控制标志。此示例在COM2的拨入和拨出初始化设备上设置 crtscts 标志:

29.4.2. 排错

本节提供了一些提示,用于排除无法连接到FreeBSD系统的拨号调制解调器的故障。

29.5. 拨出服务

以下是让主机通过调制解调器连接到另一台计算机的提示。这适用于与远程主机建立终端会话。

如果使用PPP时出现问题,这种连接有助于在互联网上获取文件。如果PPP不起作用,请使用终端会话通过FTP传输所需的文件。然后使用zmodem将其转移到机器上。

29.5.1. 使用Stock Hayes调制解调器

tip 内置了一个通用的Hayes拨号器。在 /etc/remote 中使用 at=hayes

Hayes驱动程序不够聪明,无法识别较新调制解调器消息的一些高级功能,如 BUSYNO DIALTONEConnect 115200 。在 ATX0&W 中使用 tip 时关闭这些消息。

tip 的拨号超时为60秒。调制解调器应该少用一些东西,否则 tip 会认为有通信问题。尝试 ATS7=45&W

29.5.2. 使用AT命令

/etc/remote 中创建一个 direct 条目。例如,如果调制解调器连接到第一个串行端口 /dev/cuau0 ,请使用以下行:

使用 br 功能中调制解调器支持的最高bps速率。然后,键入 tip cuau0 连接到调制解调器。

或者,使用 cu 作为 root ,并执行以下命令:

line 是串行端口,如 /dev/cuau0speed 是速度,如 57600 。输入完AT命令后,键入 ~. 退出。

29.5.3. @符号不起作用

@ 符号在电话号码功能中告诉 tip/etc/phones 中查找电话号码。但是,@ 符号也是 /etc/remote 等功能文件中的一个特殊字符,因此需要用反斜杠转义:

29.5.4. 从命令行拨号

/etc/remote 中输入一个 generic 条目。例如:

现在,这.应该奏效了:

喜欢 cu 而不是 tip 的用户可以使用通用 cu 条目:

然后输入:

29.5.5. 设置bps速率

输入 tip1200cu1200 的条目,但请继续使用 br 功能适用的任何bps速率。tip 认为一个好的默认值是1200 bps,这就是它寻找 tip1200 条目的原因。不过,不必使用1200 bps。

29.5.6. 通过终端服务器访问多个主机

与其每次都等到连接并键入 CONNECT host ,不如使用 tipcm 功能。例如, /etc/remote 中的这些条目允许输入 tip paintip muffin 连接到主机 painmuffin ,并输入 tip deep13 连接到终端服务器。

29.5.7. tip 使用多行

当一所大学有几条调制解调器线路和数千名学生试图使用它们时,这通常是一个问题。

/etc/remote 中输入一个条目,并使用 @ 表示 pn 功能:

然后,在 /etc/phones 中列出电话号码:

tip 会按照列出的顺序尝试每个数字,然后放弃。要继续重试,请在 while 循环中运行tip

29.5.8. 使用Force角色

Ctrl+P 是默认的“force”字符,用于告诉 tip 下一个字符是文字数据。强制字符可以通过 ~s 转义设置为任何其他字符,这意味着“set a variable”。

键入~sforce=single-char ,后跟换行符。 single-char 是任何单个字符。如果省略了 single-char ,则强制字符是空字符,可以通过键入 Ctrl+2Ctrl+Space 来访问。single-char 的一个很好的值是 Shift+Ctrl+6 ,它仅在某些终端服务器上使用。

要更改force字符,请在 ~/.tiprc 中指定以下内容:

29.5.9. 大写字符

当按下 Ctrl+A 时,就会发生这种情况,这是 tip 的“raise character”,专为 caps-lock 键断裂的人设计。使用 ~sraisechar 设置为合理的值。如果两个特征都不使用,则可以将其设置为与强制角色相同。

这是一个示例 ~/.tiprc ,适用于需要键入 Ctrl+2Ctrl+a 的Emacs用户:

^^Shift+Ctrl+6

29.5.10. 使用 tip 传输文件

当与另一个类UNIX®操作系统通信时,可以使用 ~p(put)和 ~t(take)发送和接收文件。这些命令在远程系统上运行 catecho 以接受和发送文件。语法为:

~p local-file [remote-file] ~t remote-file [local-file]

没有错误检查,因此可能应该使用另一种协议,如zmodem。

29.5.11. 将zmodem与 tip 结合使用?

要接收文件,请在远程端启动发送程序。然后,键入 ~C rz 开始在本地接收它们。

要发送文件,请启动远程端的接收程序。然后,键入 ~C sz 文件将其发送到远程系统。

29.6. 设置串行控制台

FreeBSD能够将串行端口上的哑终端作为控制台引导系统。此配置对于希望在没有连接键盘或显示器的机器上安装FreeBSD的系统管理员以及希望调试内核或设备驱动程序的开发人员非常有用。

如【15. FreeBSD引导过程】中所述,FreeBSD采用三阶段引导。前两个阶段位于引导块代码中,该代码存储在引导磁盘上FreeBSD切片的开头。然后,引导块加载并运行引导加载程序作为第三阶段代码。

为了设置从串行控制台引导,需要配置引导块代码、引导加载程序代码和内核。

29.6.1. 快速串行控制台配置

本节提供了设置串行控制台的快速概述。当哑终端连接到COM1时,可以使用此过程。

步骤:在COM1上配置串行控制台

  1. 将串行电缆连接到COM1和控制端子。

  2. 要配置启动消息以在串行控制台上显示,请以超级用户身份发出以下命令:

  3. 编辑 /etc/ttys ,将 off 更改为 on ,然后 dialupvt100 获取ttyu0条目。否则,通过串行控制台连接将不需要密码,从而导致潜在的安全漏洞。

  4. 重新启动系统,查看更改是否生效。

如果需要不同的配置,请参阅下一节以获取更深入的配置说明。

29.6.2. 深入串行控制台配置

本节更详细地解释了在FreeBSD中设置串行控制台所需的步骤。

步骤:配置串行控制台

  1. 准备一根串行电缆。 使用零调制解调器电缆或标准串行电缆和零调制解调器适配器。有关串行电缆的讨论,请参阅【29.2.1. 串行电缆和端口】。

  2. 拔下键盘。

    许多系统在开机自检(Power-On Self-Test,POST)期间探测键盘,如果未检测到键盘,则会产生错误。有些机器在键盘插入之前会拒绝启动。

    如果计算机抱怨错误,但仍然启动,则不需要进一步配置。

    如果计算机在未连接键盘的情况下拒绝启动,请配置BIOS,使其忽略此错误。有关如何执行此操作的详细信息,请参阅主板手册。

    如果系统有PS/2®鼠标,请将其拔下。PS/2®鼠标与键盘共享一些硬件,将鼠标插上可能会欺骗键盘探头,使其认为键盘仍然存在。

  3. 将哑终端、带有调制解调器程序的旧计算机或另一个UNIX®机器上的串行端口插入串行端口。

  4. /boot/device.hints 中为串行端口添加适当的 hint.uart.* 条目。一些多端口卡还需要内核配置选项。有关每个支持的串行端口的所需选项和设备提示,请参阅 uart(4)

  5. 在启动驱动器上分区的根目录中创建 boot.config

    此文件指示引导块代码如何引导系统。为了激活串行控制台,需要以下一个或多个选项。使用多个选项时,将它们全部包含在同一行中:

    • -h

      在内部控制台和串行控制台之间切换。使用此功能切换控制台设备。例如,要从内部(视频)控制台启动,请使用 -h 命令引导加载程序和内核将串行端口用作其控制台设备。或者,要从串行端口启动,请使用-h告诉引导加载程序和内核将视频显示器用作控制台。

    • -D

      在单控制台和双控制台配置之间切换。在单配置中,控制台将是内部控制台(视频显示器)或串行端口,具体取决于 -h 的状态。在双控制台配置中,视频显示器和串行端口将同时成为控制台,而与 -h 状态无关。但是,双控制台配置仅在引导块运行时生效。一旦引导加载程序获得控制权,由 -h 指定的控制台将成为唯一的控制台。

    • -P

      使启动块探测键盘。如果没有找到键盘,将自动设置 -D-h 选项。

      使用 -P 自动选择控制台,或使用 -h 激活串行控制台。有关更多详细信息,请参阅 boot(8)boot.config(5)

      -P 之外的选项都传递给引导加载程序。引导加载程序将通过检查 -h 的状态来确定是内部视频还是串行端口应成为控制台。这意味着,如果在 /boot.config 中指定了 -D ,但未指定 -h ,则串行端口只能在引导块期间用作控制台,因为引导加载程序器将使用内部视频显示器作为控制台。

  6. 启动机器。

    当FreeBSD启动时,引导块会将 /boot.config 的内容回显到控制台。例如:

    第二行仅在 -P 位于 /boot.config 中时出现,表示键盘是否存在。根据 /boot.config 中的选项,这些消息会发送到串行控制台或内部控制台,或两者都发送:

    选项消息转到
    none内部控制台
    -h串行控制台
    -D串行和内部控制台
    -Dh串行和内部控制台
    -P,键盘存在内部控制台
    -P,键盘缺失串行控制台

    消息发出后,在引导块继续加载引导加载程序之前以及在将任何进一步的消息打印到控制台之前,将有一个小的暂停。在正常情况下,不需要中断引导块,但可以这样做以确保设置正确。

    按控制台上除 Enter 以外的任何键中断启动过程。然后,引导块将提示采取进一步行动:

    根据 /boot.config 中的选项,验证上述消息是否出现在串行或内部控制台上,或同时出现在两者上。如果消息出现在正确的控制台中,请按 Enter 键继续启动过程。

    如果串行终端上没有提示,则设置有问题。输入 -h ,然后输入 EnterReturn ,告诉引导块(然后是引导加载程序和内核)为控制台选择串行端口。系统启动后,返回并检查出了什么问题。

在引导过程的第三阶段,仍然可以通过在引导加载程序中设置适当的环境变量在内部控制台和串行控制台之间切换。有关更多信息,请参阅 loader(8)

29.6.3. 设置更快的串行端口速度

默认情况下,串行端口设置为115200波特、8位、无奇偶校验和1个停止位。要更改默认控制台速度,请使用以下选项之一:

29.6.4. 从串行线进入DDB调试器

要配置从串行控制台进入内核调试器的能力,请将以下选项添加到自定义内核配置文件中,并使用【10. 配置FreeBSD内核中】的说明编译内核。请注意,虽然这对远程诊断很有用,但如果在串行端口上生成虚假的BREAK,这也是危险的。有关内核调试器的更多信息,请参阅 ddb(4)ddb(8)