打印

GD32VF103V_EVAL使用USB转串口功能

[复制链接]
10403|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2021-9-17 09:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

单片机在调试的多少都会有向电脑发送数据的需要

GD32VF103V_EVAL自带了2个DB9的接口,因为手里没有对应的数据线无法连接电脑实现数据传输

另外GD32VF103V_EVAL开发板虽然带了CMSIS-DAP仿真器,但不知道为什么和之前的板子一样,这个负责提供仿真的芯片并没有和提供虚拟串口功能

现在可以说几乎所有集成仿真器的开发板上都会有虚拟串口功能,一根USB线又能调试又能实现USB转串口还是非常方便的

因为带DB9这样接口的电脑应该是越来越少了,USB转DB9的数据线我以前有一条后来一直没用现在也找不到了

以上方面行不通其实还可以通过开发板上的2.54排针通过其它开发板或者USB转TTL的转接板传输数据

不过那样还是麻烦,反正都是要多插一条数据线,还不如直接用板子里的USB转串口功能

找到下边这个固件包的例程

GD32VF103_Firmware_Library_V1.0.1\Examples\USBFS\USB_Device\CDC_ACM

使用NucleiStudio导入后在工程上点右键->Debug As->Debug Configurations


在Debug Configuration窗口找到GDB OpenOCD Debugging,在上边点右键->New Configuration


因为上次配置过openocd_gdlink.cfg的路径,这次新建好以后就可以直接使用


点Debug按钮进入调试模式,让程序跑起来后可以在设备管理器里看到虚拟串口


例程里是一个数据回显,电脑向开发板发数据,开发板把数据原回返回,打开串口助手发送数据可以看到回显


从代码可以看出主循环里,先是判断USB的状态,然后再判断发送和接收标志是否为1

老实说,if (1 == packet_receive && 1 == packet_sent) 这句话我到现在也没弄明白是什么意思,看了所有设置packet_receive和packet_sent的代码也没理解它的作用

反正是当他俩不全是1时再判断接收到的数据是不是不为0,如果不为0则把数据发送回PC


packet_receive和packet_sent代码是在cdc_acm_core.c里设置的,同时收到和要发送的数据也是在这个文件里处理里

对应的缓冲为usb_data_buffer


如果想发送算定义的数据操作起来是有一点麻烦的,因为不确定修改cdc_acm_core.c文件添加一个发送数据的函数是否符合逻辑

那就把代码都写在main.c里,像下边这样,先把要发送的数据填充到usb_data_buffer,然后再执行cdc_acm_data_send函数


运行程序,打开串口助手再发送数据发现接收到的已经是自定义数据,而不是发送去的数据


从代码可以看出cdc_acm_data_send函数里执行了usbd_ep_send函数,如果想直接发送,而不是使用sprintf填充完usb_data_buffer再发送是不是可以把这个usbd_ep_send函数也放到main.c里呢?


把代码改成下边这样,数据也可以正常发送,少了一个sprintf环节,但是跳过cdc_acm_core.c文件直接执行usb_core.c里的函数不知道是否合理

反正能用,先将就着用吧


使用特权

评论回复
沙发
casojie| | 2021-9-17 10:44 | 只看该作者
我也在看这段代码,说实话1 == packet_receive && 1 == packet_sent,这玩意写得,我真是服了

使用特权

评论回复
板凳
xdqfc| | 2021-9-17 14:09 | 只看该作者
casojie 发表于 2021-9-17 10:44
我也在看这段代码,说实话1 == packet_receive && 1 == packet_sent,这玩意写得,我真是服了 ...

像这种代码,咱还是规规矩矩的用括号括起来,心里放心些。即使以后回头看代码,都清清楚楚明明白白。花里胡哨的东西有个卵用,出了问题,查询都麻烦。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2038

主题

7367

帖子

10

粉丝