串口乱码:按顺序做 7 项检查
串口乱码意味着一方读到的不是另一方写出的内容。字节通常还在,只是帧格式、接线或适配器把它们变成了 ÿ、问号、方块或半截 MODBUS 帧。本页按最快找到故障的顺序给出各项检查,从两分钟就能完成的检查到需要换一个适配器的检查,并说明串口监视器在每一步能省下什么功夫。
乱码是什么样子,通常意味着什么
乱码的形态能在您动手改设置之前缩小排查范围。在表中找到您的情况,从它指向的检查开始;本页其余部分会按顺序讲完全部七项。
| 您看到的现象 | 最可能的原因 | 从哪项开始 |
|---|---|---|
| 无论设备做什么,只显示 ÿ (0xFF)、0x00 或同样的几个符号 | 波特率与设备相差很远,每个字节都通不过帧校验 | 检查 1 |
| 文本可读,但每隔几个词就有一个错字符 | 校验位或停止位与设备不一致,或长线路、无屏蔽线路上有干扰 | 检查 1 和 4 |
| 文本正确,但各行连在一起,或每行后面多出一个空行 | 行结束符:设备发送 CR、LF 或两者,而查看器期望的是另一种 | 检查 6 |
| 期望看到文本,却是二进制垃圾 | 协议本身是二进制的,目前还没有任何问题 | 检查 6 |
| MODBUS 帧不完整,或主站报告 CRC 错误 | 帧格式、终端电阻、缺少共地、两个从站地址相同,或转换器切换方向太晚 | 检查 1、4 和 7 |
| 正常几分钟或几小时后变成乱码或无声,重新连接才恢复 | 适配器、其 USB 电源管理、线缆或插口 | 检查 5 |
| 在一台 PC 上正常,同一设备在另一台上乱码 | 适配器或驱动程序不同,默认设置不同 | 检查 1 和 5 |
七项检查,按顺序进行
检查 1:让两端的波特率和帧格式一致
四个值必须一致:波特率、数据位、校验位和停止位。以设备手册为准。如果手册丢了,9600 8N1 是最常见的出厂默认值,其次是 19200 和 115200;有些电表和 PLC 出厂时使用偶校验,把 8E1 的设备按 8N1 读取,得到的正是"每隔几个词一个错字符"的现象。
陷阱在于您自己程序的设置对话框。它显示的不一定是它实际发送的:应用程序可以在打开端口之后更改这四个值中的任何一个,错误的配置文件、回退到的默认值或驱动程序自身的默认值都可能覆盖对话框。看清真相有两种办法:

检查 2:确认端口和设备都没找错
关掉设备后乱码依然不变,说明乱码不是设备发来的。USB 适配器在重新启动或更新驱动程序后会更换 COM 编号,两个适配器在只显示编号的端口列表里看起来一模一样,而且在很多 PC 上,COM1 属于主板上的管理引擎,并不对应任何接口。打开 Advanced Serial Port Monitor 的端口列表:它显示每个端口及其设备名称,例如"COM7 - USB Serial Port (FTDI)",适配器和编号一眼就能对上。找到应用程序使用的 COM 口介绍了其他方法。如果端口能打开但什么数据都没有,那是另一种故障;请参阅 COM 口不工作。
检查 3:除非设备需要,否则关闭流控制
流控制不会把字节弄乱,而是把字节拿走。在没有相应信号线的线缆上使用硬件流控制 (RTS/CTS),会让 PC 或设备一直等待一个永远不会到来的信号,于是数据一阵一阵地到达、中间有空缺,或者干脆不到。软件流控制 (XON/XOFF) 对二进制协议更糟:字节 0x11 和 0x13 被当作控制字符吞掉,二进制帧到达时少一两个字节,校验和随之失败。先把流控制设为 None,然后只把设备手册要求的部分加回来。监视器会显示各控制信号线的状态,并允许手动切换 RTS 和 DTR,由此可以判断设备是否在等待某条信号线。

