尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Linux串口调试实战:stty查看与配置串口参数全指南

发布时间:2026/9/30 1:17:36

资讯中心
01
ARTICLE

Linux串口调试实战:stty查看与配置串口参数全指南

Linux串口调试实战:stty查看与配置串口参数全指南
干了这么多年Linux下的嵌入式开发和系统运维串口始终是个绕不开的活儿。前两天帮同事排查一块开发板烧写失败的问题折腾了半天最后发现既不是波特率配错也不是接线松动而是系统压根没把USB转串口芯片识别出来。这种情况在Linux下太典型了Windows下插上就能用的CH340在Linux下经常要手动确认驱动、设备节点、权限、终端工具这些一层层的东西。这篇东西就围绕“Linux下查看与设置串口信息和属性”这条主线把我日常排查和配置串口尤其是USB转串口和板载串口终端的完整思路整理出来。内容包括怎么确认设备节点是否存在、驱动是否加载怎么用stty查看和修改波特率/数据位/停止位/校验位以及minicom、picocom、screen这些终端工具的选型和坑点。适合刚接触Linux串口调试的嵌入式开发新人也适合偶尔要用串口连网络设备、交换机、路由器或单片机开发板的运维同学。1. 先搞清楚串口设备在哪驱动有没有起来1.1 设备节点的基础认知Linux下面一切都走文件系统这套逻辑串口设备对应的就是 /dev 目录下的节点。传统板载串口通常叫 /dev/ttyS0、/dev/ttyS1比如老式主板的COM1、COM2USB转串口芯片则对应 /dev/ttyUSB0、/dev/ttyUSB1FT232、CH340、CP2102这些常见芯片都是这个命名还有一些PCIe或m.2扩展串口卡可能是 /dev/ttyS4这种高位编号。所以第一步永远是先确认节点在不在。插上设备后执行ls -l /dev/ttyUSB* ls -l /dev/ttyS*如果出现了 /dev/ttyUSB0说明节点有了。如果什么都没输出别急着怪硬件先查系统认没认出芯片。1.2 用 dmesg 和 lsusb 确认芯片型号确认芯片是否被内核识别最直接的办法是 dmesg 看内核日志。设备拔插后立刻执行dmesg | tail -20正常识别CH340时日志里会出现类似 “usb 1-2: ch341-uart converter now attached to ttyUSB0” 或者 “cp210x converter now attached to ttyUSB0” 的字样。看到这句话基本就是驱动没问题、节点也建好了。再配合 lsusb 查看USB总线上挂着的设备lsusb输出里找厂家ID和产品ID。CH340通常是 “1a86:7523”CP2102是 “10c4:ea60”FT232是 “0403:6001”。这些信息在排查芯片型号和驱动问题时非常关键。我遇到过一种情况设备刚插上时能识别过一会儿 ttyUSB0 就消失了。后来发现是USB口供电不稳芯片反复掉线。这时候换一个供电更稳的USB口或者用带屏蔽的USB线问题就解决了。类似的坑还在后面排查思路要按“节点-驱动-硬件供电”这个顺序来。注意如果内核没有对应驱动内核日志里通常只有USB枚举信息但不会出现挂载到ttyUSB0的记录。此时先确认你用的是不是常见芯片CH340和CP210x在主流发行版里都自带驱动少数小众芯片需要自己装驱动这个后面单说。1.3 板载串口与扩展串口卡的差异处理板载串口时有个容易忽略的坑Linux发行版为了降低启动等待时间可能把某些ttyS端口屏蔽了或者端口配置成非标准IO地址。这时候用 setserial 可以查看和设置串口的IO端口与IRQ信息setserial -g /dev/ttyS0如果输出提示 “Device or resource busy” 或者 “Permission denied”说明端口可能被别的服务占用比如getty、ModemManager或者当前用户没有访问权限。板载串口的处理和老式ISA/PCI串口卡属性设置逻辑相近核心就是确认IO地址、IRQ和UART类型这几项是否与硬件实际配置一致。排查板载串口时还有一个思路值得尝试设备节点不存在时用 udevadm 重新触发硬件检测udevadm trigger udevadm settle然后再检查 /dev 目录。这一步在实际操作中解决过不少“明明硬件在节点不创建”的怪问题推荐优先尝试。2. 串口工具怎么选minicom、screen、picocom 横向对比2.1 minicom老牌工具配置繁琐但功能最全minicom 在Linux串口调试中的地位和 vim 在编辑器界的地位差不多老、稳、功能全但初次上手容易被配置界面劝退。第一次运行需要先配置sudo minicom -s进入配置菜单后选择 “Serial port setup”把串口设备改成 /dev/ttyUSB0波特率改成 115200 或其他你需要的值数据位通常保持 8N18数据位、无校验、1停止位然后 Save setup as dfl 保存为默认配置以后直接输入 minicom 就能进入。minicom 的退出方式很有年代感先按 CtrlA然后按 X再回车确认。不熟悉的人第一次按下 CtrlA 后发现没反应以为卡死了其实是进入了快捷键模式。调出帮助菜单也是 CtrlA然后按 Z。minicom 的优势在于会话日志、收发文件ZModem协议这些功能齐全。比如你要用串口传一个固件包在 minicom 里按 CtrlA再按 S选择 ZModem就能直接发送文件到对端设备。这在嵌入式设备联网不方便、只能靠串口文件传输的场景下非常实用。2.2 picocom轻量准确的现代选择如果只是连上设备看日志、敲命令我更推荐 picocom。它没有菜单界面参数全在命令行里指定非常干净picocom -b 115200 -d 8 -p n -s 1 /dev/ttyUSB0-b 是波特率-d 数据位-p 校验位n表示无校验-s 停止位。退出方式是 CtrlACtrlX比 minicom 简单多了。picocom 还有一个很实用的功能默认会把串口收到的内容实时打印到终端同时可以通过 -l 参数开启日志记录把所有收发内容写入文件。排查通信协议时特别香回看数据不用靠肉眼盯屏幕。日常调试我直接给 picocom 写了一个别名alias compicocom -b 115200 -d 8 -p n -s 1 /dev/ttyUSB0每次连接开发板就敲一个 com效率比开工具软件快多了。2.3 screen万能终端还是串口终端screen 本来是终端复用工具但用 screen 连接串口也是简化流程的好办法screen /dev/ttyUSB0 115200退出是 CtrlA然后输入 :quit 回车。screen 的优点是系统自带率高很多发行版默认就装了。缺点是出错提示不友好设备没权限时会黑屏一闪而过新手根本不知道发生了什么。所以用 screen 之前一定要先确认设备节点存在且当前用户有权限。另外 screen 连接串口时默认走的是原始模式但某些终端控制字符还是会干扰显示乱码的概率比 picocom 高一些。我的结论是screen 适合临时救急长期调试还是用 picocom 或 minicom。2.4 工具选型总结按场景给一个选择参考场景推荐工具理由快速连接开发板终端picocom启动快参数直观日志方便传输固件/文件minicomZModem集成好操作成熟系统没有额外工具可装screen大多数发行版自带零安装成本查看/修改串口属性stty纯命令行操作脚本化方便下面重点讲3. sttyLinux下查看与设置串口属性的核心命令3.1 用 stty 查看当前串口参数stty 是Linux下最底层的串口属性查看与设置工具它直接和终端驱动打交道不依赖任何终端界面。查看串口当前参数用 -F 指定设备文件-a 显示全部属性stty -F /dev/ttyUSB0 -a输出内容很多重点关注这几个字段speed 后面跟着的数字就是波特率比如 115200cs8 表示数据位8位cs5/cs6/cs7/cs8对应5/6/7/8位-cstopb 表示1位停止位cstopb 表示2位停止位-parenb 表示无校验位parenb 表示启用校验配合 parodd 是奇校验-parodd 是偶校验这三个组合起来就是我们常说的 8N1、8E1、7E1 这类串口属性。常见组合的对照关系列出来供参考参数组合含义115200 cs8 -cstopb -parenb115200波特率8数据位1停止位无校验8N19600 cs8 cstopb parenb parodd9600波特率8数据位2停止位奇校验8O219200 cs7 -cstopb parenb -parodd19200波特率7数据位1停止位偶校验7E13.2 用 stty 设置串口参数设置参数同样用 -F 指定设备后面直接跟要改的属性stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb这条命令设置了常用的 115200 8N1。注意stty 设置的是串口驱动层的属性对端设备比如单片机如果你更改后出现乱码优先确认对端设备的串口参数是不是和这里完全一致。设置完成后可以再执行一次 -a 查看确认这是我每次调试前的习惯动作。检查输出里的 speed、cs8、-cstopb、-parenb 是否都符合预期再开始收发数据。还有一个和实际场景强相关的操作把串口设置为原始模式避免终端驱动对数据进行额外处理比如把回车转成换行、把特殊字符解释成控制键。在做串口协议通信时不设置 raw 模式是很容易踩的坑stty -F /dev/ttyUSB0 raw -echoraw 表示原始模式-echo 表示不把收到的内容回显给发送端。调试单片机串口时如果不加 raw可能会出现你发 0x0A对端收到的是 0x0D 0x0A 这种被系统改过的数据排查半天都找不到原因。3.3 脚本化设置串口的两种姿势实际项目中经常需要把串口参数设置写进脚本或程序里。命令行层面可以直接在启动终端工具前用 stty 设置stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb raw -echo picocom -b 115200 /dev/ttyUSB0这样能确保 picocom 连接前串口已经是我们要的状态。在编程语言层面Linux下最标准的方式是使用 termios 接口。C语言里要引入 termios.hPython里用 pyserial 库Go里用 github.com/tarm/serial核心都是对这些属性的封装。以 Python pyserial 为例import serial ser serial.Serial( port/dev/ttyUSB0, baudrate115200, bytesizeserial.EIGHTBITS, parityserial.PARITY_NONE, stopbitsserial.STOPBITS_ONE, timeout1 ) ser.write(bAT\r\n) data ser.readline()这部分属于串口编程的范畴这次不展开但理解 stty 设置的底层参数后再看任何语言的串口配置都会一通百通因为它们映射的都是同一套 termios 数据结构。3.4 硬件流控与软流控的判断很多人在 Linux 下连串口时遇到数据收发异常最后发现是流控设置不对。stty 输出里有两个关键字段crtscts硬件流控RTS/CTS和 ixon/ixoff软件流控XON/XOFF。默认情况下很多发行版会启用软件流控。ixoff 开启时系统收到特定控制字符会自动暂停或恢复数据发送。但绝大多数嵌入式串口设备根本不用软件流控这个特性反而会干扰数据内容。调试时如果发现数据莫名其妙地丢一段、停一下检查一下stty -F /dev/ttyUSB0 -ixon -ixoff stty -F /dev/ttyUSB0 -crtscts-ixon关闭软件输出流控-ixoff关闭软件输入流控-crtscts关闭硬件流控。对大多数单片机、路由器、交换机的串口终端来说关掉所有流控才是正确姿势。连接网络设备时例外部分交换机要求启用硬件流控才能正常输出所以设置之前最好先查一下对端设备的文档。注意stty 设置在重启或拔插设备后通常会失效因为设备重新枚举时驱动会恢复默认参数。需要每次连接前重新设置或者编写脚本统一完成“设置参数连接终端”的整个流程。4. 完整实操案例连开发板、烧固件、查日志4.1 场景一连接嵌入式Linux开发板串口终端嵌入式开发板的调试串口一般是 TTL 电平的不能用普通RS232线直接连电脑中间需要 USB转TTL 模块也就是常说的 USB转串口 小板。接线虽然简单但只有两条线要特别注意TXD接对端RXD、RXD接对端TXD、GND接GND。如果接了地线还是没输出多半是TXD和RXD接反了开发板的丝印上通常会有标注。接线完成后步骤是这样插上USB转TTL模块执行 dmesg | tail 看识别结果确认 ttyUSB0 节点生成用 stty 设置参数开发板调试串口一般默认 115200 8N1stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb raw -echo用 picocom 连接picocom -b 115200 /dev/ttyUSB0给开发板上电终端窗口里应该能看到启动日志输出启动日志能看到但不完整经常是在 bootloader 阶段正常进内核后卡住这种情况后面讲排查思路。4.2 场景二串口烧写固件时的注意点串口烧写失败是热搜词里出现频率很高的问题实际项目中遇到的情况也相当多。常见表现是烧写工具卡在 “Connecting...”或者烧写到一半报超时错误。先排除最基础的设置问题确认烧写工具里选择的串口号是 /dev/ttyUSB0 而不是 /dev/ttyS0确认波特率与目标芯片的烧写协议匹配。很多单片机芯片烧写时的波特率不是默认的 115200比如STM32的串口ISP默认可能是 115200 或 9600ESP8266/ESP32 烧写时常用 460800 甚至更高需要根据芯片手册设置。接下来是硬件层面的几个坑开发板需要手动进入烧写模式按住BOOT键再按复位或者跳线帽短接有些板子按住BOOT键的时间不够系统直接进了正常启动流程供电不稳会导致烧写中断尤其是笔记本USB口同时挂着无线鼠标、USB Hub时更容易发生。换直接插主机后置USB口或者给开发板单独供电有的USB转TTL模块不支持高波特率标称能到 2Mbps实际在 921600 以上就丢数据。换一个主控芯片更好的模块CP2102、FT232通常比某些杂牌CH340更稳Linux下的烧写操作还要注意权限问题这类问题通常表现为open /dev/ttyUSB0: Permission denied解决思路是不是用sudo绕过而是把当前用户加入 dialout 组因为串口设备默认属于 dialout 组sudo usermod -a -G dialout $USER注销重新登录后生效。组名在部分发行版中可能不同比如 tty 组可以用 ls -l /dev/ttyUSB0 查看设备所属组来确认。4.3 场景三查看串口设备更多底层信息除了 stty查看串口设备底层属性还有两个命令值得掌握。一个是前面提到的 setserialsetserial -g /dev/ttyUSB0真正强大的是用 udevadm 查询设备的完整信息包括驱动名称、设备路径、厂商ID、产品ID、序列号等这对排查驱动匹配问题非常关键udevadm info -a -n /dev/ttyUSB0输出里能看到 ATTRS{idVendor}、ATTRS{idProduct} 这样的关键属性。当你需要根据特定厂商产品ID编写 udev 规则比如给某个设备固定一个稳定的别名 /dev/ttyUSB_esp32时从上一步的输出中就能拿到确切参数。做一个自定义串口别名的示例。新建 /etc/udev/rules.d/99-usb-serial.rules内容大致是SUBSYSTEMtty, ATTRS{idVendor}10c4, ATTRS{idProduct}ea60, SYMLINKttyUSB_mydevice然后执行 udevadm control --reload-rules 并重新插拔设备。之后无论设备插入哪个USB口都只有一个固定的 /dev/ttyUSB_mydevice 节点。在多设备调试场景中这能省下大量找设备节点的时间。5. 常见问题排查与避坑经验5.1 权限问题为什么提示 Permission denied串口设备节点通常归属于 dialout 或 tty 组普通用户没有访问权限。临时解决方案是 sudo 加在命令前面长期解决方案是加入对应组。加入后需要注销重登有些系统要求重启桌面会话才能生效。如果你不想注销也可以使用 newgrp 命令临时切换组身份newgrp dialout另外注意部分开发环境里使用了 systemd-logind 管理用户会话组权限的重新加载会有延迟验证是否生效可以通过 id 命令查看id输出里如果 gid 或者 groups 里包含 dialout说明已生效。5.2 设备节点不存在可能的原因dmesg 没有输出说明内核根本没识别到USB芯片优先检查硬件换USB口、换线、确认模块供电。如果芯片识别但没生成 ttyUSB 节点可能是驱动没加载。手动加载sudo modprobe ch341 sudo modprobe cp210x如果提示模块不存在才需要编译安装第三方驱动。市面上绝大多数 USB转串口 芯片在内核主线里都有支持连国产的 CH343、CH9102 等新型号在新版本内核里也原生支持不用折腾编译。所以驱动不工作的情况真的不多大部分“找不到设备”的问题根源是硬件接触不良或者线材质量问题。5.3 乱码先查波特率再查电平串口输出乱码的排查顺序波特率是否匹配。终端工具里设置115200对端设备实际运行在9600输出必然乱码数据位、停止位、校验位是否匹配。很多定制协议不是标准的8N1需要手动修改电平是否一致。TTL电平的板子和RS232电平的串口直接连接不仅乱码严重时还会烧芯片。中间必须加RS232转TTL模块检查是否启用了不该启用的流控前面提到的 ixon/ixoff 也可能干扰数据5.4 数据丢失可能不是代码问题串口丢数据经常被误判为程序bug实际可能涉及几个层面操作系统层面内核串口缓冲区不足特别是高波特率大流量时。可以在代码里改用非阻塞读或者减少读取间隔终端工具层面minicom 的显示跟不上不代表数据真丢了可以开日志文件确认硬件层面USB转TTL芯片质量差高波特率下丢字节典型的例子是杂牌CH340在 921600 波特率下频繁丢数据。解决办法是降低波特率或换用CP2102/FT232这类更稳定的芯片流控问题前面特别提到的 ixoff 软件流控对端设备可能发送了 XOFF 字符导致系统暂停接收现象就是数据断断续续排查数据丢失时建议先用下面这个命令做一次纯数据回环测试把USB转TTL模块的TXD和RXD短接然后往串口发送数据看是否能完整收回来。如果回环数据都丢问题大概率是硬件或系统配置层面。5.5 连接终端没有输出常见于启动日志阶段连接开发板后终端上没有任何输出先按开发板复位键试一次。很多板子默认启动速度很快你完成终端连接时U-Boot阶段已经过了内核日志已经刷完需要复位才能看到完整输出。如果复位后依然没有任何输出检查一下接线顺序是否正确TXD和RXD有没有反模块的TXD/RXD引脚上是否有电平变化用一个简单的LED电路或者万用表量一下开发板的调试串口是否被 u-boot 环境变量禁用比如有些板子默认 console 设置指向了其他串口这张排查速查表是我每次解决串口问题时的快速索引也分享给读者现象优先排查项次要排查项Permission denied用户是否加入 dialout 组设备节点属组是否正常找不到 ttyUSB0dmesg 是否有识别日志换USB口、换线输出乱码波特率是否匹配数据位/校验位、电平转换数据断断续续关闭 ixon/ixoff 流控硬件质量、供电稳定性烧写失败是否进入烧写模式高波特率改用稳定芯片、供电连接后无输出按复位键看启动日志接线顺序、console 配置6. 个人使用的日常调试流程最后分享一下我自己在Linux下调试串口的固定流程这个流程踩过不少坑后沉淀下来的能最大限度减少掉坑概率第一步永远是用 stty -F /dev/ttyUSB0 -a 检查当前参数。不管昨天配置过什么今天拔插一次设备后参数就可能变了。第二步把流控全部关掉设置 raw 模式。对绝大多数设备这是最保险的状态避免系统层面的干扰。第三步再连接终端工具。我主力用 picocom只有传文件时才切到 minicom。第四步是调试过程中出现任何异常第一时间用 dmesg 看内核日志很多串口问题其实在内核层就能看出端倪而不是怀疑应用工具。这套流程在处理 RTOS 单板、嵌入式Linux设备、路由器交换机调试时都适用。串口这个东西说简单就是一根线发数据收数据说复杂起来驱动、设备节点、参数配置、用户权限、终端工具任何一个环节出问题都能让调试卡住半天。把查看和设置串口信息这套基本功搞扎实了后面不管是写串口程序还是做设备调试都会顺手很多。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。