NEC 投影机是二进制协议,不是文本
这是首先要记住的一点,因为多数 NEC 对接就是栽在这里。
NEC 投影机的命令是原始十六进制字节。 和 爱普生(PWR ON)、索尼(power "on")、LG(ka 00 01)不同,这里没有任何可读文本。开机是:
02 00 00 00 00 02六个字节。 敲下 0、2、空格、0、0…… 发出去的是十八个 ASCII 字符,永远不会成功。
几乎所有人都会在这里栽一次。 有一个记录在案的 Arduino 案例:开发者试了 Serial.println("02 00 00 00 00 02") 和许多变体都不成功——正确做法是写真正的字节:
byte powerOn[] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x02};
Serial.write(powerOn, 6);另外注意 println 会追加 CR/LF,那会多出两个投影机没有要的字节,即使其余部分都对也会把包搞坏。要用"写字节"的调用,不要用"打印行"的调用。在终端软件里,切到 HEX 发送模式。
包结构
┌─────┬─────────┬─────────┬──────────┬──────────┬──────────┐
│ ID1 │ ID2 │ 机器ID │ 机器地址 │ 数据长度 │ 校验和 │
│ 02 │ 00/01… │ 00 │ 00 │ 00 │ XX │
└─────┴─────────┴─────────┴──────────┴──────────┴──────────┘| 字段 | 含义 |
|---|---|
| ID1 | 命令组——02 是电源控制 |
| ID2 | 子命令——00 开机,01 关机 |
| 机器 ID | 单机运行时为 00 |
| 机器地址 | 单机运行时为 00 |
| 数据长度 | 后续数据字节数(无数据时为 00) |
| 校验和 | 前面所有字节之和的低 8 位 |
对于单台投影机,NEC 的建议是把机器 ID 设为 0、机器地址设为 00。当机器 ID 被设为通用通知时,机器地址不会被校验——这就是全零形式在单机安装上能用的原因。
校验和
把前面所有字节相加,保留低 8 位。 NEC 自己的表述是:"CKS:校验和——从第一个字节到最后一个字节之前那个字节的总和的低八位。"
开机:
02 + 00 + 00 + 00 + 00 = 0x02
帧: 02 00 00 00 00 02
└── 校验和关机:
02 + 01 + 00 + 00 + 00 = 0x03
帧: 02 01 00 00 00 03开机那一帧是个巧合——校验和恰好等于第一个字节,这偶尔会让人以为"最后一个字节是第一个字节的重复"。并不是。 关机那一帧把规则显示得很清楚:因为子命令变成了 01,最后一个字节就变成了 03。
掌握了规则,你就可以在信任任何一张表里找到的 NEC 帧之前先验算它——这值得做,因为控制代码表在论坛之间被转载很多年,中间没有人重算过。
串口参数
| 参数 | 值 |
|---|---|
| 波特率 | 现行机型 38400,很多老机型 9600 |
| 数据位 | 8 |
| 校验位 | 无 |
| 停止位 | 1 |
波特率是随机型变化的那一项。 投影机不吭声时,把 9600 和 38400 都试一遍只要三十秒,却能砍掉整整一个分支的排查。有些机型还允许在菜单里改速率,所以一台从别的项目挪过来的机器,未必还停在出厂默认值上。
MultiSync 混淆
这个坑专门坑那些同时接触 NEC 投影机和 NEC 显示器的人。
NEC MultiSync 显示器不使用投影机协议。 它用的是一套完全不同的、基于 ASCII 的方案,带 SOH 头、显示器 ID 和十六进制编码字段——电源命令表现为 C、2、0、3、D、6 这些字符,后面跟一个四位的电源模式(0001 表示开)。
所以"NEC RS232 指令"根据设备是投影还是显示,指的是两个毫不相干的东西。一方的指令表对另一方完全无用,而因为两者都姓 NEC、都是 RS-232,很容易花上一阵子琢磨"为什么一张明明没问题的表什么也做不到"。
找代码之前,先确认你的设备属于哪一族。
时序:冷却期
投影机在关机处理期间不接受其他命令,而这包括冷却期。
这会产生一个标准的时序 bug:操作员按了"闭馆",系统发出关机;一分钟后有人按了"开馆"——开机命令落在冷却过程中间,被丢弃了。没有任何报错,投影机就是不亮。
把延时写进你的控制逻辑,或者更好——查询状态再行动,而不是盲发命令。这和 爱普生的 PWR? 状态值、松下的 QPW 存在的理由是同一个。
为什么你的 NEC 命令没有回应
1. 你发的是文本而不是字节。 头号原因。 "02 00 00..." 不等于 0x02 0x00 0x00...。
2. 你的发送调用追加了 CR/LF。 println 这类函数会把帧搞坏。
3. 波特率错了。 9600 和 38400 都试。
4. 校验和错了。 重算——它是前面所有字节之和的低字节。
5. 协议族选错了。 MultiSync 显示器要用显示器协议,不是这个。
6. 投影机正在冷却。 等,或者先查询。
7. 用了直通线而不是交叉线。 见交叉线与直通线。
8. 单机安装上机器 ID / 机器地址填了非零值,而投影机期待的是通用通知形式。
用 SoftControl 控制
SoftControl 用十六进制输入把 NEC 帧作为裸串口或 TCP 字节发送——所以"字节还是文本"这个 NEC 对接的头号失败原因根本不会出现。 指令测试页显示实际发出的十六进制和原始响应,所以"校验和被拒"和"投影机根本没在听"看起来是不一样的。
跨品牌视角见投影机控制指南;如果展厅里混着多个厂商,PJLink 能用一套命令搞定所有机器的开关机、输入和消隐,通常是更好的默认选择,NEC 原生协议留给型号专有的那些附加功能。