检查 4:接线、地线和总线
设置正确而数据仍然不对,故障就在线路上,任何软件设置都修不好。按以下顺序检查:
- RS232:交叉线还是直连线。PC 连设备通常需要直连线;两台计算机,或两台都作为终端的设备,需要 TX 和 RX 交叉的零调制解调器线。用错线缆得到的多半是无声或回显而不是乱码,但只接了部分线芯的线缆两种情况都可能出现。5 脚(信号地)必须接上;没有它,接收端没有参考电平,读到的只是噪声。请参阅 RS232 引脚和信号。
- RS485:A 和 B、终端电阻和地线。A、B 线接反会使信号反相。长线路需要在两端各接一个 120 欧姆终端电阻,而不是接在中间。转换器与设备之间缺少共地是那种随天气变化或电机启动时来来去去的错误的典型原因;即使总线没有地线也"能用",也请多拉一根地线。
- 一次只留一个设备。把总线上的设备拆到只剩一个。两个地址相同的从站会同时应答并互相破坏对方的帧,一个发送器损坏的设备会拖垮整条总线。如果单个设备读取正常,再把其他设备一个一个加回来。
- 长度和干扰。RS232 的规范距离约为 15 米;超过这个距离要降低波特率或改用 RS485。串口线缆要远离电源线和变频器,使用屏蔽线并在一端把屏蔽层接地。
RS485 软件页面(英文)展示了 PC 接入两线制总线以及监听正在运行的总线的接线方法。

检查 5:适配器、驱动程序和线缆
大多数 PC 通过 USB 转串口适配器或 USB 转 RS485 转换器连接串口设备,而当数据正常一段时间后突然出错时,适配器是最常见的祸首。应对办法:
- 换一个。这是所有测试中最快的。如果换一个芯片不同的适配器就能正常读取同一设备,故障就找到了。采用 FTDI、Silicon Labs CP210x 或 WCH CH340 芯片并配合原厂驱动程序的适配器是可靠的选择;当前的 Prolific 驱动程序会拒绝仿冒的 PL2303 芯片,这就是为什么在旧 PC 上能用的适配器到了新 PC 上就罢工。
- 阻止 Windows 关闭它的电源。在设备管理器中打开适配器所在的 USB 集线器和端口,在"电源管理"选项卡中取消勾选"允许计算机关闭此设备以节约电源"。设备停顿一会儿就没声音、重新连接后又恢复,往往就是这个原因。
- 绕开集线器和过长的 USB 线。把适配器直接插到 PC 上。无供电的集线器和细的延长线会拉低电压,让适配器在负载下复位。
- 检查驱动程序。设备管理器里的黄色标记,或者时隐时现的端口,需要的是厂商的驱动程序包而不是通用驱动。Windows 更新后 USB 转串口适配器不工作一节讨论了驱动程序方面的问题。
- 加载测试。如果故障只在持续通信时出现,用 COM 口压力测试跑一遍端口,看看错误从多高的速率开始出现。
检查 6:文本、二进制和行结束符
有些乱码并不是乱码。把监视器切换到 HEX 视图。如果字节按某种模式重复、以相同的包头开始,或者构成 CRC 正确的有效 MODBUS 帧,那么数据是二进制的,唯一的错误只是把它当成文本来读。如果文本可读但排版奇怪,问题在行结束符:设备发送 CR、LF 或 CR LF,而期望另一种的查看器会把行连在一起或加倍显示。ASCII 视图会显示控制字符,右键菜单可以发送 CR、LF 或两者,方便测试设备希望收到哪一种。另外两种情况:使用 7 个数据位的设备会把所有大于 127 的字节显示为错字符;非英文文本需要使用设备的代码页才能正确显示。

检查 7:时序和半截帧
帧被切成两段到达,或者缺少开头几个字节,这是时序故障而不是数据故障。常见原因:
- RS485 的方向切换。半双工转换器必须在应答开始之前关闭自己的发送器。需要由 PC 来切换方向的转换器,除非程序在恰当的时刻控制 RTS,否则会切掉每个应答的前几个字节;Advanced Serial Port Monitor 正是为这类转换器提供了 RS485 模式。带自动方向控制的转换器则不存在这个问题。
- 帧间静默。MODBUS RTU 要求帧与帧之间有 3.5 个字符时间的静默。主站在应答结束前就发出下一个请求,或者从站应答太快、转换器来不及切换,都会把帧合并在一起。
- 适配器缓冲。FTDI 适配器默认每 16 毫秒向 Windows 交付一次数据(端口高级设置中的延迟计时器),因此一帧可能在缓冲区边界被拆开,或者两个短帧被合在一起交付。字节本身完好无损;应用程序必须按长度或分隔符重组,而不是按每次读取调用。
时间戳能分清是哪一种情况。监视器里的每个数据包都带有精确到毫秒的时间以及距上一个包的间隔,因此被拆开的帧会显示为相隔几毫秒的两个包,方向切换太晚则表现为开头少一个字节的应答。对于 MODBUS,MODBUS 插件(英文)会把原始请求和应答与解码后的数值并排显示,并标出 CRC。

