我该如何减少这些通过串行转USB适配器连接到PC的串行端口的延迟?


8

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

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

他们指定Windows 7作为平台,并购买了SeaLevel RS422至USB盒以将传感器和GPS连接起来,很快我就发现了自己的愚蠢之处。在传感器和我的计算机程序之间的某个地方,有些东西阻止扫描及时到达。LMS每秒发出75次扫描,或每秒13.32毫秒。我的程序无法及时获取它们。每隔100毫秒左右,以7或8或10或一组的形式获取它们。有时,也没有显示足够多的扫描,或者扫描被打乱了。这个SeaPort适配器每秒仅发送十次信号(可能吗?我不知道USB的工作方式),或者Windows几乎没有足够频繁地检查缓冲区(某处必须有缓冲区,对吗?)。

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

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


2
您必须谋杀谁才能获得这些激光测距仪,他是否还有一个朋友可能也有一些?
康纳·沃尔夫2014年

@ConnorWolf哈!我希望我拥有它们。这是为了农业(确定农作物的产量),所以他们愿意为硬件买单(拖拉机可能要花费75,000美元……),但不愿意为编程人才花钱。
canisrufus 2014年

我不知道Windows中的缓冲区大小,但是您当然要检查一下。在Linux上,这些缓冲区的大小为4kB,并且取决于您发送的数据和使用的系统调用,程序可能仅接收4kB数据块。如果这是问题,则您要仔细检查用于从缓冲区读取的系统调用。
jippie 2014年

1
我建议您考虑直接建立串行连接-您可以获取PC和笔记本电脑的串行端口卡(还要注意,大多数Panasonic硬皮书仍然标配串行端口)。这样可以避免USB串行接口中的任何缓冲问题。Windows 7具有足够好的实时功能,因此您可能无需取消这一功能。
ConcernedOfTunbridgeWells 2014年

只是一个评论:标题很有趣,但并不能帮助您弄清楚问题的内容:您能澄清一下吗?
clabacchio

Answers:


6

几乎可以肯定,问题出在与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系列具有类似的性能,并且更适合“高级”用户使用(阅读的内容很少,或者没有可供参考的示例)。意法半导体还生产许多非常不错的,极其廉价的评估板

使用Due,您确实会获得一个本地USB端口,如果需要,您可以为其滚动CDC驱动程序。某些STM32板也具有本机USB。


关于操作系统:目前,我正在单核平板电脑上使用Windows 7。我还可以使用笔记本电脑安装所需的任何东西。
canisrufus 2014年

7
我也会采用专用于微控制器来关联数据,然后将其转发到Windows框进行显示的目的。+1
JustJeff 2014年

1
您链接的卡可能会起作用,尽管从SeaLevel在其他地方看起来很胡扯的角度来看,我不确定我是否会信任他们。值得一提的是,他们确实提到PCI-e卡使用16C954硬件四核IC(大概卡上有两个)。
康纳·沃尔夫

1
确实,我认为唯一合适的解决方案是打电话给他们,然后问是否有延迟问题。可能有些事情可以在其驱动程序中进行调整!
康纳·沃尔夫

2
STM32F4解决方案+1; 在STM32F4发现板是滑稽 -priced,有多达6个UART的,和USB OTG FS接口。如果您不熟悉嵌入式设计,那么将发现要在其上运行USB相当困难。最简单的方法是使用FTDI电缆通过UART连接。Coocox IDE是免费的,没有代码大小限制,并且可以很好地支持发现板。
markt 2014年

3

如果我理解这个问题,这归结为在一条串行线上获取来自GPS的时间/地点消息,并关联在其他串行线上收到的距离数据消息。理想情况下,测距仪消息将有自己的时间戳,如果你可以同步所有的时钟,你可以牵制位置在那里的范围是采取插值与两个GPS信息之间的范围时间戳最接近的匹配时间戳。但是,当然,您没有那个。

想到了两种解决方案,包括使用微控制器进行实时数据关联以及将其输出泵送到PPC中以进行显示。基本上,微控制器在那里可以解决时间紧的问题。

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

当然,这会给您带来一定程度的不确定性,具体取决于GPS消息的频率。权衡是,随着您增加GPS消息频率(以获得更准确的相关性),您对微控制器的需求以及对进入PC的串行链路的需求都会增加。在极端情况下,串行链路已充斥着GPS消息,并偶尔会出现范围消息。显然,这些GPS消息中的大多数并不需要。但是,从软件的角度来看,该解决方案的优势在于微控制器几乎无事可做。您可以使用汇编语言的简单循环来完成所有操作,而无需任何操作系统。

对于更复杂的解决方案,您可以在微型计算机中形成本地时钟,然后使用GPS同步时钟,以便在收到测距消息时,可以使用微型计算机的时钟获取时间戳。使用带有晶体时基的微控制器,您可能可以获得1Hz的GPS消息,但仍然比范围消息上标记的毫秒精度时间要好得多。有能力的嵌入式系统人员也可能会在低端微型计算机上的汇编器中推出该产品,但您提到您才刚刚开始。您可能会看到一个可以运行linux的功能更强大的微型计算机,并且可能找到了用于将linux时钟与GPS同步的预先存在的解决方案。


比在MCU中构建实时时钟并使用GPS进行同步更容易,只是使用任何计时器/计数器外设来测量GPS消息和测距仪消息之间的周期数,并将该增量时间信息添加到数据流。
Ben Voigt 2014年

3

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


1

我还将选择一个微控制器来接收RS数据,对其进行时间戳记,然后将其转发到PC。您无法在Windows PC上执行任何I / O时序关键性工作(也许除了声卡以外),因为在背后更新驱动程序时,软件和驱动程序一直在变化。

但是,我要做的第一件事就是买一个USB逻辑分析仪,您可以用不到100美元的价格购买一个,分析仪从GPS接收器中获取一些消息,并确切地了解何时接收到每个字节。使用该信息可以首先尝试/精确计算数据计时的准确性:例如,精确地确定GPS盒何时传输。然后,您可以算出可以达到的精度,以及为达到一定的精度水平而愿意付出的努力。

在此处输入图片说明

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


[编辑]哈哈,使用声卡可能是使它真正起作用的一种有趣方式。您可以将UART数据(通过一些电阻器和电容器)连接到声卡输入,并编写软件来检测串行流中的每个边沿,从而为您提供出色的定时精度!好的,我并不是真的建议这样做,只是为了笑一下!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.