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 |
# 查看所有串口设备的基本信息
sudo setserial -b
# 查看所有串口设备的详细信息
sudo setserial -a
# 查看指定串口(如ttyS0)的配置
sudo setserial /dev/ttyS0 -a
# 以脚本友好格式输出
sudo setserial /dev/ttyS0 -G
# 设置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
# 设置正常速度模式
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
# 检查串口是否存在
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
# 保存当前串口配置到文件
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)。
通用异步收发器芯片类型,如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"
stty终端参数设置
screen串口终端模拟器
minicom串口通信程序
cu呼叫另一个Unix系统