100ms 采样率下连续 3 次空码误判机制
一、结论
在当前项目中,“连续 3 次空码”是按 APK 收到的回调包计数,不是按扫码头完成的独立真实扫描次数计数。
100ms 真机测试的单轮样本中,餐盘在位最大连续空码为 1 次,没有实际触发 3 次误判。但按照 2026-09-07 会议提出的硬件机制,如果扫码头约每 300ms 产生一次真实结果,而控制板把同一结果按 100ms 间隔重复上报 3 次,那么一次真实失读就可能形成 3 个连续空码回调,使 APK 在约 300ms 内错误判断餐盘已经移走。
因此,100ms 条件下的“3 次确认”不能直接解释为“连续 3 次独立扫码失败”,其实际容错能力可能只有 1 个真实扫码周期。
二、已确认事实
2.1 单轮真机测试结果
2026-06-12 的测试对话记录显示:
| 指标 | 100ms 测试结果 |
|---|---|
| 实测扫码回调间隔中位数 | 99ms |
| 餐盘在位最大连续空码 | 1 次 |
| 餐盘拿走后连续空码 | 194 次 |
| 该轮是否发生 3 次误判 | 否 |
这组数据证明当前设备在当次测试中没有达到连续 3 次空码,但只有一轮样本,不能据此推导长期成功率或误判概率。
2.2 当前 APK 的计数方式
- 收到有效餐盘码时,将空码计数清零。
- 收到空码时,将空码计数加一。
- 计数达到配置阈值后,调用离盘收尾逻辑,结束当前扫码/打餐状态。
对应代码位于 HomeActivity.handleYoukateScanCode()、HomeActivity.handleEmptyScanCode() 和 YoukateHardwareManager.cleanScanCode()。当前计数没有使用扫码序列号、真实采样时间戳或数据包新旧标识来区分独立扫描与重复上报。
2.3 空码的应用层定义
- 硬件返回空值;
- 硬件没有返回餐盘码;
- 返回值长度不等于项目要求的 6 位;
- 上游串口包或解析结果导致 RFID 字段缺失或异常。
所以“空码”不只表示餐盘已经移走,也可能表示一次短暂失读、字段异常或通信解析异常。
三、待供应商确认的硬件机制
2026-09-07 会议形成的当前口径是:扫码头约每 300ms 产生一次真实读取结果;控制板可能将同一结果每 100ms 上报一次,共上报 3 次;这 3 个回调包可能完全相关,不代表 3 次新的真实扫描。
| 时间 | APK 收到的数据 | 是否代表新的真实扫描 |
|---|---|---|
T0 | 结果 A,第 1 包 | 是,可能对应本周期结果 |
T0 + 100ms | 结果 A,第 2 包 | 否,可能是重复包 |
T0 + 200ms | 结果 A,第 3 包 | 否,可能是重复包 |
T0 + 300ms 左右 | 结果 B | 可能进入下一真实扫码周期 |
四、误判原因
4.1 一次真实失读被复制成 3 个空码包
餐盘仍在位时,扫码头可能因为餐盘轻微移动、标签角度变化、遮挡、反光、瞬时休眠或硬件状态波动,在一个真实扫描周期内没有识别到餐盘码。如果控制板将这个空结果按 100ms 重复上报 3 次,APK 会把同一次失读累计为 3 次,从而错误确认离盘。
4.2 复合数据包中的 RFID 字段短暂为空
当前称重数据和扫码数据由控制板合并后通过同一串口数据包返回。即使重量仍能表明餐盘在秤上,只要某一周期的 RFID 字段为空并被重复上报,APK仍会只按空码次数推进离盘判断。当前离盘确认没有联合检查“重量是否回到空秤”或“重量是否发生符合移盘特征的变化”。
4.3 异常餐盘码被清洗为空码
当餐盘码为空或长度不是 6 位时,cleanScanCode() 会将结果转换为空字符串。若同一个异常结果被控制板重复返回 3 次,也会形成完整的离盘触发链。异常来源可能包括串口半包、丢包、解析异常、RFID 字段缺失或返回内容格式异常。
五、误判触发机制
餐盘仍然在位
↓
一个真实扫码周期发生短暂失读、空字段或异常码
↓
控制板可能按 100ms 间隔重复返回同一空结果 3 次
↓
APK 空码计数依次变为 1、2、3
↓
达到“连续 3 次”离盘阈值
↓
错误结束当前订单/打餐状态并切回打餐前页面
六、概率理解
如果 3 个空码分别来自 3 次相互独立的真实扫描,理论误判概率才可以近似理解为:
单次真实失读概率³
如果 3 个空码只是同一次真实结果的重复包,则三包高度相关,误判概率更接近:
一个真实扫码周期发生失读或异常的概率
因此,在没有确认数据包独立性之前,不能用“三次判断”直接宣称 90% 或更高的长期可靠性,也不能简单使用 p³ 计算误判率。
七、影响
- 餐盘仍在位,但当前订单或打餐状态提前结束;
- 页面从打餐中错误切回打餐前;
- 同一餐盘恢复识别后被当作新一轮流程;
- 取餐记录可能被提前截断或拆分;
- 报警状态下的原餐盘离开判断也可能被提前触发。
八、建议
- 优先通过供应商书面说明或串口原始抓包,确认
100ms × 3是否为同一真实扫码结果的重复包。 - 日志增加单调时间戳、原始包摘要、RFID 字段、与上一包是否相同及包间隔,用于识别重复上报。
- 离盘判断优先按持续时间处理,而不是直接按数据包数量处理。
- 候选宽限时间可先验证 900ms 和 1200ms:宽限期内恢复同一餐盘码则继续原订单。
- 对高可靠场景,增加“持续空码 + 重量回到空秤或接近空秤”的联合确认。
- 在实验室构造一次真实空结果被重复上报 3 次的场景,确认 APK 不会将其错误解释成 3 次独立失读。
九、证据边界
- 已确认:当前 APK 按空码回调次数计数;有效码会清零;空值或长度异常会转换为空码。
- 已确认:单轮 100ms 真机测试中,在位最大连续空码为 1 次,当次没有误判。
- 待确认:扫码头真实周期是否固定约 300ms,以及控制板是否必然执行
100ms × 3重复上报。 - 尚无证据:长期误判率、长期成功率以及“3 次判断达到 90% 以上可靠性”的统计结论。
十、关联资料
recordings/transcripts/2026-09-07-liutianhua-scan-interruption/2026-09-07-hardware-packet-return-summary.mdrecordings/transcripts/2026-09-07-liutianhua-scan-interruption/2026-09-07-scanner-interruption-meeting-minutes.mddocs/2026-09-09-tray-removal-confirmation-count-code-locations.md