我正在开发一个C#开发项目,旨在通过一套Optitrack相机(红外动作捕捉系统)来控制飞行机器人。这个概念非常有效,你从相机系统获得一个位置,我们的应用程序可以访问这些数据,我们可以控制机器人。
我相信问题来自沟通链。我们有一根USB电缆将我们的PC连接到基于STM32F4的电路板,该电路板充当电桥,只需将嵌入式NRF模块(nRF24L01 +芯片)上的USB接收信息发送到无线电设备即可。这种机制是双向的(NRF - > USB - > PC)。该板使用FreeRTOS在C下运行。 PC运行Windows 10。
在PC端,我们使用ST的官方STM32 VCP驱动程序1.4。在主板固件上,我们在STM32F4上为VCP提供了这个用户自定义的库:https://stm32f4-discovery.net/2014/08/library-24-virtual-com-port-vcp-stm32f4xx/ 除了来自无线电模块本身以及可能是STM32 VCP驱动程序本身之外,桥接板上没有队列。我检查过,这个驱动程序中有一个循环缓冲区,用于输入和输出消息。使用JSCOPE我可以实时看到这个循环缓冲区的行为,并且我从未见过发生溢出。
我的问题来自突然出现延迟的事实。 该系统可以完美地工作几十分钟(10到20分钟之间),然后延迟可以清晰地感知,这使得控制器振荡。这种情况发生在我第二次飞行时。
以下尝试过: - 重新启动C#应用程序 - 在调试模式和独立模式下运行C#应用程序 - 更换USB线(更短) - 更改USB端口 - 更换电脑 - 重新安装ST VCP驱动程序 - 大幅降低通信频率(控制回路)
当出现问题时,上述解决方案无法正常工作,延迟仍然完全,并且上述方法都没有证明可以使其更可靠。
在C#应用程序中,我在每次飞行前重置所有通讯列表。 SerialPort端口对象(来自System.IO)也重置了缓冲区(DiscardOutBuffer,DiscardInBuffer,BaseStream.Flush方法)
我找到了一个" hack"使它工作,但它不是我们想要的最终解决方案。 " hack"是简单地断开/重新连接USB连接板作为桥接器。经过这次操作后,延迟消失了。
所以我的问题是:
什么可能带来这种延迟,知道它看起来不依赖于应用程序,也不依赖于频率(带宽)。
什么可以解释为什么在拔掉/插入桥接板时这会消失?
我知道这个问题是关于一个大项目,可能很难从外面理解。如果需要,请随时向我询问更多详细信息。
干杯,
马克