news 2026/4/25 8:18:23

Linux shell中设置串口参数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux shell中设置串口参数

Linux shell中设置串口参数

在Linux shell中,可以使用多种工具和命令来配置串口参数,主要包括sttysetserialioctl系统调用。

1.使用stty命令

stty是最常用的终端配置工具,可以设置串口参数。

基本语法

stty -F<设备文件><参数>

常用参数设置

设置波特率
# 设置波特率为115200stty -F /dev/ttyS0115200# 设置波特率为9600stty -F /dev/ttyUSB09600
设置数据位、停止位、校验位
# 8位数据位,1位停止位,无校验stty -F /dev/ttyS0 cs8 -cstopb -parenb# 7位数据位,1位停止位,偶校验stty -F /dev/ttyS0 cs7 -cstopb parenb -parodd# 7位数据位,2位停止位,奇校验stty -F /dev/ttyS0 cs7 cstopb parenb parodd
设置流控制
# 启用硬件流控制(RTS/CTS)stty -F /dev/ttyS0 crtscts# 禁用硬件流控制stty -F /dev/ttyS0 -crtscts# 启用软件流控制(XON/XOFF)stty -F /dev/ttyS0 ixon ixoff# 禁用软件流控制stty -F /dev/ttyS0 -ixon -ixoff
其他重要设置
# 设置原始模式(禁用所有处理)stty -F /dev/ttyS0 raw# 设置规范模式(启用行编辑)stty -F /dev/ttyS0 -raw# 禁用回显stty -F /dev/ttyS0 -echo# 启用回显stty -F /dev/ttyS0echo# 设置最小读取字符数和超时(非规范模式)stty -F /dev/ttyS0 min0time10# 0个字符,1秒超时stty -F /dev/ttyS0 min1time0# 至少1个字符,无超时
查看当前设置
# 查看所有设置stty -F /dev/ttyS0 -a# 查看特定设置stty -F /dev/ttyS0

完整配置示例

#!/bin/bash# 配置串口为115200波特率,8N1,无流控制,原始模式SERIAL_PORT="/dev/ttyUSB0"BAUDRATE="115200"# 配置基本参数stty -F$SERIAL_PORT$BAUDRATEcs8 -cstopb -parenb stty -F$SERIAL_PORT-crtscts -ixon -ixoff# 设置原始模式,禁用回显stty -F$SERIAL_PORTraw -echo# 设置非阻塞读取stty -F$SERIAL_PORT-icanon min0time0echo"串口$SERIAL_PORT已配置为$BAUDRATE8N1"

2.使用setserial命令

setserial用于设置串口硬件参数,通常需要root权限。

基本语法

setserial<设备文件>[参数]

常用参数

# 查看串口信息setserial -g /dev/ttyS[0-3]# 设置UART类型setserial /dev/ttyS0 uart 16550A# 设置I/O端口地址setserial /dev/ttyS0 port 0x3f8# 设置IRQsetserial /dev/ttyS0 irq4# 设置自动配置setserial /dev/ttyS0 autoconfig# 保存设置setserial /dev/ttyS0 -a

3.使用ioctl系统调用(C程序)

通过C程序直接调用ioctl系统调用设置串口参数。

示例程序

#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<termios.h>#include<errno.h>#include<string.h>intset_serial_port(constchar*port,speed_tbaudrate){intfd;structtermiosoptions;// 打开串口fd=open(port,O_RDWR|O_NOCTTY|O_NDELAY);if(fd<0){perror("无法打开串口");return-1;}// 获取当前设置if(tcgetattr(fd,&options)<0){perror("获取串口设置失败");close(fd);return-1;}// 设置输入输出波特率cfsetispeed(&options,baudrate);cfsetospeed(&options,baudrate);// 8N1设置options.c_cflag&=~CSIZE;options.c_cflag|=CS8;options.c_cflag&=~PARENB;options.c_cflag&=~CSTOPB;// 无硬件流控制options.c_cflag&=~CRTSCTS;// 启用接收器,忽略调制解调器状态options.c_cflag|=(CLOCAL|CREAD);// 原始输入options.c_iflag&=~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);// 原始输出options.c_oflag=0;// 无本地处理options.c_lflag=0;// 非规范模式,立即返回options.c_cc[VTIME]=0;options.c_cc[VMIN]=0;// 应用设置if(tcsetattr(fd,TCSANOW,&options)<0){perror("设置串口参数失败");close(fd);return-1;}// 清空缓冲区tcflush(fd,TCIOFLUSH);returnfd;}

