gpt4 book ai didi

serial-port - 可靠的全双工串行通信

转载 作者:行者123 更新时间:2023-12-04 02:29:41 24 4
gpt4 key购买 nike

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

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

如果在数据从发送方消失之前检测到错误情况,恢复很容易,但特别是在接收的 PC 上可能有大量的缓冲区空间,并且当 PC catch 并检测到数据损坏时可能已经从设备上消失了,我们不能简单地重新传输。很难“倒带”密码生成,因此重新发送源数据并尝试在中间捡起东西很困难 - 事实上,根据源数据的最终来源,可能无法重新发送源数据。

我考虑让每一方发送其“最后一帧成功接收”计数器及其最后一帧发送的 CRC 值,如果输出端有太多未确认的数据等待,则让设备丢弃 RTS,但这会导致死锁——设备永远不会得到 PC 的接收线程已 catch 的确认。

我也考虑过让 PC 发送一个 block ,然后在第一个 block 被确认处理并接收回来之前不发送另一个 block ,但这基本上是半双工或 block 同步操作,系统运行速度比它慢可以做。折衷方案是在设备中设置多个缓冲区,PC 知道有多少缓冲区并根据它认为设备正在做的事情来限制自己的输出,但在 PC 端似乎需要那种程度的“智能”不雅和 hacky。

串行通信是相当古老的技术。肯定有这样做的好方法吗?

最佳答案

设计一个可靠的协议(protocol)并不是那么容易。到目前为止您所谈论的内容的一些注释:

  • 仅使用 RTS 来执行其设计目的,避免接收缓冲区溢出。不宜多做。
  • 强烈认为周围有多个未确认的帧。仅当连接遇到高延迟时才重要,这不是串行端口的问题。
  • 通过分层实现全双工操作,以OSI模型为指导。
  • 请务必将协议(protocol)的输入和输出视为纯字节流。成帧只是协议(protocol)实现的一个细节,实际的帧大小无关紧要。如果应用程序通过使用消息发出信号,那么应该在协议(protocol)的之上实现它。否则,适当分层的自动结果。
  • 请记住,帧不仅可以传输数据,还可以包含对接收到的帧的 ACK。换句话说,如果没有任何东西要传回,您只需要一个单独的 ACK 帧。

并避免重新发明轮子,这在以前已经做过。我可以推荐 RATP,RFC916 的主题.顺便说一句,它被广泛忽略,因此您不太可能找到可以复制的代码。我已经实现并取得了很好的成功。据我所知,它只有一个缺陷,它无法应对接收缓冲区中出现的多次连接尝试。打开端口时有意清除缓冲区很重要。

关于serial-port - 可靠的全双工串行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21777701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com