首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >STM32f103 HAL USB - UART桥

STM32f103 HAL USB - UART桥
EN

Stack Overflow用户
提问于 2020-11-03 22:56:03
回答 1查看 614关注 0票数 0

我有一个UART可编程的第三方设备。

我需要创建一个具有功能密码的USB - UART网桥(只有在输入正确的密码后才能编程)

已使用最新版本的STM32CubeMX生成代码,适用于STM32 9.3.0版的Atollic ...我通过一个缓冲区在USB和UART之间传输数据(一个用于usb- UART,另一个用于uart- USB )当我尝试传输几个字符时一切正常,但当我尝试传输一个大的数据包时,由于USB速度比UART高得多的事实,问题开始...

这里有两个问题:

1.如何告诉USB我需要停止传输数据并等待UART (缓冲区)繁忙

2.如何在微控制器一侧获得PC上的波特率设置(当终端连接到虚拟COM端口时设置)

EN

回答 1

Stack Overflow用户

发布于 2020-11-03 23:25:20

USB提供流量控制。这就是你需要实现的。在这里可以找到一般的介绍:

https://medium.com/@manuel.bl/usb-for-microcontrollers-part-4-handling-large-amounts-of-data-f577565c4c7d

基本上,USB到UART方向的设置应为:

  • 表示代码已准备好通过UART packet

  • Transmit

  • Start packet

  • Transmit

接收数据您不再准备接收USB数据包。

步骤0:初始设置

调用USBD_CDC_SetRxBuffer设置接收USB数据的缓冲区。除非您使用多个缓冲区来实现更高的吞吐量,否则在程序开始时调用一次就足够了。

第1步:准备接收数据

USBD_CDC_ReceivePacket打电话。与名称所暗示的不同,此函数表示应用程序已准备好接收数据。它会在实际收到数据之前立即返回。

USB第2步:接收数据包

你不需要在这里做任何事情。这将会自动发生。一旦完成,就会调用CDC_Itf_Receive

USB第3步:表示您不再准备接收数据包

这里没什么可做的。只要接收到数据包,就会自动执行此操作(并且未启用双缓冲)。

第四步:通过UART传输数据

我猜你知道怎么做。你想以阻塞的方式还是使用DMA来完成它,这取决于你自己。

由于涉及回调,因此不能将此代码放入主循环中。如果使用阻塞UART,则可以将所有代码放入CDC_Itf_Receive中。它将以2、3、4、1的顺序出现。此外,还需要初始化(0和1)。

在UART- to -USB方向,您需要在UART上实现流控制。USB流控制由主机管理。尽管USB比UART快得多,但流量控制是相关的,因为主机上的应用程序可以像它喜欢的那样缓慢地处理数据。

关于问题2:我不确定我是否理解它。微控制器无法在主机上设置波特率。主机可以指定波特率(通过USB传输并应用于UART),或者如果UART具有固定的波特率,您可以忽略波特率(主机侧设置的任何波特率都将起作用,因为它不适用于USB)。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64665255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档