4.使用Python(pyserial库)

#!/usr/bin/env python3importserialimportserial.tools.list_ports# 配置串口参数ser=serial.Serial(port='/dev/ttyUSB0',# 串口设备baudrate=115200,# 波特率bytesize=serial.EIGHTBITS,# 数据位:8parity=serial.PARITY_NONE,# 校验位:无stopbits=serial.STOPBITS_ONE,# 停止位:1timeout=1,# 读取超时(秒)xonxoff=False,# 软件流控制rtscts=False,# 硬件流控制dsrdtr=False# DSR/DTR流控制)# 或者逐个设置ser=serial.Serial()ser.port='/dev/ttyS0'ser.baudrate=9600ser.bytesize=serial.SEVENBITS ser.parity=serial.PARITY_EVEN ser.stopbits=serial.STOPBITS_TWO ser.timeout=0.5ser.xonxoff=Trueser.rtscts=Falseser.open()# 列出可用串口ports=serial.tools.list_ports.comports()forportinports:print(f"{port.device}:{port.description}")

5.Shell脚本示例

完整的串口配置脚本

#!/bin/bash# serial_config.sh# 配置参数PORT=${1:-"/dev/ttyUSB0"}BAUD=${2:-115200}DATABITS=${3:-8}PARITY=${4:-"none"}STOPBITS=${5:-1}FLOW=${6:-"none"}# 校验位映射case$PARITYin"none")PARITY_FLAGS="-parenb";;"odd")PARITY_FLAGS="parenb parodd";;"even")PARITY_FLAGS="parenb -parodd";;*)echo"无效的校验位:$PARITY";exit1;;esac# 数据位映射case$DATABITSin5)DATABIT_FLAGS="cs5";;6)DATABIT_FLAGS="cs6";;7)DATABIT_FLAGS="cs7";;8)DATABIT_FLAGS="cs8";;*)echo"无效的数据位:$DATABITS";exit1;;esac# 停止位映射if["$STOPBITS"="2"];thenSTOPBIT_FLAGS="cstopb"elseSTOPBIT_FLAGS="-cstopb"fi# 流控制映射case$FLOWin"none")FLOW_FLAGS="-crtscts -ixon -ixoff";;"hardware")FLOW_FLAGS="crtscts -ixon -ixoff";;"software")FLOW_FLAGS="-crtscts ixon ixoff";;*)echo"无效的流控制:$FLOW";exit1;;esac# 检查设备是否存在if[!-c"$PORT"];thenecho"错误: 设备$PORT不存在"exit1fi# 应用设置echo"配置串口$PORT:"echo" 波特率:$BAUD"echo" 数据位:$DATABITS"echo" 校验位:$PARITY"echo" 停止位:$STOPBITS"echo" 流控制:$FLOW"stty -F$PORT$BAUD$DATABIT_FLAGS$STOPBIT_FLAGS$PARITY_FLAGS$FLOW_FLAGSraw -echo -icanon# 验证设置echo-e"\n当前设置:"stty -F$PORT-a|grep-E"speed|cs[0-9]|parenb|parodd|cstopb|crtscts|ixon|ixoff"# 设置权限(可选)# sudo chmod 666 $PORT

交互式串口配置脚本

#!/bin/bash# interactive_serial_config.sh# 列出可用串口echo"可用串口:"ls/dev/ttyS* /dev/ttyUSB* /dev/ttyACM*2>/dev/null# 选择串口read-p"输入串口设备: "PORT# 选择波特率echo"常用波特率:"echo"1) 9600"echo"2) 19200"echo"3) 38400"echo"4) 57600"echo"5) 115200"echo"6) 230400"echo"7) 自定义"read-p"选择波特率 [1-7]: "BAUD_CHOICEcase$BAUD_CHOICEin1)BAUD=9600;;2)BAUD=19200;;3)BAUD=38400;;4)BAUD=57600;;5)BAUD=115200;;6)BAUD=230400;;7)read-p"输入自定义波特率: "BAUD;;*)BAUD=115200;;esac# 应用配置stty -F$PORT$BAUDcs8 -cstopb -parenb -crtscts raw -echoecho"串口$PORT已配置为$BAUD8N1"echo"按Ctrl+C退出"# 简单终端cat$PORT&CAT_PID=$!trap"kill$CAT_PID2>/dev/null"EXITwhiletrue;doread-p"> "INPUTecho-e"$INPUT">$PORTdone

