41.19 串口通信

Emacs 可以与串口进行通信。在交互使用时, M-x serial-term 会打开一个终端窗口。在 Lisp 程序中, make-serial-process 会创建一个进程对象。

串口可以在运行时配置,无需关闭再重新打开。 serial-process-configure 函数允许你修改波特率、数据位和其他参数。 在由 serial-term 创建的终端窗口中,你可以点击模式行进行配置。

串口连接由进程对象表示,其使用方式与子进程或网络进程类似。 你可以发送和接收数据,并配置串口。不过,串口进程对象没有进程 ID, 你也无法向其发送信号,并且其状态码与其他类型的进程不同。 对进程对象使用 delete-process 或对进程缓冲区使用 kill-buffer 会关闭连接,但不会影响连接到串口的设备。

对于表示串口连接的进程对象,process-type 函数会返回符号 serial

串口功能在 GNU/Linux、Unix 以及 MS Windows 系统上均可用。

Command: serial-term port speed &optional line-mode

在新缓冲区中为串口启动终端模拟器。 port 是要连接的串口名称。例如,在 Unix 上可以是 /dev/ttyS0。 在 MS Windows 上,可以是 COM1\\.\COM10 (在 Lisp 字符串中反斜杠要写双份)。

speed 是串口的波特率(比特每秒)。9600 是常用值。 该缓冲区会处于 Term 模式;相关命令可参见 Term Mode in The GNU Emacs Manual。 你可以在模式行菜单中修改速率和配置。 如果 line-modenil,则使用 term-line-mode; 否则使用 term-raw-mode

Function: make-serial-process &rest args

该函数创建一个进程和对应的缓冲区。参数以关键字/值对的形式指定。 以下是有意义的关键字列表,其中前两个(portspeed)为必填项:

:port port

串口名称。在 Unix 和 GNU 系统上,这是一个文件名,如 /dev/ttyS0。 在 Windows 上,可以是 COM1,对于大于 COM9 的端口可使用 \\.\COM10 (Lisp 字符串中反斜杠需双写)。

:speed speed

串口波特率,单位比特每秒。该函数会调用 serial-process-configure 处理速率; 更多细节参见该函数的后续说明。

:name name

进程名称。如果未指定 name,则使用 port 作为进程名。

:buffer buffer

与进程关联的缓冲区。取值可以是缓冲区对象或表示缓冲区名称的字符串。 进程输出会追加到该缓冲区末尾,除非你指定了输出流或过滤器函数来处理输出。 如果未指定 buffer,进程缓冲区名称取自 :name 关键字的值。

:coding coding

如果 coding 是一个符号,它指定该进程读写共用的编码系统。 如果 coding 是 cons (decoding . encoding), 则 decoding 用于读取,encoding 用于写入。 如果未指定,默认根据数据本身确定编码系统。

:noquery query-flag

将进程查询标志初始化为 query-flag。See 退出前询问确认。 未指定时该标志默认为 nil

:stop bool

如果 boolnil,进程以停止状态启动。 在停止状态下,串口进程不接收传入数据,但可以发送 outgoing 数据。 停止状态可由 continue-process 清除,由 stop-process 设置。

:filter filter

安装 filter 作为进程过滤器。

:sentinel sentinel

安装 sentinel 作为进程标记函数。

:plist plist

安装 plist 作为进程的初始属性列表。

:bytesize
:parity
:stopbits
:flowcontrol

这些参数由 make-serial-process 调用的 serial-process-configure 处理。

可通过 process-contact 函数获取原始参数列表(可能被后续配置修改)。

示例:

(make-serial-process :port "/dev/ttyS0" :speed 9600)
Function: serial-process-configure &rest args

该函数配置串口连接。参数以关键字/值对形式指定。 未给出的属性会从进程当前配置(可通过 process-contact 获取)重新初始化, 或设为合理的默认值。定义的参数如下:

:process process
:name name
:buffer buffer
:port port

可以使用其中任意一个参数来标识要配置的进程。 如果这些参数均未指定,则使用当前缓冲区的进程。

:speed speed

串口波特率,又称 波特率(baud rate)。取值可以是任意数字, 但大多数串口仅在 1200 到 115200 之间的少数固定值下工作,最常用的是 9600。 如果 speednil,函数会忽略其他所有参数且不配置串口。 这对某些特殊串口(如蓝牙转串口适配器)很有用,这类设备只能通过连接发送 AT 指令配置。 nil 仅对已通过 make-serial-processserial-term 打开的连接有效。

:bytesize bytesize

每个字节的位数,可为 7 或 8。如果未指定或为 nil,默认值为 8。

:parity parity

取值可为 nil(不使用校验位)、符号 odd(奇校验)或符号 even(偶校验)。 未指定时默认无校验。

:stopbits stopbits

终止每个字节传输的停止位位数。stopbits 可为 1 或 2。 未指定或为 nil 时默认值为 1。

:flowcontrol flowcontrol

该连接使用的流控类型,可为 nil(不使用流控)、 符号 hw(使用 RTS/CTS 硬件流控)或符号 sw(使用 XON/XOFF 软件流控)。 未指定时默认无流控。

在内部,make-serial-process 会调用 serial-process-configure 完成串口的初始配置。