本节摘要:ASCII 模式把每个字节拆成两个可见字符传输,用 LRC 校验——它曾为"文本终端时代"而生,如今几乎只剩历史价值。本节讲清它的帧格式、LRC 算法,以及为什么新项目不该选它。位置:4.1 讲了 RTU,本节对照讲它的前代与对手。
ASCII 模式把帧的每个字节转成两个十六进制可见字符(如 0x01 → "01"),以冒号开头、回车换行结尾:
ASCII 帧 = ":" + 地址(2字符) + PDU + LRC(2字符) + CRLF 例(读保持 40001): :010300000001F8\r\n 拆:01=地址 03=功能 0000=起始 0001=数量 F8=LRC
可读性是它唯一的卖点:早期用串口终端调试时,人眼能直接读报文。但代价巨大——同样内容,ASCII 帧长度约为 RTU 的两倍,传输效率减半;而且 LRC(纵向冗余校验,把所有字节相加取补码)的检错能力弱于 CRC16。
LRC 是对"地址 + PDU"逐字节求和、取补码(两字节相加,忽略进位):
uint8_t modbus_lrc(const uint8_t *buf, uint16_t len) { uint8_t sum = 0; for (uint16_t i = 0; i < len; i++) sum += buf[i]; return (uint8_t)(0x100 - sum); /* 补码 */ }
对上例:0x01+0x03+0x00+0x00+0x00+0x01 = 0x05,补码 = 0x100-0x05 = 0xFB?——注意示例里是 F8,实际计算要以真实字节为准,这里仅演示算法。实现与 CRC 同理,先跑通已知向量再上真机。
三个现实原因:效率——ASCII 帧长翻倍,同样波特率下吞吐减半;可靠性——LRC 检错能力弱于 CRC16,且文本解析引入更多出错环节(大小写、非法字符);生态——现代调试工具、PLC、组态软件几乎都默认 RTU,ASCII 只存在于极少数老设备上。选型结论:新项目一律 RTU;遇到只支持 ASCII 的老设备,用网关转 RTU 再接入新系统,别为单台老设备拖累整条总线的效率。
某化工厂的旧称重仪表只支持 ASCII 模式,厂家已停产。项目方的处理:加一台"ASCII 转 RTU"网关,把旧仪表接在网关的 ASCII 口,新系统统一走 RTU。网关完成 LRC 与 CRC 的互转、以及报文格式的翻译。这样既保留了老仪表,又让新系统只面对一种模式——用网关隔离协议代差是工业升级的通用手法。
要点回顾:ASCII 用可见字符传帧、LRC 校验,可读但低效弱校验;新项目选 RTU,老设备用网关隔离代差。串口两种模式都清楚了,下一节看第三种载体——以太网上的 Modbus TCP。
一条 RS-485 总线上不能同时混跑 ASCII 与 RTU——两种模式的帧结构、校验与字符编码完全不同,从站按配置的模式解析,混跑会导致所有帧都解析失败。一主多从中部分设备要 ASCII、部分要 RTU 的场景,正确做法是拆成两条总线或加网关做模式转换,而不是幻想"协议自动识别"。个别设备支持"自动模式"(RTU 与 ASCII 自适应),但可靠性依赖厂商实现,不建议在关键链路依赖它。
| 场景 | 推荐模式 | 理由 |
|---|---|---|
| 新建设备、绝大多数场景 | RTU | 高效、可靠、生态最全 |
| 存量老设备只支持 ASCII | ASCII(单点) | 兼容存量 |
| 混合老设备 | 网关转换 | 隔离模式差异 |
| 人肉调试、终端直连 | ASCII 有可读优势 | 但建议用调试器代替 |
ASCII 帧以可见字符传输,在极少数"只有文本终端、没有二进制抓包工具"的调试环境里可以直接用终端看报文——这是它今天仅存的实际用途。此外 ASCII 用 LRC 单字节校验,理论上对"文本编辑工具人为改错一位"更敏感,但这在现代调试中几乎用不上。工程判断:ASCII 的缺点(效率减半、弱校验)是结构性的,优点(可读性)已被调试工具取代,新项目没有选它的理由。
问:老设备只支持 ASCII,能把它接到 RTU 总线上吗? 不能直接混接,两条总线模式不同会互相解析失败。正确做法是拆总线或加网关做 ASCII↔RTU 转换。
问:ASCII 的 LRC 能自己算吗? 能,代码很短:对地址与 PDU 逐字节求和取补码即可。但要注意 LRC 只覆盖到 PDU 末尾,冒号、地址头、CRLF 都不参与计算。
问:厂商说设备"RTU/ASCII 自动识别"可靠吗? 多数情况可靠,但自动识别依赖厂商实现,关键链路不建议依赖——显式配置模式更稳妥。