Linux setserial 命令详解

简介: setserial 命令用于配置串口(串行端口)设备参数,包括端口地址、中断请求(IRQ)、传输速率等硬件相关设置。

命令概述

setserial 是一个用于配置 Linux 系统中串行端口参数的工具。它可以设置和查询串口设备的硬件参数,主要用于老式硬件或需要特殊配置的场景。

串口基础知识

串口(COM端口)是用于串行通信的物理接口,常用于调制解调器、串行鼠标、控制台连接等设备。

主要应用场景
  • 配置老式串行设备
  • 嵌入式系统开发
  • 工业控制系统
  • 调试串口通信问题

语法格式

setserial [选项] 设备 [参数]

常见形式:

  • setserial 设备 - 显示指定串口的当前配置
  • setserial 设备 参数=值 - 设置串口参数
  • setserial -b - 显示所有串口的基本信息

常用选项

选项 说明
-a 显示所有详细信息
-b 显示基本信息(设备、端口地址、IRQ)
-g 显示串口配置信息(默认)
-G 以适合脚本使用的格式显示
-q 安静模式,不显示警告
-v 详细模式,显示更多信息
-V 显示版本信息
-W 等待设备可写

常用配置参数

参数 说明 示例值
port 端口 I/O 地址 0x3F8, 0x2F8
irq 中断请求号 4, 3
uart UART 类型 16550A, 8250
baud_base 基准波特率 115200
divisor 时钟分频器 1, 2
spd_normal 设置正常速度 spd_normal
spd_hi 设置高速模式 spd_hi
spd_vhi 设置超高速模式 spd_vhi
skip_test 跳过自动检测 skip_test
auto_irq 自动检测IRQ auto_irq
session_lockout 会话锁定 on, off
hup_notify 挂断通知 on, off

使用示例

示例1:查看串口配置信息

# 查看所有串口设备的基本信息
sudo setserial -b

# 查看所有串口设备的详细信息
sudo setserial -a

# 查看指定串口(如ttyS0)的配置
sudo setserial /dev/ttyS0 -a

# 以脚本友好格式输出
sudo setserial /dev/ttyS0 -G

示例2:设置串口参数

# 设置ttyS0的端口地址和IRQ
sudo setserial /dev/ttyS0 port 0x3F8 irq 4

# 设置UART类型
sudo setserial /dev/ttyS0 uart 16550A

# 设置基准波特率
sudo setserial /dev/ttyS0 baud_base 115200

# 同时设置多个参数
sudo setserial /dev/ttyS0 port 0x3F8 irq 4 uart 16550A baud_base 115200

示例3:配置串口速度

# 设置正常速度模式
sudo setserial /dev/ttyS0 spd_normal

# 设置高速模式
sudo setserial /dev/ttyS0 spd_hi

# 设置超高速模式
sudo setserial /dev/ttyS0 spd_vhi

# 设置特定波特率(需要结合其他命令)
sudo setserial /dev/ttyS0 baud_base 115200 divisor 2
# 然后使用stty设置实际波特率
sudo stty -F /dev/ttyS0 57600

示例4:串口故障排除

# 检查串口是否存在
sudo setserial /dev/ttyS0

# 如果显示"unknown"或"not detected",可能需要强制设置
sudo setserial /dev/ttyS0 port 0x3F8 irq 4 uart 16550A

# 跳过自动检测
sudo setserial /dev/ttyS0 skip_test

# 自动检测IRQ
sudo setserial /dev/ttyS0 auto_irq

# 测试串口是否工作(使用echo命令)
echo "test" | sudo tee /dev/ttyS0

示例5:保存和恢复配置

# 保存当前串口配置到文件
sudo setserial -g /dev/ttyS0 > ttyS0_config.txt

# 查看保存的配置
cat ttyS0_config.txt

# 从文件恢复配置(需要解析并执行)
# 注意:setserial没有直接读取文件的选项
# 但可以通过脚本实现
sudo bash -c "$(cat ttyS0_config.txt | sed 's/^/setserial /g')"

