别再乱码了!手把手教你搞懂串口调试助手的Hex和ASCII收发模式(附Modbus RTU实例)

张开发
2026/6/6 3:45:00 15 分钟阅读

分享文章

别再乱码了!手把手教你搞懂串口调试助手的Hex和ASCII收发模式(附Modbus RTU实例)
串口调试中的Hex与ASCII模式从乱码到精准通讯的实战指南调试串口通讯时你是否曾在接收端看到一堆毫无意义的乱码这往往源于发送与接收模式的不匹配。本文将带你深入理解Hex与ASCII模式的核心差异并通过Modbus RTU实例演示如何避免常见陷阱。1. 字节流视角理解通讯的本质所有串口和网口通讯在底层传输的都是原始字节流。假设我们要发送数字12在不同模式下实际传输的字节截然不同ASCII模式发送12实际发送两个字节0x31 0x32字符1和2的ASCII码Hex模式发送12实际发送一个字节0x12十六进制数值关键区别ASCII模式将输入视为文本字符Hex模式将输入视为十六进制数值下表对比两种模式的核心特性特性ASCII模式Hex模式输入处理按字符逐个转换每两位作为十六进制数值字节效率较低1字符1字节较高2字符1字节典型应用文本协议如NMEA 0183二进制协议如Modbus可读性直接显示可打印字符需转换才能理解数值含义2. 模式不匹配乱码的根源分析让我们通过具体案例解析乱码产生的原因。假设使用Modbus RTU协议读取温度传感器发送查询帧正确Hex模式发送01 03 00 01 00 01 D5 CA设备地址01功能码03起始地址0001读取长度0001CRC校验D5CA错误ASCII模式发送相同内容实际发送的是每个字符的ASCII码30 31 20 30 33 20 30 30 20 30 31 20 30 30 20 30 31 20 44 35 20 43 41此时若接收端也处于ASCII模式你会看到原样显示的01 03 00 01 00 01 D5 CA——看似正确实则完全错误的通讯。3. 实战Modbus RTU调试流程3.1 配置串口调试助手推荐使用支持多模式切换的调试工具如QCOM或Termite关键设置端口参数波特率、数据位、停止位、校验位与设备一致发送模式Hex模式Modbus RTU必须接收显示建议同时开启Hex和ASCII视图对比# Python示例Hex模式发送Modbus请求 import serial ser serial.Serial(COM3, 9600, timeout1) request bytes.fromhex(01 03 00 01 00 01 D5 CA) ser.write(request) response ser.read(8) # 预期接收7字节1字节间隔 print(response.hex( )) # Hex格式输出3.2 诊断常见问题遇到通讯失败时按此流程排查验证物理连接确认线序正确RX-TX交叉测量信号电平RS232/RS485/TTL电平差异检查模式设置发送端必须为Hex模式接收端建议Hex模式显示分析数据流使用逻辑分析仪捕获实际信号对比发送与接收的原始十六进制值经验提示多数Modbus设备在收到错误帧时不会响应保持静默4. 高级技巧数据解析与处理接收到正确数据后常需进行以下处理4.1 字节序转换Modbus协议使用大端序高位在前x86处理器多为小端序// C语言示例将接收的2字节温度值转换为整数 uint16_t raw_temp (buffer[3] 8) | buffer[4]; float temperature raw_temp / 10.0f; // 假设精度为0.1℃4.2 类型转换参考表原始数据转换方式结果示例0x41 0x42ASCII字符AB0x12 0x34大端序16位整数46600x12 0x34小端序16位整数133300xCD 0xCC 0x8C 0x3FIEEE754浮点数1.1 (约)4.3 错误检测与处理CRC校验所有Modbus RTU帧包含2字节CRC超时处理典型响应等待时间为50-500ms异常响应功能码最高位置1表示错误def check_crc(data): crc 0xFFFF for byte in data[:-2]: crc ^ byte for _ in range(8): if crc 0x0001: crc 1 crc ^ 0xA001 else: crc 1 return crc int.from_bytes(data[-2:], little)掌握Hex与ASCII模式的本质区别配合系统化的调试方法能显著提升嵌入式通讯开发的效率。实际项目中建议始终在调试工具中保持Hex显示模式这是理解底层通讯最可靠的窗口。

更多文章