我可以做些什么来减少这些通过串行到 USB 适配器连接到 PC 的串行端口的延迟?

电器工程 USB rs232 rtos rs422
2022-01-19 06:34:52

我想我偶然发现了我生活中对嵌入式系统的需求。太棒了!而且有点吓人。我需要帮助。

背景:我受聘构建一个 GUI 应用程序,该应用程序从两台SICK LMS-291上进行扫描,并将它们与亚英寸精度的 GPS 集成,这样您就知道每次扫描发生在哪里。作为一个天真的网络程序员,我知道时机很重要,但没有意识到这也很困难!如果您不知道每个 GPS 点和每次扫描发生的时间,您就无法确定扫描发生的位置。哎呀。

他们指定了 windows 7 作为平台,并购买了一个SeaLevel RS422 转 USB盒来连接传感器和 GPS,很快我就发现了我的愚蠢。在传感器和我的计算机程序之间的某个地方,有些东西阻止了扫描及时到达。LMS 每秒输出 75 次扫描,或 13.32 毫秒/扫描。我的程序没有及时得到它们。它每 100 毫秒左右获取一次,以 7 或 8 或 10 组为一组。有时也没有足够的扫描显示,或者它们被破坏了。要么这个 SeaPort 适配器每秒只发送 10 次(这可能吗?我不知道 USB 是如何工作的),要么 Windows 没有检查缓冲区(一定有缓冲区,对吧?)几乎足够频繁。

现在:这会导致客户基本上可以接受的一些不准确之处。不过我不是,因为我有机会为客户做类似的工作(集成更多的传感器输入!),我想弄清楚如何正确地做,例如考虑到 GPS 的准确性,能够保证扫描位置的精度和准确性。

那看起来像什么?我需要一个 UI,并且能够每 13.32 毫秒检查一次来自这三个设备的输入。如果我将 FreeRTOS 与例如用于 GUI 的 Nano-X 一起使用,在他们提供的笔记本电脑上运行,这听起来像一个理智的解决方案吗?是否有可能是 RS-422 到 USB 适配器导致了这些延迟,而使用 Windows 实际上就可以达到这个目的?

4个回答

几乎可以肯定,问题出在与 USB-RS422 转换器相关的 USB 缓冲中。USB 具有可变且相当高的延迟。

最简单的解决方案就是更好的 RS422 接口,最好是基于 PCI/PCI-e 的接口。这将解决延迟问题。

您也可以修改 USB 轮询速率,尽管这在很大程度上取决于主机操作系统(您在什么平台上?)。


对于它的价值,我查看了海平面系统的网站,它被大量的营销废话感染了。他们实际上花了大约 10 页和多份白皮书说“我们在内部使用 USB 集线器,而不是进行 MCU 多路复用”。

嘿海平面!这就是我在 e-bay 上从中国购买的便宜的 50 美元 4 端口 USB 串行接口的功能!你并不特别,即使你写了半打乏味的白皮书试图让它听起来像你一样!

您是否尝试过强迫这些东西使用 FTDI 驱动程序?我会投入资金,他们只是使用沼泽标准的 FTDI FT232 或类似产品。你能打开其中一个的盒子,然后拍照吗?


如果您真的想开发自己的硬件,以获得乐趣或教育机会,我强烈建议您不要尝试在硬件中做所有事情。由于您需要简单地对所有三个信号进行时间相关,因此您真正需要的是可以在三个串行线路(两个 RS422,一个 RS232(GPS))上监听的东西,为数据加上时间戳,并将其转发到主计算机.

一旦数据被加上时间戳,你就可以自由地拥有你想要的所有缓冲延迟,因为你总是可以只看时间戳。

实际上,如果您没有硬件基础,那么设计一个足够紧缩的东西来绘制一个漂亮的 GUI 是一项艰巨的任务。

