Serial port 可靠的全双工串行通信

Serial port 可靠的全双工串行通信,serial-port,Serial Port,我正在设计一种设备,它将加密从PC发送的长(假设无限)数据流并将其发送回。我计划在运行全双工的设备上使用一个串行端口,通过硬件握手和“阻塞”数据,在每个阻塞后发送一个CRC值。该设备将只缓冲有限数量的块-理想情况下,只有一个缓冲区累积接收的块,一个缓冲区保存当前发送的块,在每个块边界切换它们,并使用硬件握手保持同步 我考虑的问题是,当接收器(可能是PC或设备)计算的CRC值与发送的CRC值不匹配时,会发生什么情况。如果接收器检测到错误,它会在其传输线上设置一个中断条件-因为尽管TX和RX正在做不

我正在设计一种设备,它将加密从PC发送的长(假设无限)数据流并将其发送回。我计划在运行全双工的设备上使用一个串行端口,通过硬件握手和“阻塞”数据,在每个阻塞后发送一个CRC值。该设备将只缓冲有限数量的块-理想情况下,只有一个缓冲区累积接收的块,一个缓冲区保存当前发送的块,在每个块边界切换它们,并使用硬件握手保持同步

我考虑的问题是,当接收器(可能是PC或设备)计算的CRC值与发送的CRC值不匹配时,会发生什么情况。如果接收器检测到错误,它会在其传输线上设置一个中断条件-因为尽管TX和RX正在做不同的事情,这是我们所能做的-然后我们进入一个恢复序列

当数据从发送方消失之前检测到错误情况时,恢复很容易,但特别是在接收数据的PC上,可能会有大量的缓冲空间,当PC赶上并检测到损坏时,数据可能已经从设备上消失,我们不能简单地重新传输。很难“重绕”密码生成,因此重新发送源数据并试图在中间拾取数据是困难的,而且源数据可能无法重新定位,这取决于它最终来自哪里。 我考虑过让每一方发送其“last frame successfully received”(最后一帧成功接收)计数器及其last frame sent CRC值,如果有太多未确认的数据等待输出,则让设备丢弃RTS,但这将导致死锁-设备永远无法确认PC的接收线程已赶上

我还考虑过让PC发送一个数据块,然后在第一个数据块被确认处理并接收回来之前不发送另一个数据块,但这实际上是半双工或数据块同步操作,系统运行速度比它能做到的慢。一个折衷方案是在设备中设置多个缓冲区,让PC知道有多少缓冲区,并根据它认为设备在做什么来限制其自身的输出,但在PC端拥有所需的“智能”程度似乎不雅观且不成熟


串行通信是一项非常古老的技术。当然有一种很好的方法可以做到这一点吗?

设计一个可靠的协议并不是那么容易。以下是您到目前为止所谈论的一些笔记:

  • 仅使用RTS来完成其设计目的,避免接收缓冲区溢出。做得更多是不合适的
  • 强烈考虑周围没有多个未确认的帧。只有当连接存在高延迟时,这一点才很重要,这不是串行端口的问题
  • 以OSI模型为指导,通过分层实现全双工操作
  • 请确保将协议的输入和输出视为普通字节流。帧只是协议实现的一个细节,实际帧大小无关紧要。如果应用程序通过使用消息发出信号,那么应该在协议的顶部实现。否则,正确分层的自动结果
  • 请记住,帧不仅可以传输数据,还可以包括接收帧的ACK。换句话说,如果没有任何东西要传输回来,您只需要一个单独的ACK帧
避免重新发明轮子,这是以前做过的。我可以向您推荐RATP,这是一个非常有趣的话题。被广泛忽略的顺便说一句,你不太可能找到你可以复制的代码。我已经实施了它,并取得了良好的成功。据我所知,它只有一个缺陷,它对接收缓冲区中存在的多次连接尝试没有弹性。在打开端口时有意清除缓冲区非常重要