UART板内正常,一接USB转串口就乱码,先别只改波特率

UART板内正常,一接USB转串口就乱码,先别只改波特率

UART一接电脑就乱码,常见的排查动作是反复试9600、115200。但USB转串口模块到底输出TTL还是RS-232、IO是3.3V还是5V、TX/RX有没有交叉、GND有没有共地,任何一个不对都可能让“波特率看着正确”也收不到正常数据。

UART最烦人的一种故障,是板子自己环回正常,MCU内部日志也正常,一接USB转串口到电脑就开始乱码。

然后大家最爱做的一件事,就是把115200改成9600,再改成57600,再换几个串口工具。

有时候还真能碰巧好一点。

但我一般会先停一下,确认你手里那根“USB转串口”到底是什么东西。

第一件事:先分清TTL UART和RS-232

这两个接口都经常被叫“串口”,但电气层完全不是一回事。

MCU的UART一般是CMOS/TTL电平,空闲状态通常为高;标准RS-232则使用正负电压,而且逻辑极性和TTL UART相反,中间需要专用Transceiver做电平转换。

Analog Devices的RS-232资料专门强调,现代数字系统内部UART不能直接当RS-232接口用。

如果你拿的是USB-RS232线,直接接MCU TX/RX,不只是乱码的问题,还可能让IO承受不该承受的电压。

wKgzfWrYZWWAfSvQAAC87DGHUhM697.png

图1:UART做电平转换以后,高低电平幅度可能和原始侧不同,先确认目标器件门限是否匹配。

如果确定是USB-TTL,再看它到底是3.3V还是5V

USB-TTL也不是只有一种。

以FTDI TTL-232R为例,同一系列就有5V I/O版本和3.3V I/O版本。Datasheet明确区分了两种线缆。

MCU是3.3V供电时,电脑端TX如果直接输出5V,目标IO是不是5V tolerant必须查当前芯片Datasheet,不能默认“数字信号都一样”。

反过来,某些5V逻辑输入对3.3V High是否保证识别,也要看VIH门限。

所以连接之前先量一眼USB转串口TX的空闲高电平,往往比换十次波特率快。

图2:UART一帧由Start、Data和Stop等部分组成,波特率不匹配时采样点会逐渐跑偏。

再看最基础的三件事:共地、交叉、帧格式

TTL UART至少要有共同参考地。只接TX和RX、不接GND,在桌面短线环境里有时候还能“神奇地收一点”,但这不是可靠连接。

TX要接对方RX,RX要接对方TX。模块丝印里的TX到底表示“模块输出”还是“目标设备应该接TX”,便宜模块不一定标得很统一,别只看颜色。

然后才轮到Baud Rate、Data Bits、Parity、Stop Bits。最常见是8N1,但项目如果用了9bit、Even Parity或者特殊帧格式,电脑端也要一致。

wKgzfmrYZWeARUKcAAIXbYz3BfI665.png

图3:用示波器直接量一个bit的宽度,可以很快确认实际Baud Rate是不是设定值。

图4:示波器带UART Decode时,可以同时看模拟波形和解码结果,判断乱码到底来自时序还是电平。

真怀疑波特率,直接在示波器上量一个bit

不要靠“这个115200好像能看到几个字”来猜。

让MCU持续发0x55或0xAA,这种码型边沿多,最好量。

示波器抓住TX,量一个bit的宽度。115200Bd理论Bit Time大约8.68µs;9600Bd约104.17µs。实际偏差如果已经很大,就去查MCU时钟源、分频器和Baud寄存器。

如果bit宽度没问题,但电脑还是乱码,再看电平幅度、过冲、线缆长度和接地。

UART协议很简单,所以乱码反而更适合按“电气层 → 接线 → 帧格式 → 波特率”这个顺序排。上来只改Baud,有时候只是把真正的问题暂时绕过去。

审核编辑 黄宇

  • 随机文章
  • 热门文章

您可以还会对下面的文章感兴趣:

暂无相关文章