news 2026/6/15 10:17:11

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/6/13 23:15:27

ET200S-6ES7138-4DF01-0AB0(485通讯)

1&#xff0e;组态地址设定2.增加ET200S程序库ET200S 1SI 串行接口模块的函数块3.定义数据块发送DB1190和接收DB1181数据块4.调用发送S_SEND和接收S_RCV程序AN M5.0M5.0CALL "S_SEND" , DB282REQ :M5.0 \\触发发送指令R :LADDR :272 \\Q272DB_NO …

作者头像 李华
网站建设 2026/6/15 3:29:34

网盘下载新革命:8大平台免会员极速下载全攻略

网盘下载新革命&#xff1a;8大平台免会员极速下载全攻略 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改&#xff08;改自6.1.4版本&#xff09; &#xff0c;自用&#xff0c;去推广&#xff0c;无…

作者头像 李华
网站建设 2026/6/10 23:50:57

漫画下载神器:5分钟掌握全平台漫画批量下载技巧

漫画下载神器&#xff1a;5分钟掌握全平台漫画批量下载技巧 【免费下载链接】comics-downloader tool to download comics and manga in pdf/epub/cbr/cbz from a website 项目地址: https://gitcode.com/gh_mirrors/co/comics-downloader 还在为寻找心仪漫画而苦恼&…

作者头像 李华
网站建设 2026/6/12 17:26:44

洛阳实验室气路管 卫生级不锈钢精密管

在高端流体输送系统中&#xff0c;洁净度、尺寸精度与材料稳定性是决定整体性能的关键要素。浙江荣瑞管道科技有限公司深耕不锈钢精密管材领域多年&#xff0c;专注于为生物医药、半导体、食品饮料及高纯实验室等对洁净要求严苛的行业提供高品质316L不锈钢BA&#xff08;Bright…

作者头像 李华
网站建设 2026/6/7 9:58:13

鸣潮效率革命:从时间消耗到智能掌控的思维跃迁

鸣潮效率革命&#xff1a;从时间消耗到智能掌控的思维跃迁 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸上锁合成 自动肉鸽 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 当你的游戏时间…

作者头像 李华
网站建设 2026/6/10 18:54:07

终极指南:如何使用HbaseGUI轻松管理HBase集群

终极指南&#xff1a;如何使用HbaseGUI轻松管理HBase集群 【免费下载链接】HbaseGUI HbaseGUI 项目地址: https://gitcode.com/gh_mirrors/hb/HbaseGUI HBase作为分布式列式数据库&#xff0c;其强大的存储能力常常被复杂的命令行操作所掩盖。数据管理员需要频繁使用HBa…

作者头像 李华