ARTICLE DETAIL

资讯详情

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

RS232与TTL电平转换详解:从UART到DB9串口通信

RS232与TTL电平转换详解:从UART到DB9串口通信 之前在做一块 STM32 控制板的时候调试上位机通信时发现一个很典型的现象用 USB 转 TTL 线连接一切正常换成电脑主板自带的 DB9 串口后却完全收不到数据甚至把主板串口芯片烧掉过一次。排查到最后问题根源就在 RS232 电平 和 TTL 电平 的转换上。很多刚接触嵌入式的朋友对 RS232、TTL、UART、串口这几个词往往是一头雾水。实际上它们描述的是不同维度的问题UART 是一种通信时序协议TTL 是数字芯片内部使用的逻辑电平标准而 RS232 则是一套完整的串行通信电气标准。本文就从这里开始把 RS232 电平、RS232 串口接线、常用电平转换电路、调试方法和工程坑点一次讲透帮助大家少走弯路。1. RS232 是什么先理清 UART、RS232、TTL 的关系1.1 为什么初学者经常被这三个词搞混我先说一个常见场景你在淘宝上买了一块“USB 转 RS232”小板然后在设备管理器中看到的是 CH340 或者 FTDI 芯片插上电脑后出现的是 COM 口。于是你自然地以为这个 COM 口输出的一定就是 RS232 电平。但实际拆开外壳你会发现很多“USB 转 RS232”小板其实只是 USB 转 TTL只是把 DB9 接头做成了 RS232 的外形内部是否有真正的 RS232 电平转换电路是看不出来的。另外你去查阅单片机串口外设时又看到大量关于“UART”的讲解它和 RS232 好像讲的是同一件事可电平又不完全一致。这种混乱的根源在于UART、RS232、TTL 分别是协议层、电气标准层、逻辑电平层的概念它们在设备中层层叠叠但并不是等价替换关系。1.2 三者的定义区分UART 是通用异步收发器它规定了数据按帧传输的时序一个起始位、5/6/7/8 个数据位、一个可选的校验位、一个或多个停止位。它不关心信号电压到底是多少伏只关心高低电平变化是否符合时序。RS232 串口通信中最常采用的底层协议就是 UART。TTL 电平是数字芯片内部使用的逻辑电平标准。常见的 5V TTL 系统中高电平为 2V 到 5V低电平为 0V 到 0.8V3.3V 系统中高电平则最高到 3.3V。它使用正逻辑用高电平表示逻辑 1低电平表示逻辑 0。RS232是 EIA美国电子工业协会制定的一套串行通信电气标准全称是 RS-232C 或 EIA-232。它除了定义电平范围还定义了接口引脚、时序关系、机械连接方式等内容是 20 世纪中后期电脑与 Modem、鼠标、工业设备之间最常用的串行接口之一。简单来说单片机内部通过 UART 外设把并行数据变成串行数据然后以 TTL 电平输出如果要把信号发送到 RS232 标准的 DB9 接口就必须经过电平转换芯片把 TTL 电平变换成 RS232 电平同时还要把 TX、RX 方向上的信号分别做逻辑反向。1.3 RS232 的典型应用场景现在虽然新电脑已经很少直接带 DB9 串口但 RS232 在工业控制、仪器仪表、通信设备等领域依然活跃典型场景包括工控触摸屏与 PLC、单片机控制器通信例如维纶通、昆仑通态触摸屏的 COM 口。基恩士 KV 系列 PLC 与上位机通信。迪文串口屏、组态屏与主控板之间进行指令交互。老式数控机床、称重仪表、UPS 监控接口。银行 POS 机、医疗设备等对稳定性要求高的低速通信场合。在这些场景里RS232 电平标准仍然被作为工业设备之间的“通用语言”所以掌握 RS232 串口的电平定义、引脚含义和转换电路是做嵌入式开发和工业通信调试的基础功。2. RS232 电平到底是多少伏2.1 RS232 电平的电压范围标准RS232 标准规定的电平范围如下信号逻辑状态电压范围典型电压发送端逻辑 0数据 05V ~ 15V12V发送端逻辑 1数据 1-5V ~ -15V-12V接收端逻辑 03V ~ 15V—接收端逻辑 1-3V ~ -15V—未定义区域—-3V ~ 3V—注意两个关键点第一RS232 使用的是负逻辑。这和 TTL 恰好相反TTL 中高电平代表逻辑 1低电平代表逻辑 0而在 RS232 中正电压12V 附近代表逻辑 0负电压-12V 附近代表逻辑 1。第二RS232 接收端允许的电压范围比发送端宽从 3V 到 15V 都可以识别为逻辑 0从 -3V 到 -15V 都可以识别为逻辑 1。也就是说接收端有 2V 左右的噪声容限这比 TTL 的噪声容限大不少因此 RS232 在较长距离的工业通信中比裸 TTL 抗干扰能力更强。2.2 TTL 电平标准与 3.3V/5V 系统常见的 TTL 电平分为两类5V TTL 系统逻辑 1高电平2V ~ 5V通常在输出端约为 5V。逻辑 0低电平0V ~ 0.8V。3.3V CMOS/LVTTL 系统逻辑 1高电平2V ~ 3.3V。逻辑 0低电平0V ~ 0.8V。有了上面的对比你就会明白为什么单片机的 TX/RX 引脚不能直接接到 RS232 DB9 接口上RS232 空闲时输出为 -12V 左右的逻辑 1而单片机引脚如果输入负压轻则导致内部 ESD 保护二极管导通重则烧毁引脚。RS232 的数据 0 是 12V 左右远超 3.3V 或 5V 单片机引脚耐压范围直接连接可能损坏单片机。反过来单片机输出的 TTL 高电平一般只有 3.3V 或 5V正电压幅度达不到 RS232 接收端要求的 3V 以上倒还好但 TTL 低电平是 0VRS232 接收端会把它当成“未定义区域”不能可靠识别。所以在任何需要连接真实 RS232 设备的电路中电平转换电路都是必须的而不是可选项。2.3 那 -12V 是从哪里来的很多初学者会问一个问题电脑主板上的串口怎么会有 -12V难道是主板上还有一个 -12V 电源吗确实有。PC 主板的 PCI/ISA 电源总线上会提供 -12V 这一路电源但它的驱动能力非常弱电流一般只有几百毫安甚至更小。而 RS232 需要的正是这种“正负双电源”的环境。单独靠单片机控制板上的 3.3V 或 5V 单电源是没有负压来源的所以才会用 MAX232 这类电荷泵芯片来产生 -12V 左右的电压这也就是很多电平转换芯片内部都内置“电荷泵”的原因。3. RS232 串口接口与引脚定义3.1 DB9 引脚的定义提到 RS232 串口很多人第一反应是那个梯形 DB9 插头。DB9 分为公头带针和母头带孔两种常见引脚定义如下引脚号信号名称作用说明方向以 DTE 为准1DCDCarrier Detect 载波检测输入2RXDReceive Data 接收数据输入3TXDTransmit Data 发送数据输出4DTRData Terminal Ready 数据终端就绪输出5GNDSignal Ground 信号地—6DSRData Set Ready 数据设备就绪输入7RTSRequest To Send 请求发送输出8CTSClear To Send 允许发送输入9RIRing Indicator 振铃指示输入这 9 个引脚中真正用于最基本数据通信的只有 2RXD、3TXD、5GND三根。其他引脚用于 Modem 拨号、流控和链路检测等扩展功能我们做普通的 RS232 串口通信时不一定全部要用。这里有个容易混淆的点DB9 公头 2 脚是 RXD、3 脚是 TXD这是针对 DTE 设备例如电脑而言的。很多 DB9 面板上标注的 TXD 是指这个设备自己的发送脚而不是对面设备的发送脚。所以实际的串口调试中不要只看公头还是母头要看当前板上信号的功能定义。3.2 最简单通信最少需要哪几根线在设计 RS232 通信电路时如果只是收发数据不做硬件流控那么三线制接法就够了设备 A 的 TXD 接设备 B 的 RXD。设备 A 的 RXD 接设备 B 的 TXD。两边的 GND 接 GND。也就是说信号线需要交叉连接。很多新手把两块开发板用“TXD 接 TXD、RXD 接 RXD”的排线直接连结果两边都收不到数据。这本质上就是因为没有理解发送端必须连接对端的接收端。如果是两个串口设备之间通过 DB9 直连通常要做成交叉线即“2 对 3、3 对 2、5 对 5”。市面上某些成品 DB9 线是直通线用于连接电脑与 Modem 这类 DTE-DCE 组合而用于电脑与单片机调试板如果单片机板子模拟 DTE时多半需要交叉线买线材时要特别留意。3.3 如何判断你手上的串口是 TTL 还是 RS232拿到一块板子或者一个转接器时最稳妥的方法不是看丝印而是直接用万用表测量串口的空闲状态电压如果 TXD/RXD 空闲时测量到 -5V ~ -12V 左右说明这是 RS232 电平。如果 TXD/RXD 空闲时测量到 3.3V 或 5V说明这是 TTL 电平。如果 TXD 上测量到 0V 且 RXD 上有 3.3V 之类的电压要检查芯片是否已经进入发送状态或电路是否正常。一个 RS232 收发器在空闲时TXD 输出端应该保持逻辑 1也就是负电压。假如你测量 USB 转 RS232 线的 TXD 在空闲时是 5V 或 3.3V那么这根线大概率只是 USB 转 TTL并不能直接连接标准的 RS232 设备。4. 电平转换电路TTL 和 RS232 之间到底怎么转4.1 为什么不能直接连接我们已经知道TTL 高电平是 3.3V/5V低电平是 0VRS232 的逻辑 1 是负电压逻辑 0 是正电压。从数学上看TTL 高电平对应 RS232 逻辑 0正电压TTL 低电平对应 RS232 逻辑 1负电平所以电平转换不仅要做电平幅度的搬移还要做一个逻辑反向。如果用一句话描述电平转换电路的作用就是把单片机的“3.3V/5V 正逻辑串口”变换为“±12V 负逻辑串口”同时保护两端芯片不被对方的高压或负压损坏。4.2 方案一使用 MAX232/SP3232 专用收发芯片这是最推荐、也最稳定的方案。MAX232 系列芯片内置电荷泵只需要单电源供电就能产生正负两路 RS232 电源电压内部还集成了两路发送器和两路接收器可以同时处理 TX、RX 两路信号。SP3232 是 MAX232 的低功耗替代型号兼容 3.3V 和 5V 供电也常用于便携式设备。典型接线思路如下MAX232 引脚连接对象VCC5V部分型号支持 3.3V按芯片手册GND电源地C1、C1-、C2、C2-4 只 0.1uF 电荷泵电容V电荷泵输出正电压通常接 0.1uF 电容到地V-电荷泵输出负电压通常接 0.1uF 电容到地T1IN单片机 TXDTTL 输入T1OUTRS232 TXD 发送输出R1INRS232 RXD 接收输入R1OUT单片机 RXDTTL 输出用 C 语言伪代码描述一遍连接后的初始化流程// 单片机 UART 初始化示意以 STM32 HAL 库为例具体参数按芯片型号调整 UART_HandleTypeDef huart1; void MX_USART1_UART_Init(void) { huart1.Instance USART1; huart1.Init.BaudRate 9600; huart1.Init.WordLength UART_WORDLENGTH_8B; huart1.Init.StopBits UART_STOPBITS_1; huart1.Init.Parity UART_PARITY_NONE; huart1.Init.Mode UART_MODE_TX_RX; huart1.Init.HwFlowCtl UART_HWCONTROL_NONE; huart1.Init.OverSampling UART_OVERSAMPLING_16; if (HAL_UART_Init(huart1) ! HAL_OK) { Error_Handler(); } }在这个例子中单片机这一侧的 USART1_TX 就会输出 TTL 电平的串口数据把它接到 MAX232 的 T1INMAX232 的 T1OUT 就输出了 RS232 电平的串行数据可以连接外部 RS232 设备的 RXD。4.3 方案二三极管分立电平转换电路在某些低成本、对功耗不敏感的板卡上也会看到用三极管实现电平转换的电路。不过需要先说明三极管分立转换电路要做到真正符合 RS232 标准的 ±12V 输出必须有正负双电源否则输出往往只是“0V 到 5V”或“0V 到 12V”的单极性信号无法达到标准 RS232 接收端的负电平要求。一种常见思路是采用 NPN PNP 对管做发送端。以 TTL 输入信号为例TTL 输入为高电平时NPN 管导通、PNP 管截止输出端被拉到接近负电源电压。TTL 输入为低电平时NPN 管截止、PNP 管导通输出端被拉到接近正电源电压。这个电路本质上是一个推挽反相器。它能实现 TTL 到 RS232 的逻辑反向和电平搬移前提是你手头有 12V 和 -12V 两路电源。实际产品如果想省掉 -12V 电源也可以用电荷泵产生负压但那本质上又回到了 MAX232 的内部原理。我个人的建议是如果只是做实验、学原理三极管电路可以帮助你理解电平转换的本质但如果做产品或者调试稳定性要求较高的工业设备直接选 MAX232/SP3232/MAX3232 这类集成芯片外围元器件少、一致性好、故障率低。4.4 方案三使用 USB 转串口小板调试在开发阶段最常用的是 USB 转串口调试方案。这里要区分两类产品一类是“USB 转 TTL”常见主控是 CH340、CH341、CP2102、FT232。它输出的是 TTL 电平不能直接连接 RS232 设备只能连接单片机或 TTL 接口外围模块。另一类是“USB 转 RS232”常见做法是在 USB 转 TTL 芯片后面再加一个 MAX232 之类的 RS232 收发器最终输出到 DB9 座子。这类产品的 TXD 在空闲时测出来才是负电压。很多调试器品牌还支持免驱动或自动安装驱动但如果你使用 CH340/CH341 芯片第一次接上电脑后如果驱动没自动装上可以考虑到芯片官网下载对应系统的驱动FTDI 芯片也在官网提供全平台驱动。Windows 下确认设备管理器中能看到 COM 口号后再用串口助手打开。5. RS232 通信过程与典型调试验证5.1 一帧数据到底长什么样RS232 串口通信采用异步帧格式常见配置是 8 个数据位、无校验位、1 个停止位也就是常说的 8N1。一帧数据包括以下部分空闲状态线路处于逻辑 1对应 RS232 电平就是负电压。起始位线路跳变到逻辑 0对应正电压表示一帧数据的开始。数据位从最低位 LSB 开始发送依次发送 8 个数据位。停止位线路回到逻辑 1持续 1 位时间表示一帧结束。你可以把 9600 波特率下的每一位时间估算为约 104us而 115200 波特率下每一位时间约为 8.68us。波特率越高每一位时间越短对线缆电容和收发器驱动能力的要求也越高。发送一个 ASCII 字符A十六进制 0x41二进制 01000001时线路上的电平变化顺序为起始位(0) - 数据位:1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 停止位(1)注意数据位是从 LSB 开始发送所以0x41的最低位 1 最先出现在线上最高位 0 最后出现在线上。5.2 用示波器观察 RS232 电平调试 RS232 电平是否正常强烈建议用示波器或者逻辑分析仪直接观察 TXD 波形。下面是使用示波器时的判断要点空闲时RS232 的 TXD 应该是 -3V 到 -15V 之间的负电压。发送数据时起始位会跳变到 3V 到 15V 之间的正电压。数据位中每一位正负电平持续时间应与波特率吻合。例如让串口持续发送 0x55二进制 01010101示波器上应该看到方波频率等于波特率的一半。如果发送 0x01则可以看到单个低电平脉冲后回到高电平的波形。如果示波器显示 TXD 空闲时为 0V或者发送时最高只有 3.3V、最低只有 0V说明你的转换电路并没有真实输出 RS232 电平标准基本可以判断是 TTL 电平不是 RS232 电平。5.3 用 Python 脚本验证串口收发在没有逻辑分析仪的情况下也可以直接让 PC 和单片机对发数据来验证链路。下面是使用 Python PySerial 库读取串口数据的示例。# 文件路径read_serial.py # 在电脑上执行前先安装 pyserialpip install pyserial import serial import time # 根据实际设备管理器中的 COM 口号修改 ser serial.Serial( portCOM3, # Windows 示例Linux 下可能是 /dev/ttyUSB0 baudrate9600, bytesizeserial.EIGHTBITS, parityserial.PARITY_NONE, stopbitsserial.STOPBITS_ONE, timeout1 ) if ser.is_open: print(f串口 {ser.name} 已打开) # 发送一帧测试数据 ser.write(bHello RS232\r\n) # 读取来自对端的数据 time.sleep(0.1) data ser.read(64) if data: print(收到数据:, data) else: print(未收到数据请检查接线和电平转换电路) ser.close()Linux 系统下也可以直接用命令行测试# 查看 USB 转串口设备节点 ls /dev/ttyUSB* # 设置串口参数并发送数据 stty -F /dev/ttyUSB0 9600 cs8 -cstopb -parenb echo -en Hello RS232\r\n /dev/ttyUSB0 # 读取串口数据按 CtrlC 退出 cat /dev/ttyUSB0在 Windows 上则推荐使用常见的串口调试助手比如 SSCOM 工具。打开串口调试助手时需要注意以下几点波特率、数据位、停止位、校验位要和设备端完全一致。勾选“发送新行”时很多工具会在发送内容的最后自动添加\r\n也就是回车换行如果设备需要以回车作为命令结束标志这个功能很重要。接收区设置为文本显示还是 Hex 显示要根据设备协议决定如果收到的是非 ASCII 字节建议切换成 Hex 显示更直观。6. RS232 串口常见问题与排查思路本章整理我在调试 RS232 串口时遇到的高频问题按“现象 - 原因 - 解决思路”的顺序给出方便有经验的开发者快速对照。问题现象常见原因解决思路电脑无法识别 USB 转串口设备CH340/CH341/FTDI 等驱动未安装或驱动版本不兼容进入设备管理器查看是否出现未知设备或黄色感叹号到芯片官网下载对应系统驱动打开串口提示“端口被占用”或“无法打开”串口被其他软件占用或者串口工具未关闭关闭正在使用该串口的软件重新插拔转接器必要时重启电脑收发双方波特率设置不同上位机与设备波特率不一致确认两边的波特率、数据位、停止位、校验位完全一致包括是否有回车换行收不到任何数据TXD 和 RXD 接反没有共地或没有完成 TTL/RS232 电平转换用交叉方式重新连接 TTL 信号检查 MAX232 供电和电荷泵电容用万用表确认 RS232 端空闲电压为负电平收到乱码波特率不匹配、接地不可靠、线缆过长、主时钟偏差大降低波特率选择更好的 USB 转 TTL 芯片检查双方 GND 连接缩短线缆长度电平转换芯片发烫电源接反、引脚短路、信号端口被高压串入断电后用万用表测量 VCC 和 GND 是否短路检查外部 RS232 线是否带电反插设备刚连接时正常长时间运行后死机RS232 线路受外部干扰或地电位差影响产生过压或浪涌增加 TVS 二极管使用屏蔽线保证通信地可靠必要时在 RS232 收发器前端增加隔离方案单片机 3.3V 与 5V 电平互连收不到数据逻辑电平不兼容例如 3.3V 芯片输出高电平为 3.3V低于 5V TTL 高电平阈值使用电平转换芯片或双向电平转换模块完成 3.3V/5V 电压匹配与某些工业触摸屏/PLC 通信不稳定偶发超时只接了 TX、RX、GND但现场干扰大或设备要求硬件流控根据设备手册确认是否需要 RTS/CTS 或 DTR/DSR尝试波特率降到 9600检查接线端子是否松动在排查 RS232 问题时建议遵循一个固定的顺序先检查电平是否真的是 RS232 电平再检查 TX 与 RX 是否交叉接着确认参数是否一致最后才怀疑协议格式和程序逻辑。如果上来就怀疑代码很容易在错误的方向上浪费时间。7. 接口防护与工程布线建议RS232 在电路板上看似简单但一个没有防护的 RS232 接口在工厂现场非常容易被浪涌打坏。下面给出几条实用的工程建议。7.1 常用防护电路怎么加在 RS232 收发器芯片和 DB9 座子之间可以增加简单的防护电路常见做法是在发送和接收线上分别串联小阻值电阻例如 1kΩ 或 10Ω用于限制瞬间大电流具体阻值需要根据信号速率和芯片驱动能力折算。在信号线对地之间放置 TVS 二极管把浪涌电压钳位在芯片能承受的范围内。在 DB9 外壳和信号地之间增加高压电容或放电管减小静电放电对内部电路的影响。注意很多 RS232 收发器芯片内部已经集成了 ESD 保护如果你的产品使用环境相对干净比如实验室、办公设备就不需要额外做太多防护如果应用在电机、变频器等工业现场还是建议增加 TVS 和良好的接地设计。7.2 线缆长度与布线选择RS232 标准早期规定最大传输距离约 15 米左右这是在低波特率、良好接地和低噪声环境下的参考值。实际应用中如果使用带屏蔽的线缆并把屏蔽层单端接地在 9600 波特率下跑 15 米以内通常问题不大如果提高到 115200 波特率传输距离应大幅缩短否则会出现误码。布线时需要优先级最高的几点两设备之间的 GND 一定要连通这是所有电压判断的参考点。长距离布线应采用屏蔽双绞线屏蔽层建议单端接地防止形成地环路。尽可能让 RS232 信号线远离电机驱动线、变频器输出线、大电流电缆。在 PCB 上RS232 收发器尽量靠近 DB9 座子保持 RS232 电平的走线尽量短。8. 最佳实践与开发建议做过多块带 RS232 接口的板子之后我总结出下面几条对实际开发最有用的实践建议。第一设计板卡时把 TTL 测试点引出来。即使产品外壳上是 DB9 座也最好在 PCB 上预留 MAX232 前端的 TTL 信号测试点方便开发阶段用逻辑分析仪直接抓取单片机发出的原始数据。如果通信异常先确认单片机侧 TTL 数据是否正常再检查 RS232 转换后的信号就能快速判定问题出在哪一侧。第二RS232 收发器芯片的电源去耦电容不要省。MAX232 类芯片内部电荷泵正常工作需要干净的电源建议在 VCC 引脚附近放置 0.1uF 陶瓷电容并靠近芯片引脚布置。电荷泵电容的容值和耐压也需要按芯片手册选择不要随手把任意电容插上去。第三通信参数尽量做成可配置项。工业触摸屏、PLC 或仪表设备往往要求不同的波特率或者校验方式把波特率、数据位、校验位写死在程序里会给后续调试带来很大麻烦。建议使用配置文件或参数存储区保存通信参数方便现场修改。第四不要盲目追求高速率。RS232 主要用于可靠性优先的低速场景常见的 9600、19200 波特率适用于大多数工业设备。如果数据量很大、要求高吞吐不如改用 RS485 或者以太网方案。第五对收发数据要做超时处理。串口接收程序不能无限等待否则一旦对端掉线整个系统会卡在接收函数里。工业场景建议使用接收超时机制超时后主动重发或者上报链路异常。最后要特别注意供电问题。很多 RS232 转接小板直接从 USB 口取电USB 口的 5V 电压在长线或带载能力不足时会出现跌落导致 MAX232 输出幅度不足。调试时如果发现输出电平比正常低可以换一个电源质量更好的 USB 口或者给转接器单独供电测试。9. 总结与下一步学习方向写到这里RS232 电平、RS232 串口接口、TTL 与 RS232 的转换电路、调试方法和工程注意事项已经全部梳理了一遍。重要的是要记住一个核心结论RS232 是一套完整的电气标准它最大的特点就是负逻辑、正负双极性电压而单片机的 UART 默认输出的是 TTL 电平两者之间必须通过 MAX232 类芯片或独立转换电路完成电平搬移和逻辑反向。下一步可以从三个方向继续深入如果做的是板级通信建议学习 RS485 与 RS232 的区别了解差分信号为什么更适合长距离、多节点通信。如果做的是工业设备互联可以研究 Modbus RTU 协议在 RS232/RS485 上的应用这是工控领域最主流的串口协议之一。如果做的是单片机开发可以继续学习 DMA 空闲中断接收不定长数据把串口通信从轮询收数升级为高效中断驱动模式。RS232 虽然古老但掌握它的电平标准、通信时序和排查思路能帮助你在面对各种带“串口”字样的设备和模块时少踩很多坑。当你下次在示波器上看到 TXD 空闲时稳稳停在负电压附近就能一眼确认这才是真正工作在 RS232 电平下的通信链路。
返回列表