请选择 进入手机版 | 继续访问电脑版

芯虎论坛

 找回密码
 立即注册
查看: 344|回复: 0

HC32F460系列虚拟串口问题

[复制链接]

18

主题

27

帖子

216

积分

虎背熊腰

Rank: 3Rank: 3

积分
216
发表于 2021-5-23 17:25:44 | 显示全部楼层 |阅读模式
华大HC32F460系列支持USB FS协议栈,其中CDC的VCP虚拟串口 在上一个华大SDK版本上(hc32f46x_ddl_Rev1.2.0)是有虚拟串口的例子提供。
而到了目前最新官方网站的SDK上(版本:hc32f46x_ddl_Rev1.3.1),这个VCP虚拟串口例子却被删除了。
所以我只用了hc32f46x_ddl_Rev1.2.0版本例程跑了一下USB虚拟串口。

打开例程 ,实际上这个例程做的内容是把USB虚拟成一个COM串口,然后这个COM串口链接到了MCU物理串口UART4上。

例程上 VCP_fops 这个结构体内保存了用户要把USB这个虚拟串口对接到哪个物理串口上或对接到用户自己的哪个接收和发送接口上。上电后USBD_Init 这个UBS初始化函数 对这个VCP_fops 进行初始化,并在USB协议栈架构下运行。
其中VCP_Init 函数就是本例子中,虚拟串口要对接到的物理串口UART4的初始化函数。但我已经把VCP_fops中除了VCP_DataTx和VCP_DataRx内的内容全部注释为空了。
注意我是注释为空,让这些函数为空函数,直接return,而不是把函数注释掉。比如USBD_Init ,因为我要改造一下这个例子,不让虚拟串口对接到UART4,而是直接通过这个虚拟串口让MCU同上位机电脑通信
上位机和MCU通过USB虚拟串口通信的所有数据,都由MCU来处理,不映射到具体的UART上再,也就不再从MCU通过物理UART传输出去。
我的VCP_Init  入下:看到这个函数进入后直接return,因为我不需要对UART进行初始化。


那么我们关注的就是VCP_DataTx和VCP_DataRx 这两个函数。
VCP_DataRx:从USB虚拟串口接收到的数据,数据接收到后可以通过这个函数接口通知应用程序或再此copy到其他内存上去。
我这里没由做任何处理,直接就是通过Dump函数,把从上位机传来的数据打印出来。


VCP_DataTx:是我们要把MCU上的数据通过USB虚拟串口发送给上位机。
代码中,APP_Rx_Buffer是MCU要发送数据放入的buffer,这个buffer在例子中最后是把地址赋值到了USB DMA的源地址上。
而APP_Rx_ptr_in这个index计数器实际上是这个例子中发送数据的结束位置,这个位置置于APP_Rx_Buffer中。
可以看到,我实现的这个函数名为VCP_DataTx2USB,不是VCP_DataTx,这是可以的。这个只是作为一个虚拟串口发送接口来使用,可以叫不同的名字。
我们想通过USB虚拟串口发送数据时,直接调用此函数即可,无论这个函数名是什么。实际这个函数中即是对APP_Rx_Buffer和APP_Rx_ptr_in的操作。
USB协议栈中 通过判断APP_Rx_ptr_in来确定是否由数据要发送,发送多少数据。


以下是VCP_DataTx2USB这个函数要通过USB虚拟串口发送数据给上位机的用法:


注意一个华大虚拟串口协议栈中的一个BUG,我在网上查找STM32  的USB协议栈也由类似的BUG。
着bug就是 如果你使用VCP_DataTx2USB或者VCP_DataTx发送数据,如果数据长度是64B字节的倍数,那么USB协议栈只会等到USB RAM到达4KB字节总量后才会发送出去,而不是实时发送。
我做了试验,如果不是64字节的整数倍,通过VCP_DataTx2USB或者VCP_DataTx是可以实时把数据发到上位机的。








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|芯虎论坛 ( 辽ICP备18019618号 )

GMT+8, 2021-6-22 22:52 , Processed in 0.113994 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表