线没问题,是格式不对
排除掉接线和串口参数之后,剩下的"设备不响应"几乎都归结为三件事之一:
- 结束符——设备怎么知道你的命令结束了
- ASCII 还是二进制——
01到底是两个文本字符还是一个字节
- 校验和——规则用错了,或者字节序反了
这三件事都不会给你一条能读的错误信息。 设备只是无视你——这正是它们如此消耗时间的原因。 这一页把三者跨品牌并排放在一起,好让你认出自己在哪一种情况里。
物理层问题请先看交叉线与直通线。
第一部分:结束符
这件事没有行业约定。 十个协议的实际做法:
| 协议 | 结束符 | 备注 |
|---|---|---|
| 爱普生 ESC/VP21 | CR (0x0D) | 就绪时设备回一个 : |
| 索尼 ADCP | CR + LF | 部分世代只要 LF |
| LG | CR | |
| 奥图码 | CR | |
| PJLink | CR | |
| 明基 | 首尾各一个 CR | 开头那个也是帧的一部分 |
| Biamp Audia/Nexia | LF (0x0A) | 不是 CR,很坑人 |
| 松下 | STX(0x02) … ETX(0x03) | 是包裹字节,不是结束符 |
| 三星 MDC | 无——按长度定界 | 加 CR 会把下一个包搞坏 |
| NEC 投影机 | 无——按长度定界 | println 会追加 CR/LF 毁帧 |
两种失败模式
少了结束符。 设备把你的命令攥在缓冲区里,等一个永远不会来的结束标记。什么都不会发生,而且你发的下一条命令常常会被拼接到第一条后面,导致两条都失败。
多了结束符。 在三星 MDC、NEC 这类按长度定界的协议上,末尾多一个 0x0D 就是个野字节。它会破坏当前帧,或者更糟——被当成下一帧的第一个字节,产生看起来毫无规律的间歇性故障。
这类问题最常见的一个实例:用了 println 这类"打印行"调用,而不是"写字节"调用。println 会静默追加 CR/LF。在爱普生上这是对的,在 NEC 上它会毁掉整个包。
第二部分:ASCII 数字 vs 二进制字节
这是三者中最隐蔽的,因为同一个值在纸面上看起来一模一样。
手册说 Set ID 是 01 时,它可能是:
ASCII : 字符 '0' 和 '1' → 0x30 0x31 (两个字节)
二进制 : 数值 1 → 0x01 (一个字节)各品牌大致对半分:
| 协议 | 01 的含义 | 为什么容易混 |
|---|---|---|
| LG | 0x30 0x31 —— ASCII 数字 | 整条命令都是文本:ka 01 01 |
| 三星 MDC | 0x01 —— 二进制 | 整个包都是二进制 |
| 三星 Ex-Link | 二进制 | 以 ASCII 发送不会工作 |
| NEC 投影机 | 二进制 | 文本形式永远不成 |
| 奥图码 | ASCII 数字 | 见下面的波浪号陷阱 |
| 爱普生 / 索尼 / 明基 / 科视 / 巴可 | ASCII 文本 | 全程人类可读 |
从三星 MDC 转到 LG 的人会发二进制,然后得到沉默。从 LG 转到 MDC 的人会发文本 "AA11FE010111"——十二个字符而不是六个字节——同样得到沉默。 这是同一个错误的两个方向。
奥图码的波浪号陷阱
奥图码的表把开机印成十六进制 7E 30 30 30 30 20 31 0D。开头的 7E 看起来像个二进制引导字节,很容易由此推断后面也是二进制。
并不是。 7E 就是 ASCII 字符 ~,它后面全是 ASCII:30 是 0,20 是空格,0D 是 CR。把 7E 00 00 00 00 01 0D 当原始字节发出去会失败。
奥图码的文档还有第二个陷阱:它把命令写作 ~XX00 1,其中 XX 是投影机 ID 的占位符。照字面发出去,你传输的是 7E 58 58 …——字母 XX——寻址一台不存在的投影机。
第三部分:校验和
常见中控设备里出现四种不同规则。每一种都很容易手工验算,而你应该去验——因为指令表在论坛、厂商知识库和 PDF 之间转载很多年,没有人重算过。
规则 1 —— 模 256 求和(三星 MDC)
把除包头外的每个字节相加,保留低字节。
广播开机:
0x11 + 0xFE + 0x01 + 0x01 = 0x111
0x111 & 0xFF = 0x11
数据包: AA 11 FE 01 01 11三星的表述是"超过两位时丢弃第一位数字"——是同一件事。
规则 2 —— 前序字节求和(NEC 投影机)
把校验和之前的全部相加,保留低 8 位。
开机: 02 + 00 + 00 + 00 + 00 = 0x02 → 02 00 00 00 00 02
关机: 02 + 01 + 00 + 00 + 00 = 0x03 → 02 01 00 00 00 03开机那一帧是个值得注意的巧合:校验和恰好等于第一个字节,会让人以为是重复。关机那一帧证明了规则。
规则 3 —— 二补数(三星 Ex-Link)
校验和是那个"让整帧加起来归零"的值。
校验和 = (0x100 - 前六字节之和) & 0xFF
关机 : sum(08 22 00 00 00 01) = 0x2B → 0xD5 ✓
HDMI 1 : sum(08 22 0A 00 05 00) = 0x39 → 0xC7 ✓
电视信号源: sum(08 22 0A 00 00 00) = 0x34 → 0xCC ✓正是靠这条规则,我们才能告诉你:被到处转载的 Ex-Link 开机码 08 22 00 00 00 02 D6 是错的——按规则应该是 D4。另外三条代码验证正确,所以错的是那一帧,不是规则。 见三星 Ex-Link 指令。
规则 4 —— CRC-16(Modbus RTU)
多项式 0xA001,初值 0xFFFF,而且——这是坑住所有人的地方——低字节在前追加,与 Modbus 里其他所有多字节字段相反。
从从站 1 读 1 个保持寄存器:
帧体: 01 03 00 00 00 01
CRC : 0x0A84
完整帧: 01 03 00 00 00 01 84 0A
^^ ^^ 先低字节, 后高字节如果你的例程算出 0A 84,说明字节序反了,任何设备都不会应答。 见 Modbus RTU 与 TCP。
另外,巴可老款的 33 字节包要求按每台投影机的地址重算校验和——这就是为什么老巴可的通用指令表几乎从来不能直接用。
怎么判断自己撞上了哪一个
按顺序走:
1. 设备到底有没有回任何东西?
有回复——哪怕是报错——就证明线、波特率、校验位和帧格式都到达了解析器。 此刻你在调的是内容,不是连接。会告诉你原因的品牌:
| 品牌 | 拒绝时的回复 |
|---|---|
| 索尼 | err_cmd |
| LG | NG |
| 明基 | Illegal format / Unsupported item / Block item |
| 爱普生 | ERR |
明基这个三分法是业内最有用的——Block item 意味着你的命令没错,是时机不对。
2. 完全沉默? 那就是帧从未被解析。按这个顺序查:结束符 → ASCII/二进制 → 校验和。
3. 时好时坏? 怀疑多余的结束符渗进了下一帧,或者按长度定界的协议收到了野字节。
4. 桌上好使、现场失败? 那通常不是格式问题——线长和终端电阻见交叉线与直通线。
值得养成的一个习惯
当一条公开的控制代码通不过它自己协议的校验规则时,信规则,别信表。
上面每一条校验规则,用计算器一分钟内就能验完。指令表在论坛、厂商知识库和 PDF 之间流传很多年,没有人重算过。 我们在写这些页面时,正是用这个检查抓到了一条错误代码。
用 SoftControl 控制
SoftControl 每条指令都支持文本和十六进制两种载荷,Modbus CRC 由它代算,指令测试页会把请求同时以文本、字节和十六进制三种形式显示,外加原始回复。这个三重视图正是用来区分"结束符错了"、"校验和错了"和"根本没人在听"的——这三个问题症状完全相同,解法完全不同。
协议全景见 AV 控制协议详解;在怀疑中控系统之前先用终端验证,见中控调试用的串口终端软件。