STM32Cube配置USB虚拟串口发送与接收回传

一、使用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.用这种方式配置的虚拟串口不用设置波特率,上位机在任意波特率设置下都可以正常接收到结果且不影响传输速度

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值