可靠的全双工串行通信

2024-03-11

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

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

在数据从发送方消失之前检测到错误情况时,恢复很容易,但特别是在接收端的 PC 上,可能存在大量缓冲区空间,并且当 PC 赶上并检测到损坏时,数据可能已经消失从设备,我们不能简单地重新传输。 “倒回”密码生成很困难,因此重新发送源数据并尝试在中间拾取内容很困难 - 事实上,源数据可能无法重新发送,具体取决于它的最终来源。

我考虑让每一方发送其“成功接收的最后一帧”计数器以及其发送的最后一帧的 CRC 值,并且如果有太多未确认的数据在输出处等待,则让设备丢弃 RTS,但这会死锁 - 设备永远不会确认 PC 的接收线程已赶上。

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

串行通信是相当古老的技术。当然有一个好的方法可以做到这一点吗?


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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可靠的全双工串行通信 的相关文章

  • C语言UART通信(十六进制)

    我想向写入函数发送一个十六进制值 例如 0 90 这是因为需要通信的设备接收到的是十六进制数的命令 未使用的变量在测试时出现 并注释为丢失十六进制值 稍后将被删除 如何编写具有字符串以外的十六进制值的写入函数 对于初学者 请告诉我们如何通过
  • 如何更可靠地使用SerialPort类

    我一直在使用SerialPort在与我设计的一些外部硬件通信的应用程序中学习一段时间 在上述硬件的调试过程中 我发现了一些不可靠的地方 最近我偶然发现this http www sparxeng com blog software must
  • C#中通过串口访问蓝牙数据

    所以我在Unity3D中工作 用C 编程 我听说可以通过串行端口从蓝牙适配器读取数据 我尝试使用此方法将多个蓝牙 USB 适配器连接到我的电脑上 但是 当我尝试打开串行端口时 收到一条错误消息 指出端口不存在 我只包含与问题相关的代码 但
  • 在android中使用串口RS-232?

    我想在 Android 设备上使用 JavaComm API 类通过串行端口发送信号 我的想象如下 1 Android 设备为 Archos 3 2 具有 android 2 2 和 USB 主机模式 2 在我的 Android 应用程序中
  • 读取串行端口 - 忽略在一定时间内写入串行端口的部分数据

    我想定期读取串行端口上的数据和Arduino 所以本质上是这样的 读一读 Wait 读一读 Wait Take etc 我面临的问题是端口将缓冲其信息 因此一旦我调用等待函数 串行端口上的数据就会开始缓冲 等待函数完成后 我尝试再次读取数据
  • PHP 以奇怪的波特率进行串行

    我正在尝试使用 PHP 将文本发送到 LED 标志 以便我可以向其发送支持票号 标志本身就是一件作品 它来自 eBay 制作很差 几乎没有文档 经过一段时间的摆弄后 我能够弄清楚它期望的东西发送给它的方式 并且波特率为 28800 我已经知
  • 为什么我在 C# 中从串口得到部分奇怪的值

    我正在开发一个处理秤数据的程序 秤通过 USB 串行端口连接 我正在使用这个问题中的代码 如何通过串口RS 232或USB转换器将体重秤的重量显示到文本框中 https stackoverflow com questions 1061428
  • 串口通讯显示

    我正在尝试通过串行端口通信进行聊天 这个聊天必须在 WPF 项目中有一个界面 我已经制作了界面和所有内容 我陷入了通过串口接收响应的困境 我已经尝试从串行端口添加 DataReceived 事件 但我担心我使用错误 因为我以前从未用 C 编
  • 如何设置序列特殊字符?

    In my 持续的探索 https stackoverflow com q 5504716 50151为了与一些旧设备连接 我发现供应商提供的软件将特殊字符设置为 00 00 00 00 11 13 但 NET 的 SerialPort 类
  • C#:使用 Winforms 关闭 SerialPort 的正确方法

    我有一个应用程序 我可以从串行端口读取数据 一切正常 直到我关闭该应用程序 当我单击 X 时 应用程序只是挂起 UI 无响应 我从 DataReceived 事件处理程序中的端口读取数据 并在 FormClosed 发生时关闭端口 priv
  • C#读取Arduino

    我正在尝试制作一个从 Arduino 读取传出信号的应用程序 但我无法使其在 C 中工作Windows 窗体 http en wikipedia org wiki Windows Forms 仅在控制台中 我的 C Windows 窗体代码
  • Python Shell:写入一个字节并从串口读取十进制数据

    问题描述 我正在尝试使用 rs232 检索存储在设备上的所有数据 How 对于这个特定设备 我需要 Step 1 发送一个字节 0x80 uInt8 8 位无符号整数 通过串行端口 COM5 并期望收到 0x81 作为响应 Step 2 发
  • PhpSerial:没有可用的 stty——似乎无法让它工作

    我正在开发一个项目 涉及使用 Raspberry Pi 上的 UART 引脚读取和写入串行板 然而 我已经碰壁了 任何时候我尝试使用PhpSerial我总是收到错误 致命错误 没有可用的 stty 无法运行 在 var www PHP Se
  • 只是想从 Java Applet 将数据写入串行端口?

    几天来我一直在抓狂地想弄清楚为什么这似乎永远不起作用 首先 这是我的配置 Windows 7 x64JDK 7 x86JRE 7 x86火狐 x86由 Thin 提供服务的 Rails 3Java 设置使得 下一代插件 不处于活动状态 但它
  • Linux 上共享串口

    我正在使用 Raspberry Pi 进行一个项目 该项目需要能够写入和读取串行端口 但来自不同的程序 程序 A 需要能够从外围设备 A 正在发送数据的串行端口读取数据 程序B需要向串口写入数据 外设B正在监听串口 供参考 本例中程序A是G
  • qt 读取就绪信号

    我正在尝试与运行 1996 年处理器的设备建立串行连接 这意味着数据传输回我可能需要几秒钟的时间 我知道readyRead每次有新数据可用时都会生成信号 但我的问题是生成多长时间 这也是我可以测试就绪读取是否较低的一种方法 因为如果当它们不
  • Windows 通用应用程序串行端口无法打开,SerialDevice.FromIdAsync 始终为 null

    我正在尝试在 Windows 通用应用程序中使用串行端口 我一直在使用微软的串行示例应用程序作为模板 但是我遇到了一个相当奇怪的问题 var dis await DeviceInformation FindAllAsync SerialDe
  • 串行端口轮询和数据处理

    我正在尝试通过微控制器从传感器的多个串行端口读取数据 每个串口将接收超过2000个测量值 每个测量值7个字节 全部为十六进制 而且他们同时开火 现在我正在从 4 个串行端口进行轮询 另外 我将每个测量值转换为字符串并将其附加到字符串构建器
  • C# 计算LRC(纵向冗余检查)

    我一直在到处研究这个问题 所有 LRC 实现似乎都没有给我正确的答案 花了几天时间后 我决定将我的代码放在这里 看看其他人是否可以发现问题 这是代码 C Input Data 31303030315E315E31303030325E315E
  • 如何在 Mac OS X 10.9.5 上以编程方式读取低功耗蓝牙传输的数据?

    我正在尝试阅读蓝牙低功耗 http www bluetooth com Pages low energy tech info aspx使用 Ruby 以编程方式传输数据 低功耗蓝牙技术不支持标准规范 v4 0 中的串行端口配置文件 SPP

随机推荐