是软件还是线路?
一个测试就能把两者分开。用 Advanced Serial Port Monitor 的手动模式、以检查 1 得到的设置打开设备,读取一分钟。
- 监视器读取正常。设备、适配器和线路都没问题,故障在应用程序里:用 Spy 模式观察应用程序,把它请求的参数和发送的帧与手动模式下正常工作的情况对比。配置文件里写错的波特率、忘了关的流控制,或者在缓冲区边界拆帧的读取例程,在第一屏就会现形。
- 监视器在任何设置下看到的都是同样的垃圾。故障在字节层之下。回到检查 4 和 5:换一个适配器、加一根地线、接一个终端电阻。这些都用尽之后,下一件工具是接在线路上的逻辑分析仪或示波器,它能显示软件看不到的波形。
测试期间用 Write to file 按钮保存会话日志。带时间戳的日志正是设备厂商的技术支持会向您索要的东西,也让您能在更改前后进行对比,而不必依赖记忆。
FAQ
为什么我的串口只显示 ÿ 或奇怪的符号?
以错误的波特率接收的字节通不过帧校验,接收端会把它报告为 0xFF(显示为 ÿ)或另一个固定值。如果每个字节都一样,说明波特率相差很远,例如 9600 对 115200。在设备发送数据时逐个尝试标准波特率,到正确的那一个时文本就会变得可读。如果符号随数据变化但始终不对,说明波特率已经接近,错的是校验位或停止位。
波特率正确,数据还会是乱码吗?
会。校验位和停止位会造成零星的错字符;缺少信号地或线路有干扰会造成时有时无的错误;软件流控制会从二进制数据中拿走字节;快要坏掉的适配器会先正常一段时间再输出垃圾。检查 3 到 5 按顺序覆盖了这些情况。
为什么 RS485 上是乱码,RS232 上却没有?
RS485 在同样的字节之上加了一条共享的半双工总线。A、B 线接反、长线路缺少终端电阻、转换器与设备之间没有共地、两个从站地址相同,或者转换器切换方向太晚,这些都会产生 RS232 点对点连接永远不会遇到的错误。把总线精简到一个设备加一个转换器,然后一个一个地把设备加回去。
为什么二进制数据里会丢字节?
首先怀疑软件流控制:启用 XON/XOFF 后,字节 0x11 和 0x13 会被当作控制字符,永远到不了应用程序。在没有 RTS 和 CTS 信号线的线缆上使用硬件流控制造成的是空缺而不是丢失。如果两者都没有启用,把监视器的 HEX 视图和应用程序收到的内容对比;监视器显示了这些字节而应用程序没有,说明是应用程序的读取例程把它们丢掉了。
Windows 会自己更改串口设置吗?
不会。设备管理器"端口设置"选项卡中的值只是给那些不自行设置参数的程序用的默认值;大多数程序每次打开端口时都会自己设置波特率和帧格式。Windows 确实会更改的是 USB 适配器的 COM 编号,在更新驱动程序或换用另一个 USB 插口之后,这会把您的程序引向错误的设备。检查 2 讨论了这一点。
相关页面:端口根本打不开时,请看五种常见 COM 口错误;需要查看另一个程序发送了什么时,请看串口嗅探器(英文);产品页面有完整的功能列表和 14 天免费试用。
另请参阅
Windows 11 和 10 中 COM 口不工作:5 种解决方法
在 Windows 11 中列出 COM 口并找到占用端口的程序
COM 口无法打开、拒绝访问:5 种修复方法
在 Windows 11 中检查和测试 COM 口:CMD、PowerShell
串口乱码:按顺序做 7 项检查