news 2026/7/14 21:39:36

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/7/14 4:20:45

PHP开发指南 P8:模块化、会话管理、密码安全与OOP入门

PHP开发指南 P8&#xff1a;模块化、会话管理、密码安全与OOP入门 作为PHP开发者&#xff0c;从基础语法过渡到工程化、安全化的编码思维&#xff0c;是进阶的关键一步。本文将围绕「代码复用」「用户状态保持」「密码安全」「面向对象编程」四个核心知识点展开&#xff0c;结…

作者头像 李华
网站建设 2026/7/14 11:33:37

告别网盘限速困扰,这款工具让你下载飞起来

告别网盘限速困扰&#xff0c;这款工具让你下载飞起来 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改&#xff08;改自6.1.4版本&#xff09; &#xff0c;自用&#xff0c;去推广&#xff0c;无需…

作者头像 李华
网站建设 2026/7/14 14:37:55

如何快速使用京东自动评价工具:新手用户的完整指南

京东自动评价工具是一款专为简化购物评价流程而设计的智能助手。这个基于Python开发的开源项目能够帮助用户自动生成贴合商品特点的个性化评价内容&#xff0c;让评价工作变得轻松高效。无论您是想要节省时间的普通消费者&#xff0c;还是需要管理多个账号的用户&#xff0c;这…

作者头像 李华
网站建设 2026/7/11 1:33:06

Revelation光影包深度解析:5大核心机制重塑Minecraft视觉体验

Revelation光影包深度解析&#xff1a;5大核心机制重塑Minecraft视觉体验 【免费下载链接】Revelation A realistic shaderpack for Minecraft: Java Edition 项目地址: https://gitcode.com/gh_mirrors/re/Revelation 当像素方块遇上真实光影&#xff0c;Minecraft的世…

作者头像 李华
网站建设 2026/7/14 7:13:05

React中setState后获取更新后值的完整解决方案

在React开发中&#xff0c;很多新手都会遇到一个常见“坑”&#xff1a;调用setState更新状态后&#xff0c;立即读取状态却拿到旧值。这并非React的bug&#xff0c;而是setState的异步特性导致的。本文将从问题本质出发&#xff0c;分类详解类组件和函数组件中获取setState更新…

作者头像 李华
网站建设 2026/7/14 19:18:57

互联网医院定制|互联网医院|禾高互联网医院搭建

互联网医院系统是指依托实体医疗机构&#xff0c;运用现代信息技术&#xff0c;通过线上平台为患者提供覆盖部分或全部医疗健康服务的综合性数字化系统。其核心目标在于打破时空壁垒&#xff0c;优化医疗资源配置&#xff0c;提升服务效率与可及性。 该系统并非单一功能模块的堆…

作者头像 李华