去掉辅助餐盘识别实施方案

目标:在“程序设置 → 高级设置”增加“去掉辅助餐盘识别”操作项。用户确认后,程序通过 /dev/ttyS5、115200 波特率向餐盘识别模块发送固定命令 3E5343414E30363030303035803C

实施范围:增加高级设置入口和一次性串口命令发送能力,并将主页进入后台时的称重串口处理调整为“暂停监听、保留连接”。不增加本地状态开关,不改变主餐盘识别、扫码、取餐和上传流程。

一、交互方案

  1. 高级设置增加“去掉辅助餐盘识别”操作项。
  2. 点击后显示确认弹框,避免误触改变外部硬件配置。
  3. 确认后显示“正在发送配置...”进度提示,并禁止重复执行。
  4. 写入并刷新串口输出流后提示“命令发送成功”。
  5. 称重串口未初始化或发送异常时显示明确原因。

该功能采用一次性操作项,不保存 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字符的十六进制文本。

三、技术方案

Task 1:复用称重串口发送命令

当前 DeviceSDK 的 PC681ScaleManager 默认串口配置已经是 /dev/ttyS5、115200。AuxiliaryTrayRecognitionController 只保存固定命令,并委托 YoukateHardwareManager.sendCommand(byte[]) 使用现有输出流发送。

  1. 校验命令非空,并确认 SDK 串口、初始化状态和输出流可用。
  2. 使用 synchronized (scaleManager) 与 SDK 现有命令共用串口写锁。
  3. 写入原始字节并执行 flush(),返回结构化结果。
  4. 单次发送不关闭共享输出流和串口。

不再直接创建 SerialPort,避免重复打开称重模块已经持有的 /dev/ttyS5;也不调用存在 JNI 字段不匹配问题的 native SerialPort.close()

Task 2:增加高级设置入口

修改 activity_set.xmlstrings.xmlSetActivity.java,增加操作项并接入确认、后台执行、结果提示和日志记录。串口操作在工作线程执行,UI 更新回到主线程。

Task 3:串口生命周期和并发保护

  1. 单次操作未结束时忽略重复点击。
  2. YoukateHardwareManager.pause() 直接停止 SDK 读取线程并清空页面监听器,不调用会关闭输入输出流的 SDK stopListening()
  3. HomeActivity.onStop() 调用 pause(),返回主页后复用连接恢复监听。
  4. 设置页不创建第二个串口连接,也不在发送完成后关闭共享串口。
  5. 不自动重试,避免一次点击产生多次配置命令。
  6. “命令发送成功”只表示串口写入和刷新成功,不等同于硬件确认生效。

四、验证与验收

构建验证

JAVA_HOME=$(/usr/libexec/java_home -v 1.8) ./gradlew --no-daemon :app:assembleDebug

静态验收

实机验收

场景预期结果
点击后取消不打开串口、不发送命令
正常确认复用 /dev/ttyS5、115200连接发送14字节
连续点击同一时刻只执行一次
串口未初始化明确提示先进入主页完成设备初始化
发送异常提示发送失败,不关闭共享串口
发送成功提示命令发送成功,主餐盘识别和称重不受影响
返回主页原串口恢复称重监听,不产生第二个 /dev/ttyS5 句柄
设备重启现场确认外部模块是否保持配置

五、风险与边界