usb - STM32f103 HAL USB - UART桥接器
问题描述
我有一个 UART 可编程的第三方设备。
我需要创建一个带有功能密码的 USB - UART 桥接器(仅在输入正确密码后进行编程)
使用最新版本的 STM32CubeMX for Atollic TrueSTUDIO for STM32 9.3.0 生成代码...当我尝试传输时,我通过缓冲区(一个用于 usb-uart,另一个用于 uart-usb)在 USB 和 UART 之间传输数据几个字符一切正常,但是当我尝试传输大数据包时,由于USB速度远高于UART速度,问题开始了......
有两个问题:
1.如何告诉USB我需要停止传输数据并等待UART(缓冲区)忙
2.单片机端如何获取PC上设置的波特率(终端连接虚拟COM口时设置)
解决方案
USB 提供流量控制。这就是你需要实现的。一般介绍可以在这里找到:
基本上,USB 到 UART 方向的设置应该是:
- 表示代码已准备好接收 USB 数据包
- 接收 USB 数据包
- 表示您不再准备好接收 USB 数据包
- 通过 UART 传输数据
- 重来
步骤 0:初始设置
调用USBD_CDC_SetRxBuffer
以设置接收 USB 数据的缓冲区。除非您使用多个缓冲区来实现更高的吞吐量,否则在程序开始时进行一次调用就足够了。
第 1 步:准备接收数据
打电话USBD_CDC_ReceivePacket
。与名称所暗示的不同,此函数表明应用程序已准备好接收数据。它在实际接收到数据之前立即返回。
第 2 步:接收 USB 数据包
你不需要在这里做任何事情。它会自动发生。完成后,CDC_Itf_Receive
将被调用。
第 3 步:表明您不再准备好接收 USB 数据包
在这儿无事可做。每当接收到数据包时(并且未启用双缓冲),这都会自动发生。
第 4 步:通过 UART 传输数据
我想你知道怎么做。是否要以阻塞方式或使用 DMA 由您决定。
由于涉及回调,因此您不能将此代码放入主循环。CDC_Itf_Receive
如果使用阻塞 UART ,可能会将所有代码放入其中。它将按 2、3、4、1 的顺序出现。此外,还需要初始化(0 和 1)。
在 UART 到 USB 的方向上,您需要在 UART 上实现流控制。USB 流控制由主机管理。尽管 USB 比 UART 快得多,但流量控制是相关的,因为主机上的应用程序可以尽可能慢地处理数据。
关于问题2:我不确定我是否理解......微控制器无法在主机上设置波特率。主机可以指定波特率(通过 USB 传输并应用于 UART),或者如果 UART 具有固定波特率,则可以忽略波特率(主机端设置的任何波特率都可以工作,因为它不适用于USB)。
推荐阅读
- javascript - 如何使用 JavaScript 验证表单
- laravel - 此集合实例上不存在属性 [products]。(看法:
- c++ - const 临时类型的最佳实践
- java - PDF 的编码问题
- amazon-cloudwatch - 使用“aws cloudwatch get-metric-widget-image”从 aws CLI 获取“singleValue”图像
- android - 如何使用 a2dp 和 avrcp 蓝牙配置文件连接两个 android 设备?
- python - 将字符串转换为所需的 json 格式
- java - IBM Watson:未经授权
- python-3.x - 从熊猫数据框中除零以外的列表列中获取重复次数最多的值
- python - 将数据框中的对象(时间)类型列转换为日期时间