# 串口遥控器遥控界面操作说明 ## 概述 - 通过串口接收遥控器报文,解析键码并通过 WebSocket 推送到前端,实现对检测页面的远程控制。 - 后端设备名为 `remote`,事件名为 `remote_control`,命名空间为 `/devices`。 ## 串口配置 - 配置文件位置:backend/config.ini - 读取段与键: - [REMOTE] port,缺省 COM6 - [REMOTE] baudrate,缺省 115200 - [REMOTE] timeout,缺省 0.1 秒 - [DEVICES] remote_enabled(是否启用),缺省 true - 串口参数:115200 bps,8 数据位,1 停止位,无校验(8N1)。 ## 报文格式 - 参照 Modbus RTU 协议中功能码 0x04(读输入寄存器)的应答帧格式: - 帧结构:`01 04 02 00 [键码] crcL crcH` - 固定头:`01 04 02 00` - 第 5 字节为键码(KeyCode) - CRC16:Modbus RTU 小端(crcL, crcH),计算范围为前 5 个字节 - 报文由接收器主动上传,无需主机轮询 - 除键码与 CRC 外,前 4 字节保持不变 ## 键码约定 - 左:`11` - 右:`14` - 上:`13` - 下:`15` - 中:`12` - 电源:`0E` - 抓屏:`0F` ## 后端实现 - 代码文件:`backend/devices/remote_control_manager.py` - 主要逻辑: - 打开串口并启动后台线程读取数据 - 在缓冲区中查找帧头 `01 04 02 00`,截取 7 字节帧 - 计算前 5 字节 Modbus CRC16(多项式 0xA001,初值 0xFFFF),校验通过后解析键码 - 通过 Socket.IO 向 `/devices` 命名空间推送事件 `remote_control`,载荷示例: - `{ "code": "0F", "name": "screenshot", "timestamp": 1731234567.89 }` ## 前端对接 - 页面:`frontend/src/renderer/src/views/Detection.vue` - 统一设备命名空间 Socket:`devicesSocket = io(BACKEND_URL + '/devices', ...)` - 事件监听与映射: - 监听:`devicesSocket.on('remote_control', handler)` - 根据编码触发页面方法: - `11` → `startVideoClick()`(开始录像) - `14` → `stopVideoClick()`(结束录像) - `0F` → `saveDetectionData()`(截图) - 页面中相关按钮: - 截图按钮:调用 `saveDetectionData` - 开始录像按钮:调用 `startVideoClick` - 结束录像按钮:调用 `stopVideoClick` ## 运行与验证 - 打包后 Electron 主进程会在窗口创建前启动后端服务 - 打开检测页面,确保设备命名空间连接成功 - 使用遥控器按键,观察页面动作对应触发 ## 常见问题 - 无法接收到事件: - 检查后端串口配置是否正确(端口被占用或不存在) - 确认遥控器接收器已连接且在串口管理器线程持续读取 - 确认前端已连接到 `/devices` 命名空间并注册了事件监听 - CRC 错误: - 检查物理连接和电气参数 - 若报文格式与约定不一致,请提供示例报文以调整解析逻辑