单片机在调试的多少都会有向电脑发送数据的需要 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里的函数不知道是否合理 反正能用,先将就着用吧
|