用串口调试助手定位问题:怎么抓、抓到之后怎么读
串口调试助手常被当成一个只用来敲指令、看设备动不动的窗口。这篇不重复RS232 串口乱码的 6 步定位那套总体流程,只讲被跳过的两步——怎么把助手接成一台只听不说的观测仪器,以及抓到那一串十六进制之后,怎么从字节本身反推出错在参数、错在方向,还是根本没通。
第一个开关:把显示切到十六进制
「乱码」这个词描述的是渲染结果,不是链路状态。助手默认按文本模式显示,拿到一个字节就去字符表里找对应的可打印字符,找不到就画一个方块或问号。所以屏幕上的方块有两种完全不同的来源:一种是字节确实收错了,另一种是字节收得一点没错,它本来就不是可打印字符。
这两种在文本模式下长得一模一样,切到十六进制显示才分得开。串口这一层传的本来就是字节,字符是上层的解释;你要”读”,就得先看到字节。后面所有的判读方法都以十六进制显示为前提,文本模式下的所有结论都不可靠。
顺手把时间戳显示也打开。它在判断设备是”没回”还是”回得晚”时是唯一依据——没有时间戳,一次超时和一次无响应在窗口里看起来完全一样。
打开串口失败,先想谁占着它
串口在系统里是独占资源,同一个端口号同一时刻只能被一个程序打开。可能占着它的有三类程序:还在后台跑着的中控软件、厂商自己的配置工具、以及你上一次没关掉的助手窗口。表现是”打开串口失败”,或者打开成功了却一个字节收不到。
这一条容易被误判成线坏了,然后一个人爬上桥架去查一根根本没问题的线。另有一个相关的坑:USB 转串口线拔插之后会重新枚举,端口号可能和上次不一样,助手里那个记住的端口号已经指向别处了。
流控:一个默认开着就发不出字节的开关
串口的可配项不止波特率、数据位、校验位、停止位这四项,还有第五项——流控,取值是无流控、硬件流控(RTS/CTS)、软件流控(XON/XOFF)。
硬件流控要求对端通过 CTS 信号线告诉本端”可以发了”。如果现场这根线只接了三根芯(发送、接收、地),对端根本没有这两根握手线,助手就会一直等下去,一个字节都不发出去。如果你的工具会显示发送计数,这种情况下它可能一直停在零。这和线路断开的表象几乎一样,但一个是软件里点一下的事,另一个要爬桥架。所以在动线之前,先看这个下拉框选的是不是”无”。
三种接法,各自能看见什么
一、取代式直连。把原来的主控拔掉,助手所在的电脑接到设备串口上。这种接法能回答”设备本身还会不会说话”,但看不到原主控实际发出去的是什么——而原主控实际发出的内容往往正是要害所在。
二、RS-232 单向旁听。RS-232 是单端信号、点对点连接,两个方向各走各的线。要旁听其中一个方向,把助手侧的接收线并到那条线上、地线共接,助手侧的发送线悬空不接。这样一次只能看一个方向;想同时看双向,就得用两个串口分别听两条线。旁听的价值在于链路保持原样,你看到的是真实运行时的报文,不是你自己造出来的。
三、RS-485 总线旁听。差分总线本来就是多点拓扑,把助手侧的收发器并接到 A/B 两线上,理论上能看到总线上所有设备的往来报文。两个前提必须守住:其一,助手绝对不能发送——半双工总线同一时刻只允许一个设备驱动,你一发就是冲突;其二,这次接入本身给总线加了一个节点、多引出一段支线,拓扑已经被你改了——如果原有问题正好与总线特性(反射、共地、负载)有关,接入前后的现象可能不完全一致,读记录时要把这一层考虑进去。
读法一:先分”零字节”和”有字节”
抓到记录之后的第一个岔路口只有一个问题:收到的字节数是不是零。
零字节,往方向、电平、流控、端口占用这一侧查——这一层根本没通,讨论波特率毫无意义。有字节但读不懂,才轮到参数与编码。
这两条岔路后面的动作完全不同,先分清再往下走,能少走很多回头路。既有的六步清单是从参数查起的,那是按发生频次排的顺序;但当你手上已经有一份十六进制记录时,从”有没有字节”入手更快,因为这个判据不需要任何猜测。
读法二:用字节数之比反推波特率错在哪个方向
这是十六进制记录能给你、而文本模式给不了的东西。
UART 的接收端并不知道对方的波特率,它只按自己配置的速率去判读每一位(具体在位内何时采样属收发器实现,各家不同)。由此可以推出三种情形:
- 接收端波特率高于发送端:同一个发送位被采样多次,收到的字节数多于发出的
- 接收端波特率低于发送端:多个发送位被并进一次采样,收到的字节数少于发出的
- 两端一致:字节数一一对应
所以操作是:发一个已知长度的短串(比如 ASCII 的字母 A,字节值 0x41),然后数收到几个字节。收得比发得多,说明你这端的速率高于对端,该往下调;收得比发得少,往上调。它给的是方向,不是精确倍数。★ 而且这个判据只在两端相差较大时才明显:相差不到一档时字节数可能仍然一一对应、只是内容错位,所以字节数对得上并不能直接排除波特率。
有两处要注意。一是这个判据在两端速率相差较大时才明显,相差不到一档时收到的字节数可能仍然一一对应,只是内容错位,那就该走下一条读法。二是它成立的前提是你这端只改波特率、其余参数不动,否则字节数的变化就分不清是哪一项造成的。
读法三:帧格式错的样子,和波特率错不一样
字节数一一对应但内容不对,说明波特率大体是对的,错的是帧格式。UART 一帧的结构是固定的:一位起始位(拉低)、若干位数据(低位先发)、可选的一位校验位、一到两位停止位(拉高)。参数记法形如 8N1,三个位置依次是数据位数、校验方式、停止位数。
- 数据位设少了:每帧被提前截断,本该属于数据的最高位被当成了校验位或停止位,收到的字节看起来像原字节被砍掉了高位
- 校验方式设错:数据本身可能还是对的,但接收器会判定校验失败
- 停止位数设错:接收端检查停止位的位置随之错开,在连续发送时容易累积出帧错误
关键动作是看你的工具有没有提供错误计数(不是所有工具都有)。如果能看到帧错误、校验错误在增长,说明问题就在串口这一层的帧格式上;一个错误都没有、字节数也对、但内容读不懂,那就不该继续在串口参数上耗,该往上层的编码或协议去查了。这个区分能避免在参数上空耗。RS232 与 RS485 的参数与电气差异对照,见RS232 与 RS485 串口控制速查。
读法四:显示上的换行不是帧边界
助手把连续到达的字节按”多久没有新字节进来”切成一段一段显示。这个切分依据是接收缓冲区的空闲间隔,不是协议的帧结构。同一条设备回复可能被切成两行显示,两条不同的回复也可能挤进同一行。
这一条在带校验的二进制协议上会直接把人带沟里:你按屏幕上的分行去截取一帧、去算校验值,结果必然对不上,然后开始怀疑设备的校验算法。要数一帧的长度,只能按协议自己的规矩来——固定帧长的按固定帧长,带长度字段的按长度字段读,绝不能拿显示行当依据。
读法五:二进制协议在文本模式下”乱码”是正常的
Modbus RTU 走的是二进制帧,字节取值覆盖整个可能范围,用文本模式看必然满屏方块和怪符号。这不是故障现象,这是显示方式选错了。 判断一帧 RTU 是否成立要看的是结构:从站地址、功能码、数据段、末尾的 CRC,并且整帧长度符合该功能码的约定。这些在十六进制下一目了然,在文本模式下一样都看不出来。上层读不到数据的完整排查见Modbus 读不到数据排查。
发送侧:那两个看不见的结束符
有的设备的 ASCII 指令要求以回车(0x0D)结尾,也有要求回车加换行(0x0D 0x0A)的,具体以该设备的协议文档为准。麻烦在于这两个字节在文本发送框里是看不见的:它们在不在,取决于你有没有勾上”发送新行”之类的选项,而不同助手对这个选项的默认值并不统一。
“指令写得一字不差、设备就是不理”,有一种成因就是指令本体对、结束符没发出去。最省事的验证办法是切到十六进制发送模式,把整条指令连同结束符一起以字节形式敲进去——这样发出去的东西和你屏幕上看到的完全一致,不存在任何隐藏字符。
收工前:一份能复现的记录长什么样
抓完就关窗口,等于白抓。一份事后还能用的记录至少要有三样东西:
- 原始十六进制,不是文本模式截图
- 当时的完整参数组合:波特率、数据位、校验、停止位、流控,五项一个不少
- 这次用的是哪种接法:取代式直连、单向旁听,还是总线旁听
少任何一样,第二天都没法复现,更没法把结论交给下一个人。如果链路中间还夹着串口服务器,它两侧的参数是各自独立配置的,还要额外记下网络那一侧的配置,否则你排的是设备侧,问题却在转换设备上——串口服务器本身的工作方式见串口转网口选型科普。
最容易栽的坑
三个坑都不难懂,偏偏都在流程里排在”不起眼”的位置:用文本模式看二进制协议然后断定设备坏了;拿屏幕上的换行当帧边界去算校验;抓完没记参数组合,第二天所有结论作废。
它们都不是技术难题,都是流程上少做了一步。真正需要点判断力的只有一处:在 RS-485 总线上做旁听时,务必先确认助手不会往总线上发送任何东西——包括那些定时发送、自动重发的勾选项。你接进去是为了看清问题,不是为了在总线上多制造一个抢线的设备。
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。