【发布时间】:2017-12-06 18:10:55
【问题描述】:
我正在通过 COM 端口与分配器通信。
它发送DLE-STX-DATA-DLE-ETX-CRC。如果 2 字节 CRC 不同,我会回复 NAK,否则回复 ACK。到目前为止,一切都很好。但是如果缺少 2 字节 CRC 中的字节怎么办。那我能做什么?它也包含两个字节。
例如,预期的 CRC 是 0x11 0x31,但它返回了 0x31 0x10(其中 0x10 已经是 DLE-STX-DATA-DLE-ETX-CRC 的一部分,它试图返回,即使我没有发送 NAK!)。
对于 CRC 本身的缺失字节我该怎么办?
如何恢复?
预期行为:
- 设备:
DLE-STX-DATA-DLE-ETX-CRC1-CRC2 - CRC 不匹配
- 我:
NAK - 设备:
DLE-STX-DATA-DLE-ETX-CRC1-CRC2
实际行为:
- 设备:
DLE-STX-DATA-DLE-ETX-(missing byte)-CRC2-DLE - CRC 不匹配
- 我:
NAK - 设备:
STX-DATA-DLE-ETX-CRC1-CRC2
【问题讨论】:
-
你能检查响应存储的数据类型吗?无符号与有符号整数?
-
如果您发送 NAK,发件人是否会重复该消息?然后发送 NAK。如果不是,则协议设计不当(例如,应该有一个长度字段)。解决方法可能是分析包边界周围的字节并进行一些猜测。
-
一切都通过无符号字节或字节[]操作。
-
它正确返回 DLE-STX-DATA-DLE-ETX 部分,但 CRC 中缺少一个字节。根据日志,CRC 已经包含 0x31 0x10(其中 0x10 已经是重新发送的 DLE 响应)。然后我发送 NAK,因为 0x31 0x10 不是预期的 0x11 0x31 CRC 并且响应以 STX 而不是 DLE 开头,因为它已经在 CRC 中发送。
-
您的协议是否有某种字节填充或转义以允许
DLE项目出现在消息中?