【问题标题】:stm32f3 USB VCP working unstablestm32f3 USB VCP工作不稳定
【发布时间】:2016-10-29 02:24:37
【问题描述】:

我正在对 STM32F373RCT 进行编程,并且一直在尝试制作 USB 虚拟串口设备。如果我以每秒约 960 位的速度发送数据(我使用了一个定时器(50Hz)并且我在每个周期中传输 14 个字节),则通信工作正常,但如果我尝试发送更多数据,则会丢失一些数据。我必须提高数据传输速度。我该如何增加?

【问题讨论】:

  • 如果没有更多关于您的代码对发送到 USB 堆栈或从 USB 堆栈接收的数据所做的操作、您正在生成的任何调试输出等的详细信息,这是无法回答的。通常站点规则会要求您在您的问题本身中包含一个演示该问题的最小示例,但对于一个有点大的裸机项目......

标签: c embedded usb stm32 keil


【解决方案1】:

USB 具有内置流量控制功能,因此您应该能够尽可能快地发送数据而不会丢失任何数据。您正在使用的 USB 堆栈或用于将数据发送到 USB 堆栈的代码中存在错误。如果您可以识别并修复该错误,那么您应该能够更快地发送数据而不会丢失任何内容。

【讨论】:

  • 我使用 KEIL 关于 USB 的内部库——用于发送数据:CDC_Transmit_FS(receive_p, 14); --用于检测连接: void USB_LP_IRQHandler(void) { HAL_TIM_Base_Stop_IT(&htim3); HAL_PCD_IRQHandler(&hpcd_USB_FS);循环++;如果loop的值大于40,我说它是连接的。
【解决方案2】:

这可能是驱动程序或相关设置的错误。我的一个项目使用 STM32F103 通过 USB 以 ~600KBytes/s 的速度发送数据,曾经使用 VCP 完成并且工作正常,直到 Linux 内核更新。新内核带有一个驱动程序,可以高速随机丢弃数据,可能是由于不同的缓冲区设置。

为了解决这个问题,我切换到libusb 并处理用户空间中的所有 BULK 数据包。无论是可靠性还是延迟(如果使用异步 API),它都运行良好。

我还制作了基于 STM32F103 的设备,可以与 flashrom 配合使用,并且可以通过 VCP 以超过 800KBytes/s 的速度传输而不会出现任何损失或问题,所以我猜这更多的是关于缓冲区设置。

【讨论】:

    【解决方案3】:

    我发现了问题。在我的代码中,3 个定时器中断处于活动状态,它们设置为高优先级。 USB 中断设置为低优先级。当 USB 连接到计算机时,新代码将停止计时器的中断。现在USB通讯稳定。非常感谢您的评论。

    【讨论】:

      猜你喜欢
      • 2016-02-06
      • 2015-07-06
      • 2021-11-23
      • 2016-09-03
      • 2016-05-15
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多