点击蓝字 关注我们
实在太懒于是不想取名
1
前言
上一期我们介绍到了什么是虚拟串口?虚拟串口的本质是利用USB协议让PC为USB设备开启一个虚拟端口。那么我们也可以利用单片机中板载USB实现这个功能,本期我们就介绍利用STM32最小系统板实现虚拟串口的功能。
2
硬件资源
一块有着16Pin及以上的STM32最小系统板。USB的D+,D-接到单片机中。
当我们将单片机通过有效的数据线接入PC之后,PC会识别到USB,但是无法识别USB设备,这是因为我们还没有编写USB驱动,系统并不认识这是一个什么设备。
3
CubeMX初始化
在CubeMX中找到USB接口,由于STM32F103C8T6较为简单,它的USB仅有常规的FS即USB1.1/2.0,通讯速度为12Mbps。
接着我们在拓展包中快速配置USB设备,定义我们的 USB设备类 。常见的 USB设备类 有:
CDC(通信设备类,Communication Device Class)
,该类允许STM32作为虚拟串口(VCP)与PC进行串行通信。也就是本期我们要使用的类。
HID(人机接口设备类,Human Interface Device):
HID类用于创建人机接口设备,如键盘、鼠标、游戏控制器等。STM32可以通过HID类实现与PC的交互, 模拟键盘按键、鼠标移动 等。
MSC(大容量存储类,Mass Storage Class)
:该类使STM32能够作为USB存储设备,与PC交换数据。常用于实现U盘或外部存储设备功能。
Audio(音频类) :音频类用于音频设备的数据传输,适用于USB麦克风、音频接口、扬声器等设备。
设备描述符中可以修改我们的USB设备名字。
4
USB与电脑传输
配置完USB工程之后,我们可以看到工程中多出了关于USB的配置文件。
usb_device.c 文件是 USB 设备的核心文件,负责 USB 设备的初始化、状态管理和操作。这些操作包括 USB
设备的启动、停止、连接状态管理等。
usbd_desc.c 文件主要负责 USB 描述符 的定义和传输。USB 描述符是 USB
协议中用于描述设备特性的数据结构,包括设备描述符、配置描述符、接口描述符、端点描述符等。
usbd_cdc_if.c 文件用于 实现 USB 通信设备类 (CDC) 的接口。CDC(Communication Device
Class)是用来在 USB 设备和主机之间实现虚拟串口通信的协议。
我们的发送函数和接收函数就主要是在usbd_cdc_if.c 文件中。
CDC_Transmit_FS(Buf, *Len);//需要包含#include "usbd_cdc_if.h"文件
我们可以调用这个函数来向USB发送数据。并且在 usbd_cdc_if.c文件中有对应的接收中断回调函数。
while (1) { /* USER CODE END WHILE */
/* USER CODE BEGIN 3 */ CDC_Transmit_FS("Hello",6); HAL_Delay(500); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13); }
我们在主函数中调用发送函数,下载到最小系统板之后,连接上电脑。
可以看到,设备管理器中正常的识别到了这个USB设备,并且为其开启了虚拟端口作通讯使用。
接着我们在usbd_cdc_if.c 文件中找到USB的接收中断,我们做一个串口回传。
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len){ /* USER CODE BEGIN 6 */ CDC_Transmit_FS(Buf, *Len); USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); USBD_CDC_ReceivePacket(&hUsbDeviceFS); return (USBD_OK); /* USER CODE END 6 */}
下载程序之后观察效果。
5
思考
我们成功的用板载USB实现了虚拟串口的通讯,但是大家有没有发现,为什么全文上下都没有提到关于波特率,停止位这些的设定呢?
事实上我们在通讯的时候根本不用管波特率,我们所谓的虚拟串口实际上只是让PC开启了一个虚拟端口,但是我们的通讯流程并没有涉及到真正的串口通信。
下一期我们可以好好聊一聊这个问题。