【发布时间】:2014-02-14 11:07:47
【问题描述】:
我正在设计一种设备,它将加密从 PC 发送的长(假设无限)数据流并将其发送回。我计划在运行全双工的设备上使用单个串行端口,并通过硬件握手和“块”数据,在每个块之后发送一个 CRC 值。该设备将仅缓冲有限数量的块 - 理想情况下,只有一个缓冲区累积正在接收的块,一个缓冲区保存当前正在发送的块,在每个块边界切换它们并使用硬件握手来保持同步。
我正在考虑的问题是当存在损坏并且接收器(可能是 PC 或设备)计算的 CRC 值与发送的值之间不匹配时会发生什么。如果接收器检测到错误,它会在其传输线路上设置一个中断条件——因为尽管 TX 和 RX 正在做不同的事情,这是我们所能做的——然后我们进入恢复序列。
如果在数据从发送方消失之前检测到错误情况,恢复很容易,但特别是在接收的 PC 上可能存在大量缓冲区空间,并且当 PC 赶上并检测到数据损坏时可能已经从设备中消失了,我们不能简单地重新传输。很难“倒回”密码生成,因此重新发送源数据并尝试在中间提取内容是很困难的——事实上,源数据可能无法重新发送,具体取决于它最终来自哪里。
我考虑让每一方发送其“成功接收的最后一帧”计数器及其最后一帧发送的 CRC 值,如果有太多未确认的数据在输出端等待,则让设备丢弃 RTS,但这会导致死锁 -设备永远不会确认 PC 的接收线程已赶上。
我还考虑过让 PC 发送一个块,然后在第一个块被确认处理并接收回来之前不发送另一个块,但这本质上是半双工或块同步操作,系统运行速度比它慢可以做。一个折衷的办法是在设备中有多个缓冲区,PC 知道有多少缓冲区并根据它认为设备正在做什么来限制自己的输出,但是在 PC 端似乎需要那种程度的“智能”不优雅和 hacky。
串行通信是相当古老的技术。肯定有这样做的好方法吗?
【问题讨论】:
标签: serial-port