就个人而言,我可能会在缓冲问题上抛出一个相当厚实的 ARM MCU,然后就可以解决了。尽管它是一个 Arduino,但Arduino Due有大量的 SRAM,并且速度足够快,可以满足您的需求(并且有很多支持,这总是很好)。
或者,STM32 系列具有类似的性能,并且更适合“高级”用户(阅读,参考的示例较少或没有示例)。ST 也制造了很多非常好的、非常便宜的评估板

使用 Due,您可以获得一个原生 USB 端口,如果需要,您可以使用自己的 CDC 驱动程序。一些STM32 板也有原生 USB。

如果我理解这个问题,这归结为通过一条串行线路从 GPS 获取时间/地点消息,并关联通过其他串行线路接收的距离数据消息。理想情况下,测距仪消息将有自己的时间戳,如果您可以同步所有时钟,您将能够通过在两条 gps 消息之间插入距离时间戳来确定测距的位置最接近的匹配时间戳。但是,当然,你没有那个。

有几个解决方案浮现在脑海中,都是使用微控制器进行实时数据关联,并将其输出泵入 PPC 以进行显示。基本上,微控制器是用来处理时间紧迫的问题的。

因此,对于更简单的解决方案,您只需要某种方法来收集来自多个不同串行线路的所有消息,然后按照接收顺序将它们组合成一个流,然后将其泵入 PC。您可以推断出两条 GPS 消息之间的任何测距仪消息都发生在这两条消息之间的某个时间。

当然,这会给您带来一定程度的不确定性,具体取决于 GPS 消息的频率。权衡是当您增加 GPS 消息频率(以获得更准确的相关性)时,您会增加对微控制器的需求,以及对连接到 PC 的串行链路的需求。在极端情况下,串行链路充满了 GPS 消息,偶尔会输入范围消息。显然,大多数 GPS 消息是不需要的。不过,这种解决方案的优势在于,从软件的角度来看,微机几乎没有什么可做的。你可以在一个简单的汇编语言循环中完成这一切,不需要操作系统。

对于更复杂的解决方案,您可以在 micro 中形成本地时钟,并使用 GPS 同步时钟,这样当您收到距离消息时,您可以使用 micro 的时钟获取时间戳。使用带有水晶时基的微型计算机,您可能会收到 1Hz GPS 消息,并且仍然比范围消息上标记的毫秒精度时间要好得多。一个称职的嵌入式系统人员可能也可以在低端微型的汇编程序中完成这个,但你提到你才刚刚开始。您可以查看可以运行 linux 的更强大的 micro,并且可能会找到一个预先存在的解决方案,用于将 linux 时钟与 GPS 同步。

我可能会做的是将串行数据以更高的速率复用到一个新的串行数据流中,并带有静态交错。然后通过 USB-UART 将数据流馈送到计算机。这样你就会知道第一个字节来自设备 1,第二个字节来自设备 2,第三个字节来自设备 3,在这种情况下,第四个字节作为 CRC 或序列号。输入帧标记的几个字节开始以在数据流上同步,如果没有可用数据则填充字节并且您已完成。您可能不知道绝对时间,但您确实知道各个数据块之间的相对时间。

我还会使用微控制器来接收 RS 数据,为其添加时间戳,然后将其转发到 PC。您不能在 Windows PC 上执行任何对 I/O 时序至关重要的工作(也许声卡除外),因为随着驱动程序在您背后的更新,软件和驱动程序一直在变化。

但我要做的第一件事是买一个 USB 逻辑分析仪,你可以花不到 100 美元买一个,从 GPS 接收器中获取一些信息,然后检查每个字节的确切接收时间。使用该信息首先尝试/计算数据时间的准确度:例如 GPS 盒传输的确切时间和时间。然后,您可以计算出可以达到的准确度,以及您愿意付出多少努力才能达到一定的准确度。

在此处输入图像描述

上图是一些(Saleae?)USB 逻辑分析仪的图片。


[编辑] 哈哈,使用声卡可能是一个有趣的方式让它真正工作;您可以将 UART 数据连接到声卡输入(通过一些电阻器和电容器)并编写软件来检测串行流中的每个边缘,从而为您提供漂亮的计时精度!好吧,我并不是认真地建议这个,只是为了一些笑声!