# 或者创建恢复脚本
echo "#!/bin/bash" > restore_serial.sh
echo "setserial /dev/ttyS0 $(grep -o 'uart=[^ ]*' ttyS0_config.txt)" >> restore_serial.sh
chmod +x restore_serial.sh
sudo ./restore_serial.sh

串口设备文件

设备文件 说明 传统对应
/dev/ttyS0 第一个串口(COM1) COM1
/dev/ttyS1 第二个串口(COM2) COM2
/dev/ttyS2 第三个串口(COM3) COM3
/dev/ttyS3 第四个串口(COM4) COM4
/dev/ttyUSB0 第一个USB转串口设备 -
/dev/ttyAMA0 Raspberry Pi的串口 -
/dev/console 系统控制台(可能是串口) -

串口通信参数详解

波特率

数据传输速率,单位bps(位/秒)。常见值:9600, 19200, 38400, 57600, 115200。

停止位

每个字符后的停止位数,通常为1、1.5或2位。用于表示字符结束。

校验位

错误检测机制,包括:无校验(N)、奇校验(O)、偶校验(E)、标记(M)、空格(S)。

数据位

每个字符的数据位数,通常为5、6、7或8位。8位是最常见的。

流控制

控制数据流以避免缓冲区溢出,包括硬件流控(RTS/CTS)和软件流控(XON/XOFF)。

UART类型

通用异步收发器芯片类型,如8250、16450、16550A等,影响缓冲区和性能。

常见问题与故障排除

排查步骤:

# 1. 检查串口设备文件是否存在
ls -l /dev/ttyS*

# 2. 检查内核是否识别串口
dmesg | grep tty

# 3. 检查串口硬件连接
# 确保电缆连接正确,设备通电

# 4. 检查BIOS/UEFI设置
# 确保串口在BIOS中已启用

# 5. 强制设置串口参数
sudo setserial /dev/ttyS0 port 0x3F8 irq 4 uart 16550A

排查步骤:

# 1. 检查串口配置是否匹配
sudo setserial -a /dev/ttyS0
sudo stty -F /dev/ttyS0 -a

# 2. 检查权限
ls -l /dev/ttyS0
# 确保用户有读写权限,或使用sudo

# 3. 测试基本通信
# 在一个终端中监听
sudo cat /dev/ttyS0

# 在另一个终端中发送数据
echo "test" | sudo tee /dev/ttyS0

# 4. 检查硬件流控制设置
sudo setserial /dev/ttyS0 ^cts

解决方案:

# 1. 使用setserial设置基准波特率
sudo setserial /dev/ttyS0 baud_base 115200

# 2. 使用stty设置实际波特率
sudo stty -F /dev/ttyS0 9600

# 3. 验证设置
sudo stty -F /dev/ttyS0 -a | grep speed

# 4. 对于特殊波特率,可能需要设置divisor
# 波特率 = baud_base / divisor
# 例如:baud_base=115200, divisor=12 得到 9600波特率
sudo setserial /dev/ttyS0 baud_base 115200 divisor 12

现代替代工具

在现代Linux系统中,许多串口配置可以通过其他工具完成:

stty

设置终端参数,包括波特率、数据位、停止位等。

# 设置波特率
stty -F /dev/ttyS0 115200

# 设置数据格式
stty -F /dev/ttyS0 cs8 -cstopb -parenb
udev

设备管理器,可以配置串口设备的权限和符号链接。

# udev规则示例
# /etc/udev/rules.d/99-serial.rules
KERNEL=="ttyUSB0", MODE="0666", SYMLINK+="gps"

注意事项

  1. 权限要求: 大多数 setserial 操作需要 root 权限
  2. 配置持久性: setserial 的设置在重启后会丢失,需要添加到启动脚本中
  3. 硬件差异: 不同硬件的串口地址和IRQ可能不同,需根据实际情况调整
  4. 内核支持: 某些串口功能需要内核模块支持,确保相关模块已加载
  5. USB转串口: USB转串口设备通常使用 /dev/ttyUSB* 设备文件,配置方式可能不同
  6. 虚拟机环境: 在虚拟机中使用串口可能需要特殊配置和驱动

相关命令

stty

终端参数设置

screen

串口终端模拟器

minicom

串口通信程序

cu

呼叫另一个Unix系统