一、使用CubeMX初始化
1.开启USB外设
参数全默认即可
2.配置中间层使能CDC(VPC)
参数依然全默认
3.配置USB时钟48MHz
输入频率后让CubeMX自动配置即可
二、发送?
USB虚拟串口的收发我们只需要关注Application/User/USB_Device/App目录下的usbd_cdc_if.c/h文件即可
可以看到.h文件中给出的函数只有一个
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);
参数分别是发送内容指针和长度
在main.c中声明发送字符串和长度,在循环中发送:
/* USER CODE BEGIN 2 */
char USB_TxBuf[32];
uint16_t len;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
len=sprintf(USB_TxBuf,"Hello HFUT_ETA!\r\n");
CDC_Transmit_FS(USB_TxBuf,len);
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
这时使用串口助手就可以在电脑上观察到发送结果了:
?三、接收回传
接收函数在usbd_cdc_if.h中并没有给出,而是在usbd_cdc_if.c中以static关键字给出的
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
return (USBD_OK);
/* USER CODE END 6 */
}
这个函数其实是在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 */
}
?可以直接在串口助手中观察到回传结果
?四、其他
1.如果配置完成后在设备管理器中观察到设备未被正常识别,可以增大堆栈的大小并检查48MHz时钟是否由外部晶振或内部专用时钟提供
?2.用这种方式配置的虚拟串口不用设置波特率,上位机在任意波特率设置下都可以正常接收到结果且不影响传输速度
|