我正在设计一台设备,它将加密从PC发送的长(假设是无限)数据流并将其发送回来。我计划在设备上使用单个串行端口,在全双工模式下运行,并“阻塞”数据,每个块后发送CRC值。该设备仅缓冲有限数量的块-理想情况下,只需一个缓冲区累积接收到的块和一个缓冲区持有目前正在发送的块,在每个块边界进行切换,并使用硬件握手来保持同步。
我考虑的问题是,当存在损坏并且接收方计算出的CRC值与发送的值不匹配时会发生什么。如果接收器检测到错误,则在其传输线上设置中断条件-因为尽管TX和RX正在执行不同的操作,但那就是我们可以做的全部-然后我们进入恢复序列。
当在数据从发送方消失之前检测到错误条件时,恢复很容易,但尤其是在PC接收方,可能有大量的缓冲空间,当PC赶上并检测到损坏时,数据可能已经从设备中消失,我们不能简单地重传。很难“倒带”密码生成,因此重新发送源数据并尝试在中途连接可能很困难-实际上,源数据可能无法重新发送,具体取决于它最终来自哪里。
我考虑让每一方在其最后一帧成功接收的计数器以及其最后一帧发送CRC值的同时发送,并且如果输出中有太多未经确认的数据等待,则让设备降低RTS,但是那样会死锁-设备永远无法获得PC接收线程已赶上的确认。
我还考虑了让PC发送一个块,然后不再发送另一个块,直到第一个块被确认处理并返回,但这实际上将转向半双工或块同步操作,而该系统运行速度比可以做的慢。一种折衷的方法是在设备中使用多个缓冲区,让PC知道有多少个缓冲区,并根据它认为设备正在执行的操作来控制其自己的输出,但需要在PC端具有那种程度的“智能”似乎不太优雅和精湛。
串口通信技术相当古老。肯定有更好的方法来做到这一点吧?
我考虑的问题是,当存在损坏并且接收方计算出的CRC值与发送的值不匹配时会发生什么。如果接收器检测到错误,则在其传输线上设置中断条件-因为尽管TX和RX正在执行不同的操作,但那就是我们可以做的全部-然后我们进入恢复序列。
当在数据从发送方消失之前检测到错误条件时,恢复很容易,但尤其是在PC接收方,可能有大量的缓冲空间,当PC赶上并检测到损坏时,数据可能已经从设备中消失,我们不能简单地重传。很难“倒带”密码生成,因此重新发送源数据并尝试在中途连接可能很困难-实际上,源数据可能无法重新发送,具体取决于它最终来自哪里。
我考虑让每一方在其最后一帧成功接收的计数器以及其最后一帧发送CRC值的同时发送,并且如果输出中有太多未经确认的数据等待,则让设备降低RTS,但是那样会死锁-设备永远无法获得PC接收线程已赶上的确认。
我还考虑了让PC发送一个块,然后不再发送另一个块,直到第一个块被确认处理并返回,但这实际上将转向半双工或块同步操作,而该系统运行速度比可以做的慢。一种折衷的方法是在设备中使用多个缓冲区,让PC知道有多少个缓冲区,并根据它认为设备正在执行的操作来控制其自己的输出,但需要在PC端具有那种程度的“智能”似乎不太优雅和精湛。
串口通信技术相当古老。肯定有更好的方法来做到这一点吧?