6.其他实用命令

查看串口信息

# 查看所有串口设备dmesg|greptty# 查看串口详细信息udevadm info -a -n /dev/ttyS0# 查看串口驱动信息cat/proc/tty/driver/serial

设置权限

# 添加用户到dialout组sudousermod-a -G dialout$USER# 临时更改权限sudochmod666/dev/ttyUSB0# 永久设置udev规则echo'KERNEL=="ttyUSB*", MODE="0666"'|sudotee/etc/udev/rules.d/50-usb-serial.rulessudoudevadm control --reload-rules

测试串口

# 发送测试数据echo"test">/dev/ttyS0# 接收数据(显示十六进制)cat-v</dev/ttyS0# 十六进制转储od -x</dev/ttyS0# 使用screen作为简单终端screen/dev/ttyS0115200

7.常见问题解决

权限问题

# 检查当前用户组groups# 添加用户到dialout组sudogpasswd -a$USERdialout# 需要重新登录生效

设备忙问题

# 查看占用进程lsof/dev/ttyS0# 强制释放设备fuser-k /dev/ttyS0

保存和恢复设置

# 保存当前设置stty -F /dev/ttyS0 -g>serial_settings.txt# 恢复设置stty -F /dev/ttyS0$(catserial_settings.txt)

这些shell命令和脚本提供了灵活的方式来配置Linux串口参数,可以根据具体需求进行组合和调整。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 10:05:43

完整鸣潮自动化工具:简单智能的游戏助手

完整鸣潮自动化工具&#xff1a;简单智能的游戏助手 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸上锁合成 自动肉鸽 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 还在为鸣潮中繁琐的重…

作者头像 李华
网站建设 2026/4/25 4:49:58

HbaseGUI:重塑HBase可视化管理新体验

HbaseGUI&#xff1a;重塑HBase可视化管理新体验 【免费下载链接】HbaseGUI HbaseGUI 项目地址: https://gitcode.com/gh_mirrors/hb/HbaseGUI 在大数据技术生态中&#xff0c;HBase作为分布式列存储数据库的核心组件&#xff0c;其强大的存储能力往往伴随着复杂的管理挑…

作者头像 李华
网站建设 2026/4/18 8:44:14

2025 中国 GEO 服务商十强榜:基于三维评估模型的权威解读

在生成式 AI 重构信息分发规则的今天&#xff0c;GEO&#xff08;生成式引擎优化&#xff09;已成为企业抢占 AI 流量入口、实现精准触达的核心抓手。据中国人工智能产业发展联盟最新数据&#xff0c;2025 年国内 GEO 服务市场规模突破 52 亿元&#xff0c;年复合增长率达 43%&…

作者头像 李华
网站建设 2026/4/17 18:39:29

3步快速掌握HashCalculator:文件哈希值批量管理终极指南

3步快速掌握HashCalculator&#xff1a;文件哈希值批量管理终极指南 【免费下载链接】HashCalculator 一个文件哈希值批量计算器&#xff0c;支持将结果导出为文本文件功能和批量检验哈希值功能。 项目地址: https://gitcode.com/gh_mirrors/ha/HashCalculator 在日常工…

作者头像 李华
网站建设 2026/4/18 11:05:54

绝区零自动辅助工具终极指南:从零开始完整教程

绝区零自动辅助工具终极指南&#xff1a;从零开始完整教程 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 绝区零一条龙是一…

作者头像 李华
网站建设 2026/4/21 12:58:30

WorkshopDL终极使用指南:跨平台Steam模组下载完整教程

WorkshopDL终极使用指南&#xff1a;跨平台Steam模组下载完整教程 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为不同游戏平台的模组兼容性而困扰吗&#xff1f;Worksho…

作者头像 李华