【问题标题】:Missing byte in CRC in COM port communicationCOM 端口通信中 CRC 中缺少字节
【发布时间】: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 项目出现在消息中?

标签: c# port crc


【解决方案1】:

事实证明这是无法解决的。即使是官方的富士通实用程序也无法处理这种情况。即使处理,COM 端口也变得无法使用,需要重新启动计算机。你只能从这个错误中优雅地失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多