0

我正在开发一个 C# 开发项目,该项目旨在通过一组 Optitrack 相机(红外运动捕捉系统)控制飞行机器人。这个概念非常有效,你从摄像头系统中获得一个位置,我们的应用程序可以访问这些数据,我们可以控制机器人。

我相信问题出在沟通链上。我们有一根 USB 电缆将我们的 PC 连接到基于 STM32F4 的电路板,该电路板充当桥接器,借助嵌入式 NRF 模块(nRF24L01+ 芯片)将通过 USB 接收到的所有内容简单地发送到无线电。这个机制是双向的(NRF -> USB -> PC)。该板使用 FreeRTOS 在 C 下运行。电脑运行 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,充当桥接器。在此操作之后,延迟消失。

所以我的问题是:

  • 什么可能带来这种延迟,知道它看起来并不依赖于应用程序,也不与频率相关(带宽)。

  • 什么可以解释为什么在拔下/插入桥接板时它会消失?

我知道这个问题是关于一个大项目的,从外面可能很难理解。如果需要,请随时向我询问更多详细信息。

干杯,

马克

4

0 回答 0