RS232 与 USB CDC 服务质量/消息是否应该包含校验和?

电器工程 USB rs232 USB设备 错误修正
2022-01-03 09:42:22

USB 是否为我的 USB-CDC 设备和 USB 主机之间发送的数据提供服务质量保证?

我知道在嘈杂的情况下(例如汽车诊断端口)使用传统的 RS232,坏位经常发生,以至于校验和对协议很重要。如果我要使这样的协议适应纯 USB 应用程序,我可以安全地省略校验和和相关的错误处理例程吗?

作为参考,我正在使用带有 Atmel 提供的USB-CDC框架的 AT91SAM7S256。

更新:

我在这个问题上使用了我的 Google-Fu 更长的时间,发现这篇文章描述了以太网仿真的 CDC 子类,并指出:

通过 USB 电缆,封装的以太网帧从目标 MAC 地址开始流动,并在帧校验和之前结束。(不需要帧校验和,因为 USB 是一种可靠的传输方式。)

它们可能意味着 USB-CDC 是可靠的传输方式,而不是一般的 USB,因为如果程序无法足够快地轮询数据,某些用于高吞吐量突发数据(网络摄像头?)的设备类可能不想填满缓冲区。

我仍然希望对此进行进一步确认。

2个回答

这取决于您的设备使用的端点类型。

简而言之,从USB 中获取的快速摘要:

中断传输

  • 保证延迟
  • 流管 - 单向
  • 错误检测和下一个周期重试。

同步传输

  • 同步传输提供对 USB 带宽的保证访问。
  • 有界延迟。
  • 流管 - 单向
  • 通过 CRC 进行错误检测,但不重试或保证交付。
  • 仅限全速和高速模式。
  • 没有数据切换。

批量转账

  • 用于传输大量突发数据。
  • 通过 CRC 进行错误检测,保证交付。
  • 不保证带宽或最小延迟。
  • Stream Pipe - 仅限单向全速和高速模式。

要正确回答您的问题,您需要了解在下面使用哪些传输模式来实现 CDC 设备。CDC 设备类规范可能是一个起点。如果您有设备的源代码,那就更好了。我对CDC类不熟悉,所以无法评论它的实现标准,但是乍一看一些文档和google,似乎在实现上有一定的灵活性。

编辑

阅读您链接的 Atmel 文档后,看来这取决于您!

抽象控制模型需要两个接口,一个通信类接口和一个数据类接口。它们中的每一个都必须有两个关联的端点。前者应有一个专用于设备管理的端点(默认控制端点 0)和一个用于事件通知的端点(附加中断 IN 端点)。

数据类接口需要两个端点,通过它们向主机传送数据和从主机传送数据。根据应用程序,这些端点可以是 Bulk 或 Isochronous。在 USB 到串行转换器的情况下,使用 Bulk 端点可能更合适,因为传输的可靠性很重要,并且数据传输不是时间关键的。

所以在你的实现中,一定要在你的数据类接口上使用批量传输来确保可靠的传输。

USB 可能是一个相对可靠的协议,但并非所有使用 CDC 的设备和驱动程序都是可靠的。我见过一些不同的设备,它们有一个相当烦人的习惯,就是跳过 PC 发送的数据字节。观察示波器上的数据表明问题不在于接收设备溢出——一些数据字节只是丢失了(我能够在示波器上捕获整个数据包;页眉和页脚都存在,但有些它们之间的字节丢失)。我不确定究竟是什么问题导致了这种行为,但试图太快发送数据似乎是一个促成因素。