STM32f103 HAL USB-UART网桥

STM32f103 HAL USB-UART网桥,usb,stm32,hal,Usb,Stm32,Hal,我有一个UART可编程的第三方设备 我需要创建一个带有功能密码的USB-UART网桥(仅在输入正确密码后编程) 使用最新版本的STM32CubeMX for Atolic TrueSTUDIO for STM32 9.3.0生成代码。。。 我通过缓冲区在USB和UART之间传输数据(一个用于USB UART,另一个用于UART USB) 当我尝试传输几个字符时,一切都正常,但当我尝试传输一个大数据包时,问题开始出现,因为USB速度远远高于UART 有两个问题: 1.如何告诉USB我需要停止传输数

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

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

使用最新版本的STM32CubeMX for Atolic TrueSTUDIO for STM32 9.3.0生成代码。。。 我通过缓冲区在USB和UART之间传输数据(一个用于USB UART,另一个用于UART USB) 当我尝试传输几个字符时,一切都正常,但当我尝试传输一个大数据包时,问题开始出现,因为USB速度远远高于UART

有两个问题:

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


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

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

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

  • 指示代码已准备好接收USB数据包
  • 接收USB数据包
  • 指示您不再准备接收USB数据包
  • 通过UART传输数据
  • 重新开始
  • 步骤0:初始设置

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

    步骤1:准备接收数据

    调用
    USBD\u CDC\u ReceivePacket
    。除了名称所暗示的,此函数表示应用程序已准备好接收数据。它在实际接收数据之前立即返回

    步骤2:接收USB数据包

    你不需要在这里做任何事情。它将自动发生。完成后,将调用CDC\u Itf\u Receive

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

    这里没什么可做的。每当接收到数据包时(并且未启用双缓冲),就会自动发生这种情况

    步骤4:通过UART传输数据

    我想你知道怎么做。这取决于您是想以阻塞方式还是使用DMA

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

    在UART到USB的方向上,您需要在UART上实现流控制。USB流控制由主机管理。尽管USB比UART快得多,但流量控制是相关的,因为主机上的应用程序可以以自己喜欢的速度处理数据


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

    您是否使用STM32 HAL驱动程序?是。。。STM32Cube_FW_F1_V1.8.2这是一个完美的任务,因为RTOSRTOS是一个有效的选项。其他方法也是有效的,例如更多地依赖DMA。代码和RAM占用空间非常小的示例:(它用于libopencm3,而不是STM32 HAL)。最困难和有趣的部分将是UART到USB ie char设备到块设备。你不能只是通过USBchar通过char发送,因为它会在短时间内杀死USB(特别是FS),有什么想法吗?使用DMA和环形缓冲区从UART接收数据,并每隔1ms检查一次新数据。此外,每次向主机发送数据包时都要进行检查。如果需要可靠,则必须在UART上使用软件或硬件流量控制。否则,环形缓冲区可能会溢出,数据将丢失。恐怕不是每个msek都可以使用CDC发送内容。哈尔处理得很正确。@P_ujsupportswomenipland您可以很容易地每1ms发送一次。这是主机轮询设备的速率。这是完美的价格。当然,您需要确保前一个数据包已发送。-我不明白你说的“哈尔处理得很好”是什么意思