目标:在“程序设置 → 高级设置”增加“去掉辅助餐盘识别”操作项。用户确认后,程序通过 /dev/ttyS5、115200 波特率向餐盘识别模块发送固定命令 3E5343414E30363030303035803C。
实施范围:增加高级设置入口和一次性串口命令发送能力,并将主页进入后台时的称重串口处理调整为“暂停监听、保留连接”。不增加本地状态开关,不改变主餐盘识别、扫码、取餐和上传流程。
该功能采用一次性操作项,不保存 MMKV 状态。辅助餐盘识别的真实状态保存在外部模块中,本地状态可能因模块更换、复位或断电策略而失真。
| 项目 | 固定值 |
|---|---|
| 串口 | /dev/ttyS5 |
| 波特率 | 115200 |
| 帧格式 | 8N1,SDK 底层串口默认格式 |
| 命令十六进制 | 3E5343414E30363030303035803C |
| 实际字节数 | 14 |
| 行结束符 | 不追加 CR、LF 或其他字符 |
3E 53 43 41 4E 30 36 30 30 30 30 35 80 3C
必须发送解码后的14个原始字节,不能发送28字符的十六进制文本。
当前 DeviceSDK 的 PC681ScaleManager 默认串口配置已经是 /dev/ttyS5、115200。AuxiliaryTrayRecognitionController 只保存固定命令,并委托 YoukateHardwareManager.sendCommand(byte[]) 使用现有输出流发送。
synchronized (scaleManager) 与 SDK 现有命令共用串口写锁。flush(),返回结构化结果。不再直接创建 SerialPort,避免重复打开称重模块已经持有的 /dev/ttyS5;也不调用存在 JNI 字段不匹配问题的 native SerialPort.close()。
修改 activity_set.xml、strings.xml 和 SetActivity.java,增加操作项并接入确认、后台执行、结果提示和日志记录。串口操作在工作线程执行,UI 更新回到主线程。
YoukateHardwareManager.pause() 直接停止 SDK 读取线程并清空页面监听器,不调用会关闭输入输出流的 SDK stopListening()。HomeActivity.onStop() 调用 pause(),返回主页后复用连接恢复监听。JAVA_HOME=$(/usr/libexec/java_home -v 1.8) ./gradlew --no-daemon :app:assembleDebug
0x80。SerialPort,也不调用 native SerialPort.close()。| 场景 | 预期结果 |
|---|---|
| 点击后取消 | 不打开串口、不发送命令 |
| 正常确认 | 复用 /dev/ttyS5、115200连接发送14字节 |
| 连续点击 | 同一时刻只执行一次 |
| 串口未初始化 | 明确提示先进入主页完成设备初始化 |
| 发送异常 | 提示发送失败,不关闭共享串口 |
| 发送成功 | 提示命令发送成功,主餐盘识别和称重不受影响 |
| 返回主页 | 原串口恢复称重监听,不产生第二个 /dev/ttyS5 句柄 |
| 设备重启 | 现场确认外部模块是否保持配置 |
/dev/ttyS5 必须由设备系统授予应用进程读写权限;目标设备已确认具备读写权限。SerialPort.close(),串口按应用进程生命周期持有。