FreeBSD 使用手册
上一页 | 第26章 　串口通讯 | 下一页

# 26.2 介绍

> 警告: 从 FreeBSD 8.0 开始， 用于串口的设备节点从 `/dev/cuad`N`` 改为了 `/dev/cuau`N``； 从 `/dev/ttyd`N`` 改为了 `/dev/ttyu`N``。 FreeBSD 7.X 用户需要根据实际情况对这份文档中的例子进行必要的调整。

## 26.2.1 术语

bps

  每秒位── 数据的传输速度

DTE

  数据终端设备 ── 如您的计算机

DCE

  数据通讯设备 ── 如您的modem

RS-232

  用于硬件串口通讯的EIA标准

当讨论通讯数据速度的时候，这节不会使用术语 “baud”。Baud指电气标准传输率，它已经使用了很长时间， 而 “bps” (bits per second) 才是正确使用的术语 (至少它不会打扰那些爱争吵的家伙)。

## 26.2.2 线缆和端口

要将 modem 或终端与您的 FreeBSD 系统相连， 您的计算机需要一个串口， 以及用于连接串口设备所需的线缆。 如果您比较熟悉硬件及所需要的电缆， 则可以跳过这节。

### 26.2.2.1 线缆

串口线缆有许多不同的种类。 最常见的两种类型是 null-modem 线缆和标准 (“直联”) RS-232 线缆。 您的硬件说明书中会介绍应使用的线缆种类。

#### 26.2.2.1.1 Null-modem线缆

null-modem 电缆会直接传送某些信号， 如 “Signal Ground” (信号地)， 但对其他信号进行交换。 例如， “Transmitted Data” (数据发送) 引脚是连到另一端 “Received Data” (数据接收) 引脚的。

也可以自行制作 null-modem 电缆给终端使用 (例如， 为了品质的要求)。 下面的表格展示了 RS-232C 信号， 以及 DB-25 连接器上的引脚。 注意， 标准也要求一根直通引脚 1 到引脚 1 的 保护地 (Protective Ground) 线， 但这通常都被省掉。 某些终端在只有引脚 2、 3 和 7 的时候， 就已经能够正常使用了， 而其他一些， 则需要下面例子中所展示的不同的配置。

表 26-1. DB-25 to DB-25 Null-Modem Cable

信号 | 引脚 # |  | 引脚 # | 信号
--- | --- | --- | --- | ---
SG | 7 | 连接到 | 7 | SG
TD | 2 | 连接到 | 3 | RD
RD | 3 | 连接到 | 2 | TD
RTS | 4 | 连接到 | 5 | CTS
CTS | 5 | 连接到 | 4 | RTS
DTR | 20 | 连接到 | 6 | DSR
DTR | 20 | 连接到 | 8 | DCD
DSR | 6 | 连接到 | 20 | DTR
DCD | 8 | 连接到 | 20 | DTR

这里还有两种目前比较流行的其他接线方式。

表 26-2. DB-9 到 DB-9 Null-Modem 电缆

信号 | 引脚 # |  | 引脚 # | 信号
--- | --- | --- | --- | ---
RD | 2 | 接到 | 3 | TD
TD | 3 | 接到 | 2 | RD
DTR | 4 | 接到 | 6 | DSR
DTR | 4 | 接到 | 1 | DCD
SG | 5 | 接到 | 5 | SG
DSR | 6 | 接到 | 4 | DTR
DCD | 1 | 接到 | 4 | DTR
RTS | 7 | 接到 | 8 | CTS
CTS | 8 | 接到 | 7 | RTS

表 26-3. DB-9 到 DB-25 Null-Modem 电缆

信号 | 引脚 # |  | 引脚 # | 信号
--- | --- | --- | --- | ---
RD | 2 | DB-9 到 DB-25 Null-Modem 电缆 | 2 | TD
TD | 3 | 接到 | 3 | RD
DTR | 4 | 接到 | 6 | DSR
DTR | 4 | 接到 | 8 | DCD
SG | 5 | 接到 | 7 | SG
DSR | 6 | 接到 | 20 | DTR
DCD | 1 | 接到 | 20 | DTR
RTS | 7 | 接到 | 5 | CTS
CTS | 8 | 接到 | 4 | RTS

> 注意: 当某一段连接器上的一个引脚需要连接到对端的一对引脚时， 通常是将那一对引脚使用一短线连接， 而使用长线接到另一端的那个引脚。

上面的设计似乎更为流行。 在其他变种中 (在 RS-232 Made Easy 这本书中进行了详细介绍) 则是 SG 接 SG， TD 接 RD、 RTS 和 CTS 接 DCD、 DTR 接 DSR， 反之亦然。

#### 26.2.2.1.2 标准RS-232C线缆

标准的串口电缆会直接传送所有 RS-232C 信号。 也就是说， 一头的 “Transmitted Data” 引脚， 会直接接到另一头的 “Transmitted Data” 引脚。 这包括将调制解调器接到您的 FreeBSD 系统上的那种电缆， 同样也适用于某些型号的终端。

### 26.2.2.2 端口

串口是FreeBSD主机与终端传输数据的设备。 这节描述了端口的种类和它们在 FreeBSD 上是如何编址的。

#### 26.2.2.2.1 端口的种类

有好几种串口。 在采购或制作线缆之前， 您应确认它能够适合您的终端以及 FreeBSD 系统。

绝大多数终端都提供 DB-25 端口。 个人计算机， 也包括运行 FreeBSD 的 PC 机， 通常会有 DB-25 或 DB-9 口。 如果您的 PC 上有多插口串口卡， 则可能有 RJ-12 或 RJ-45 口。

