ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

串口通信三兄弟:TTL、RS232与RS485的电气原理与工程选型

串口通信三兄弟:TTL、RS232与RS485的电气原理与工程选型 1. 从“串口”开始一个便利贴背后藏着三种不同的物理层先说个现象。很多刚接触嵌入式的朋友在淘宝上搜“串口模块”结果跳出来 USB 转 TTL、USB 转 RS232、USB 转 RS485 好几种有些甚至写着“三合一”。买回来后按网上的教程接线明明接对了数据就是出不来。然后就开始怀疑人生怀疑模块怀疑杜邦线质量。其实这种问题十有八九是没搞清楚这三兄弟虽然都叫“串口”但电气层标准完全不是一回事。以我这些年的经验来看嵌入式开发中的所谓“串口”日常语境里其实被混用了三层东西一层是 UART 这类的通信协议/帧格式一层是 TTL、RS232、RS485 这种电气接口标准另一层才是我们看到的物理连接器比如杜邦针、DB9、接线端子。很多教程把这三层揉在一起讲结果越讲越乱。把这层窗户纸捅破后续所有问题都能顺势解开。本文就用一种“复习专用”的梳理方式把 TTL、RS232、RS485 的原理、特性、应用场景、接线方法、调试手段全部过一遍顺便把面试里常考的坑也一并填掉。不管你是在准备笔试面试还是要做实际项目选型这篇文章都能当参考资料反复翻。2. TTL电平接口嵌入式工程师打交道最多的串口2.1 电压区间与逻辑判定TTL 串口准确说是“符合 TTL 电平的 UART 接口”这是芯片和芯片之间通信最常用的形态。STM32、ESP32、各种 ARM 处理器的 UART 引脚基本上都是 TTL 电平。这里的核心逻辑是高电平表示逻辑 1低电平表示逻辑 0。对于 5V TTL 来说输入高电平的最小阈值是 2.0V输入低电平的最大阈值是 0.8V输出高电平至少要达到 2.4V输出低电平要低于 0.4V。简单理解就是高于 2V 基本算 1低于 0.8V 基本算 0中间那一段灰色地带尽量避免。不过现在大量 MCU 工作在 3.3V 甚至 1.8V比如 STM32F103 的 GPIO 电平就是 3.3V。这时候 TTL 的逻辑判定区间也会相应变化但官方数据手册里会给 V_OH、V_OL、V_IH、V_IL 四个参数。我给大家的建议是判断两个芯片的 TTL 串口能不能直连不要只看工作电压相同要看四个参数是否匹配。例如 3.3V 输出的高电平如果只有 2.8V接到 5V TTL 的输入上虽然 2.8V 大于 2.0V理论能识别但噪声容限已经很小了。反过来 5V TTL 输出接到 3.3V 芯片的输入如果芯片引脚不是 5V 容忍引脚轻则读数异常重则烧毁 IO。这类问题我在用 STM32 接老式 5V 传感器模块时踩过不止一次。2.2 UART 帧格式与空闲电平TTL 串口传输数据的格式由 UART 协议决定空闲时 TX 线保持高电平要发送数据时先拉低一个位时间作为起始位然后从低位到高位依次发送数据位一般 8 位后面可选的校验位最后至少一个停止位拉回高电平。比特率就是每秒发送多少位常见的有 9600、115200 等。很多人调不通串口第一反应是换接线、换模块其实最常忽略的就是波特率。两边波特率不一致你拿逻辑分析仪看波形明明是有的数据却全是乱码。调试时我习惯先用一个简易逻辑分析仪抓波形数一下起始位到停止位中间有多少个位手动判断波特率。还有一个更省事的办法直接把波特率调到 115200 或 9600 轮流试配合十六进制显示看哪组数据能稳定复现同一串内容。经验上串口调试助手显示一堆 0xFF 或 0x00十有八九是波特率不对而不是线接错了。2.3 TTL 串口直连的接线原则两个 TTL 设备互联最容易被新手忽略的是“交叉接线”。A 的 TXD 要接 B 的 RXDA 的 RXD 接 B 的 TXDGND 必须共地。少数学长教程里写“TXD 接 TXD、RXD 接 RXD”是用于“串口互联测试”还是“交叉线”答案很明确通信必须交叉。另外还有一个低级错误只接两根信号线不接 GND导致两边参考地不同偶尔能通偶尔乱码。串口通信是单端信号收发双方必须共地这一点在 USB 转 TTL 模块和嵌入式板子之间也适用不要偷懒只插 TXD/RXD。3. RS232 接口负逻辑里的老江湖3.1 为什么工业设备上还要用 RS232TTL 电平的优势是直接方便但致命弱点是传输距离短、抗干扰差。长距离布线时TTL 的电压摆幅小线缆上的压降和噪声很容易把信号淹没。于是 RS232 标准出现了它把逻辑电平做了大幅度的搬移逻辑 1 用负电压表示范围一般在 -3V 到 -15V逻辑 0 用正电压表示范围在 3V 到 15V。空闲状态下 TX 线保持在负电压mark 状态。这种负逻辑设计在现在的嵌入式开发中看起来很奇怪但放在几十年前的设计背景下负电压对噪声的容限更高抗干扰能力比 0~5V 的 TTL 强不少。RS232 的另一个特征是单端传输也就是说每个信号跟地之间定义一个电平。它的理论通信距离一般说 15 米左右实际工程中在 9600 波特率、线材质量还可以的情况下跑到二三十米也不是没可能但再远就建议别头铁了该上 RS485 就上 RS485。RS232 一般用于两台设备之间的点对点通信比如老式工控机、路由器 console 口、部分 PLC 调试口。3.2 DB9 的引脚定义与交叉线很多同学第一次接触 RS232 是在路由器或交换机上看到一个 DB9 母头或者公头不知道哪根是 TXD哪根是 RXD。标准 DB9 公头引脚定义里2 脚是 RXD3 脚是 TXD5 脚是 GND。如果自己做线需要用万用表量导通不要凭感觉焊因为市场上非标线序特别多。另外很多设备上标注的是 DTE 和 DCE 之分DTE 设备如电脑的 TXD 在 3 脚RXD 在 2 脚DCE 设备如 Modem恰好相反。两个 DTE 设备互连要用交叉线一个 DTE 接一个 DCE 才用直通线。实际调试 RS232 时如果没有现成的串口线最稳妥的办法是买一个 USB 转 RS232 的成品线注意芯片选 CH340 或 FT232别买那些无牌芯片的驱动问题会让你怀疑电脑有问题。拿到手先做一次回环测试把调试工具的 RXD 和 TXD 短接自发自收能收到说明 USB 转串口链路本身是好的。这招在排查所有串口问题时都适用下面还会再细讲。3.3 TTL 转 RS232 的电平转换电路现代 MCU 不可能直接输出 ±12V 的 RS232 电平所以需要转换芯片。经典的方案是 MAX232 或者 MAX3232。MAX232 内部有电荷泵用 5V 供电就能产生 ±10V 左右的 RS232 电平不需要额外负压电源。MAX3232 则是 3.3V 版本。这类芯片的典型电路里需要外接 0.1uF 到 1uF 的电荷泵电容电容位置反了或容量不对芯片输出的负压会异常导致通信失败。我做过一块小板把 STM32 的 TTL 串口转成 RS232 去接老式打印机。第一次画板时照着数据手册放电容结果怎么调试都不出数据后来用万用表量 RS232 侧的 TX 空闲电压发现只有 -2V低于 RS232 接收端的识别阈值 -3V。查了很久才发现是电荷泵电容用了贴片 0402 的 X5R容量在偏压下衰减严重换了 0603 的 X7R 电容后电压就到了 -8V 左右通信马上就正常了。这类细节数据手册不会刻意提醒你但实际设计时特别容易翻车。4. RS485 接口差分总线才是工业界的主角4.1 差分信号为什么抗干扰RS485 能成为工业现场的主流串口核心在于它使用了差分传输。所谓差分就是同一路信号用两根线 A、B 上的电压差来表示A 比 B 高时是逻辑 1A 比 B 低时是逻辑 0。接收端只认这两根线之间的差值对外部共模干扰有天然的抑制能力。现场总线很长电机启停、变频器开关都会产生强烈的电磁干扰单端信号在这种情况下基本废掉但差分信号能扛住。而且 RS485 的驱动能力比 RS232 强得多传输距离可以到 1200 米左右波特率在短距离下能跑到 10Mbps 以上。它的组网方式是总线型一条双绞线上可以挂多个节点标准的“32 个单元负载”意味着能带 32 个标准收发器。如果用了 1/4 负载的芯片节点数量还能翻倍到 128 甚至更多。这也是为什么楼宇自控、工业控制、光伏逆变器、充电桩通信等场合清一色选 RS485。4.2 两线制半双工组网与终端电阻RS485 最常见的用法是两线制半双工A、B 两根线公用同一时刻只能有一个节点发送其他节点接收。发送和接收的切换由收发器的 DE发送使能和 RE接收使能引脚控制实际用的时候 DE 和 RE 常常接在一起通过一个 GPIO 或者自动方向电路切换。接线时要注意 A/B 千万别接反否则所有通信都无效。现在很多 RS485 模块上把 A 标成 DB 标成 D-意思一样但不同厂家的丝印五花八门接之前一定查手册确认。总线两端还要各接一个 120Ω 终端电阻。这个电阻的作用是吸收信号在总线末端产生的反射减小波形振铃。很多新手在实验室里短距离测试时不接终端电阻也能通一到现场长距离、多节点就出现偶发乱码这时候再想起终端电阻已经晚了。按 RS485 标准总线特性阻抗约 120Ω所以终端电阻取 120Ω 最合适。不过如果节点很少、距离很短接不接终端电阻影响不大但多节点长距离现场两端各接一个 120Ω 几乎是必须的。4.3 自动换向电路的原理与坑两线制半双工需要频繁切换发送和接收方向很多场景下不想占用额外 GPIO于是出现了“自动换向电路”。这类模块通常是在 TXD 空闲时让 DE/RE 为低电平进入接收状态TXD 发送起始位时拉高 DE数据发完再恢复接收。实现方式有很多最简单的用三极管或 MOS 管搭复杂一点的用带自动方向功能的芯片比如 MAX13487。热门搜索里有人问“用 MOS 搭建的硬件 RS485 自收发电路波特率 230400 是否有问题”我的回答是大概率有问题。原因是自动方向电路本身有切换延迟发送完最后一个字节后 DE 不能立刻拉低否则最后一个停止位会被截断。有些电路设计时在 TXD 引脚上加 RC 延时用电阻电容的充放电来控制关断时间波特率低时延时够用波特率高了 RC 延时跟不上就会出现一帧数据最后一位被切掉对端始终报错。230400 这个波特率位时间只有约 4.3 微秒RC 延时要控制在亚微秒级别普通分立元件搭的电路很难稳定做到。所以我的建议是如果波特率超过 115200 且对可靠性要求高要么换用带自动方向控制的专用芯片要么老老实实用 GPIO 控制方向别在分立电路上硬刚。4.4 RS422 与 RS485 的关系RS422 和 RS485 经常被放在一起说但它们不是同一个东西。RS422 是四线制全双工两对差分线一对用于发送一对用于接收收发可以同时进行。RS485 两线制半双工只有一对差分线。RS422 的驱动能力通常只支持 1 个驱动器和最多 10 个接收器RS485 则支持多点通信。实际项目中如果要求全双工、点对点、距离远RS422 是个选择如果要多点组网RS485 更合适。很多 RS232 转 RS422 的设备其实就是两路独立的差分收发器在内部转接。5. 三张表讲透选型与笔试面试复习5.1 电气特性横向对比面试官最爱让你对比三种接口直接背这张表就够了项目TTL 串口RS232RS485RS422信号方式单端单端差分差分逻辑 1高电平2V以上负电压-3V~-15VA 高于 BA 高于 B逻辑 0低电平0.8V以下正电压3V~15VA 低于 BA 低于 B最大距离1 米左右板级约 15 米约 1200 米约 1200 米通信方式全双工全双工半双工两线/全双工四线全双工节点数量点对点点对点最多 32 个单元负载1 发 10 收抗干扰能力弱中等强强需要指出的是表格里的距离和速率是典型的工程经验值不是绝对界限。TTL 串口在良好条件下也可以做到几米RS232 在低波特率下也能跑更远RS485 在 10 米之内甚至可以跑到几十 Mbps。面试时先答标准值再补充一句“实际受线材、波特率、环境干扰影响”会显得更有工程经验。5.2 实战选型逻辑做具体项目时怎么选接口我的顺序是先看距离和组网再看是否需要全双工最后考虑接口电平转换成本。两块板子之间、MCU 与模块之间通信选 TTL 串口最省事不需要额外芯片注意电平匹配即可。设备需要与电脑调试口连接或与老旧工控设备通信选 RS232。虽然距离有限但老设备普遍支持。现场总线超过十几米、节点不止两个、环境有干扰直接选 RS485。组网时 A/B 线用双绞线屏蔽层单端接地终端电阻按需加。如果既要远距离又要全双工比如某些传感器要求实时回传RS422 也可以考虑但现实中很多设备所谓 RS422 实现得并不规范选型前一定要确认对端设备的引脚定义和协议兼容性。这里多提醒一句不要在一个项目里混用不同电平标准的“串口”。经常有人在电路板上直接把两个模块的 UART 引脚拉出去想着反正都叫串口结果 TTL 电平直接接到 RS232 接口上芯片不烧才怪。电平转换这件事必须明确做在硬件里不能靠“好像兼容”去赌。5.3 嵌入式面试高频题目速答下面几道题在嵌入式面试“八股文”里出现频率很高我把答案整理成了适合背诵的口语化版本UART、USART、串口有什么区别USART 在 UART 基础上增加了同步时钟功能能工作在同步模式日常说的串口一般指 UART 异步串口。TTL 和 RS232 最本质的区别是什么电平标准和逻辑极性不同。TTL 高电平为 1RS232 负压为 1所以两者不能直接互连必须加电平转换芯片。RS485 为什么要用 120Ω 终端电阻为了匹配总线特性阻抗吸收信号反射降低振铃和误码。RS485 总线上最远能传多远标准典型值 1200 米但距离越远波特率要相应降低还要考虑线缆截面积和接地。RS232 属于什么总线仲裁机制RS232 是点对点、单主单从的总线结构不存在总线仲裁属于最简单的独占式通信。这类题目不需要死记硬背理解物理层逻辑后现场推导也不难。面试官真正想听的不是定义而是你能否解释清楚“为什么”。6. 调试实录从“收不到数据”到稳定通信的排查路径6.1 回环自测是最快的硬件验证方式很多同学调试串口一上来就怀疑代码、怀疑库函数版本其实硬件链路的验证非常简单把本地设备的 TXD 和 RXD 短接然后在调试助手里自发自收。能收到完整数据说明 MCU 的 UART 外设、引脚配置、时钟和波特率基本没问题。这招在 USB 转 TTL、USB 转 RS232、RS485 模块上一样适用。RS485 模块做回环时要把 A、B 短接吗不是半双工回环测试是用杜邦线把模块自己的 A 和 B 短接吗答案是对于许多半双工 RS485 模块可以通过把 A 和 B 短接来形成环回但最好用两个模块做“自发自收”更直观。实测中我更推荐一种组合测法准备两个 USB 转 TTL 模块A 的 TXD 接 B 的 RXDA 的 RXD 接 B 的 TXDGND 相连然后 A 发“hello”B 能收到再换方向 B 发 A 收。这样的双向测试可以排除单根线虚焊、接触不良的问题。杜邦线用久了氧化很常见插拔几次就接触不良回环自测时偶尔通偶尔不通先把线换掉再说别的。6.2 示波器与逻辑分析仪的波形怎么看当回环自测通过但设备与设备之间不通时就要上工具看波形了。示波器看 TTL 和 RS232 电平很方便接在 TX 引脚上按触发模式抓起始位下降沿能看到一帧完整的 UART 波形。判断波特率有个土办法测出最短脉冲一个位时间的宽度用 1 除以宽度就是波特率。比如最短位时间约 8.68 微秒对应波特率约 115200。RS232 用示波器看时要注意探头地线夹子接 GND表笔分别测 TXD 和 RXD负电压部分是低于 GND 的波形很多钳位二极管会把这个负压吃掉这也是 RS232 转换芯片容易损坏的隐藏原因之一。逻辑分析仪更适合看多路信号比如 RS485 自动换向电路里同时测 TXD 和 DE 的时序能直观看到 DE 拉高是否覆盖了完整的数据帧。如果发现 DE 在最后一个停止位还没到就拉低说明自动方向电路的关断延时不够这就是前面提到的 230400 波特率问题的典型现象。6.3 常见故障与排错速查表下面这张表是我多年调试踩坑后整理的按出现频率排序现象大概率原因具体排查方法完全收不到数据TXD/RXD 接反或未共地交叉接线GND 必须相连回环自测收到乱码波特率不一致用示波器量位宽核对波特率设置有时通有时不通接触不良/接线太长换杜邦线减小线长检查虚焊一帧尾丢数据RS485 自动换向DE 关断过快加大 RC 延时或换专用自动方向芯片高波特率误码率高线缆质量差或未接终端电阻换双绞屏蔽线两端加 120Ω 电阻RS232 电平电压不够电荷泵电容老化或容值衰减更换 X7R 电容实测空闲负压低于 -3V 则换芯片这里有个容易被忽略的细节RS485 总线在空闲状态下A 和 B 之间没有电压差接收端输出是不确定的。所以标准电路里通常会在 A 上加上拉电阻、B 上加上下拉电阻让空闲时段总线有一个确定的偏置电压。很多廉价模块省略了这两个电阻单节点调试能通挂到总线上就出现乱七八糟的字节。遇到这类问题先量 A、B 之间的静态电压一般要大于 200mV。7. 接口防护设计实验室能用不等于现场不烧RS485 现场设备工作环境往往比实验室恶劣得多雷击浪涌、静电放电、地电位差都可能打坏收发芯片。因此 RS485 接口防护设计一直是工业设计里的重点。常用措施包括总线入口处加 TVS 管把电压钳位在安全范围串联自恢复保险丝限制过流必要时加气体放电管泄放雷击大电流。如果设备之间地电位差很大还要考虑加隔离用数字隔离器或隔离电源把系统地和总线地隔开。理论说起来一堆实际在我代做过的充电桩通信板里防护设计只要按“共模电感 TVS 自恢复保险丝”组合来做EMC 测试基本能过。TTL 和 RS232 接口也要注意静电不能手摸裸漏引脚后直接接 MCU否则哪天芯片莫名其妙坏了可能就是这个原因。另外很多工程师调试 RS485 时习惯热插拔这其实风险很高。总线两端如果有 12V 甚至 24V 供电的传感器热插拔瞬间会让总线产生大电流冲击轻则损坏收发器重则打坏 MCU 的串口引脚。我的习惯是在总线供电前先把通信线接好断电插拔总功耗由供电回路控制。8. 个人经验总结与复习建议这段内容本来可以写成“总结”但我不太想用那种套路化的结尾。说点个人体会串口接口这块内容在嵌入式工程师的日常里太基础了基础到很多人入职三五年后仍然凭经验接线出了问题靠换模块解决从不深究背后的电气原理。但恰恰是这些“最基础”的部分最能反映一个工程师的功底。我见过不少候选人把 RS232 和 TTL 当成同一种东西也见过有人答得出 RS485 终端电阻的作用但说不清为什么是 120Ω还有人画 TTL 转 RS485 的原理图自动换向电路设计得一塌糊涂却又不敢承认自己没实测过。这些都不是背题能解决的需要动手需要踩坑。如果让我给出一条复习建议那就是不要只记结论要会推导。TTL 为什么不能传输距离远因为摆幅小、单端抗干扰差。RS232 为什么要用负逻辑因为要获得更大的噪声容限。RS485 为什么能带 32 个节点因为标准定义了单元负载每个接收器等效一个 12kΩ 负载。把这些“为什么”串起来你会发现所有接口的特性都是围绕电气特性和应用场景展开的完全不需要死记硬背。最后分享一个小习惯我每次到一个新环境调试电路第一件事永远是花两分钟做一个回环自测再花两分钟用示波器看波形确认时钟、电平和波特率然后再看协议。这个习惯帮我省下了大量的无效排查时间。如果你也被串口调试折磨过不妨试试这个顺序你会发现很多“疑难杂症”根本不用到代码层面就能解决。
返回列表