请参见您硬件的文档以了解所用接口的规格。 此外， 您也可以通过观察外观来了解所用的端口。

#### 26.2.2.2.2 端口名称Port Names

在FreeBSD中，您可以通过 `/dev` 目录中的一个记录来访问每个串口。有两种不同的记录：

- 呼入端口的名字是 `/dev/ttyu`N``， 其中 `N` 是端口的编号， 从零开始计数。 一般来说， 您使用呼入端口作为终端。 呼入端口要求数据线使用载波检测 (DCD) 信号来工作。

- 呼出端口的名字是 `/dev/cuau`N``。 通常并不使用呼出端口作为终端， 而只用于调制解调器。 如果串口线或终端不支持载波检测信号， 则可能必须要使用呼出端口。

如果您已经连接一个终端到第一个串口 (在 MS-DOS® 上是`COM1`)， 则可以使用 `/dev/ttyu0` 来作为终端。 如果它是在第二个串口 (`COM2`)， 那就是 `/dev/ttyu1`，等等。

## 26.2.3 内核配置

FreeBSD默认支持4个串口。 在MS-DOS下，这些是 `COM1`， `COM2`， `COM3`， 和 `COM4`。 FreeBSD 目前支持 “dumb” 多口串口卡，如 BocaBoard 1008 和 2016， 以及许多 Digiboard 和 Stallion Technologies 制造的智能多接口卡。 不过， 默认的内核只会寻找标准的COM端口。

要看看您的内核是否支持您的串口，只要在内核启动时查看一下启动信息， 或使用 `/sbin/dmesg` 命令重新检测内核启动信息。 特别的，寻找以`sio`字符启动的信息。

> 提示: 如果想只察看包含 `sio` 一词的消息， 可以使用下面的命令：

>     # /sbin/dmesg | grep 'sio'

例如，在一个带有4个串口的系统上，这些是串口特定的内核启动信息：

    sio0 at 0x3f8-0x3ff irq 4 on isa
    sio0: type 16550A
    sio1 at 0x2f8-0x2ff irq 3 on isa
    sio1: type 16550A
    sio2 at 0x3e8-0x3ef irq 5 on isa
    sio2: type 16550A
    sio3 at 0x2e8-0x2ef irq 9 on isa
    sio3: type 16550A

如果内核未能认出所有的串口， 可能需要通过修改 `/boot/device.hints` 文件来进行一些配置。 此外， 也可以注释或完全删除掉您没有的设备。

请参见 sio(4) 联机手册来了解关于串口， 以及多插口卡配置的进一步细节。 如果您正使用一个在不同版本的 FreeBSD 上的文件请务必小心， 因为设备参数和语法发生了变化。

> 注意: 这里端口 `IO_COM1` 代替了 `0x3f8`，端口 `IO_COM2` 代替了 `0x2f8`，端口 `IO_COM3` 代替了 `0x3e8`，端口 `IO_COM4` 代替了 `0x2e8`，这些都是各自端口相应的端口地址。 中断4，3，5，9都是经常用的中断。也要注意有些正常的串口可能 无法 在一些ISA总线的PC上共享中断 (多插口板卡有板载的电子设备，允许在板上所有 16550A 的设备共享一个或两个中断请求)。

## 26.2.4 设备特殊文件

在内核中， 大多数设备都是通过 “设备特殊文件” 来访问的， 这些文件一般位于 `/dev` 目录中。 `sio` 是通过 `/dev/ttyu`N`` (呼入) 和 `/dev/cuau`N`` (呼出) 设备来访问的。 此外， FreeBSD 也提供了初始化设备 （`/dev/ttyu`N`.init` 和 `/dev/cuau`N`.init`） 以及锁设备 （`/dev/ttyu`N`.lock` 和 `/dev/cuau`N`.lock`）。 初始化设备用于在打开端口时初始化其通讯参数， 例如使用 `RTS/CTS` 信号进行流控制的调制解调器的 `crtscts`。 锁设备则用于在端口上提供一个锁标志， 防止用户或程序改变特定的参数； 请参见 termios(4)、 sio(4)， 以及 stty(1) 的联机手册， 以了解关于终端配置、 锁和初始化设备， 以及配置终端参数的详细信息。

## 26.2.5 串口配置

`ttyu`N`` (或 `cuau`N``) 设备是您将要打开的应用程序的一般设备。 当进程打开某个设备时， 它将有一个终端 I/O 设置的默认配置。 您可以在命令行看看这些设置：

    # stty -a -f /dev/ttyu1

当您修改了这个设备的设置，这个设置会生效，除非设备被关闭。 当它被重新打开时，它将回到默认设置。 要修改默认设置，您可以打开和调整 “初始状态” 设备的设置。例如， 要为`ttyu5` 打开 `CLOCAL` 模式，8位通讯和默认的 `XON/XOFF` 流控制， 输入：

    # stty -f /dev/ttyu5.init clocal cs8 ixon ixoff

串口设备的系统级初始化， 是由 `/etc/rc.d/serial` 来控制的。 这个文件会影响串口设备的默认设置。

为了防止应用程序修改某些设置， 应修改 “lock state”(锁状态) 设备。 例如， 要把 `ttyu5` 的速率锁定为 57600 bps， 输入：

    # stty -f /dev/ttyu5.lock 57600

现在，一个打开`ttyu5` 和设法改变端口速度的应用程序将被固定在57600bit/s。很自然地， 您需要确定初始状态，然后用root帐户锁定状态设备的写入功能。

很显然，您应该只让 `root` 用户可以初始化或锁定设备的状态。

上一页 | 起始页 | 下一页
串口通讯 | 上一级 | 终端

本文档和其它文档可从这里下载：ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题，请先阅读文档，如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.