stm32Cubemx USB虚拟串口

CubeMx配置

时钟:
在这里插入图片描述
选择USB_OTG_FS->Mode->Device_Only,其余默认即可在这里插入图片描述
USB_DEVICE->Class For FS IP选择虚拟串口,其余不变
在这里插入图片描述
修改Heap Size 大小,小了会识别到USB造成驱动设备出现感叹号
在这里插入图片描述
在这里插入图片描述

代码

编写连接情况查询函数:
hUsbDeviceFS定义在usb_device.c中

void VCP_Status(void)
{
    static uint8_t old_status = 0;
 
    if(hUsbDeviceFS.dev_state != old_status)
    {
        if(hUsbDeviceFS.dev_state == USBD_STATE_CONFIGURED)
            printf("连接成功\r\n");
        else if (hUsbDeviceFS.dev_state == USBD_STATE_SUSPENDED)
            printf("断开成功\r\n");
        old_status = hUsbDeviceFS.dev_state;
    }    
}

编写USB发送函数usb_printf():放置于usbd_cdc_if.c文件的
/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION /
/
USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */中,并在usbd_cdc_if.h声明

#include <stdarg.h>
void usb_printf(const char *format, ...)
{
    va_list args;
    uint32_t length;
 
    va_start(args, format);
    length = vsnprintf((char *)UserTxBufferFS, APP_TX_DATA_SIZE, (char *)format, args);
    va_end(args);
    CDC_Transmit_FS(UserTxBufferFS, length);
}

在usbd_cdc_if.c文件的
/* USER CODE BEGIN PRIVATE_VARIABLES /
/
USER CODE END PRIVATE_VARIABLES */位置添加结构体定义:用于接收

typedef struct{
  uint32_t rxlen;
  uint32_t flag;
}VcpRx_t;
 
VcpRx_t temp = {
    .rxlen =0,
    .flag = 0
};

相同文件下,修改static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)函数,修改后为
注:发送时每次发送必须以\r\n结尾

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
    temp.rxlen = temp.rxlen + (*Len);
    
    if(temp.rxlen < APP_RX_DATA_SIZE && UserRxBufferFS[temp.rxlen - 2] != 0x0d  \
        &&  UserRxBufferFS[temp.rxlen - 1] != 0x0a)//***发送时每次发送必须以\r\n结尾***
    {
       //---继续接收---------------
       USBD_CDC_SetRxBuffer(&hUsbDeviceFS,UserRxBufferFS  + temp.rxlen); 
       USBD_CDC_ReceivePacket(&hUsbDeviceFS);
    }
    else 
    {
       temp.flag = 1;    //接收完成
       UserRxBufferFS[temp.rxlen] = 0;
    }
    return (USBD_OK);	
  /* USER CODE END 6 */
}

编写USB发送函数rxdata_printf():放置于usbd_cdc_if.c文件的
/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION /
/
USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */中,并在usbd_cdc_if.h声明

//接收完成后通过usb回发数据
void rxdata_printf(void)
{
  if(temp.flag)
  {
    usb_printf("%s\r\n", UserRxBufferFS);//若无需回发,屏蔽即可
    temp.flag = 0;
    temp.rxlen = 0;
    memset(UserRxBufferFS, 0, APP_RX_DATA_SIZE);
    USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS); 
    USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  }
}

主函数

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USB_DEVICE_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		//CDC_Transmit_FS((uint8_t *)"无Fuck说!\n",sizeof("无Fuck说!\n"));//也可这样发送
		usb_printf("发送数据\r\n");
		HAL_Delay(500);
		rxdata_printf();
  }
  /* USER CODE END 3 */
}

在这里插入图片描述
波特率随便设,没有固定
参考:https://blog.csdn.net/sudaroot/article/details/86627853

  • 19
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: STM32CubeMX是一款用于STM32微控制器的图形化配置工具,它可以帮助开发者快速生成代码和配置文件。其中,USB虚拟串口STM32CubeMX中的一个功能,它可以将STM32微控制器通过USB接口模拟成一个串口设备,从而实现与PC机的通信。开发者可以通过配置STM32CubeMX中的USB虚拟串口功能来实现这一功能。 ### 回答2: STM32CubeMX是一种嵌入式软件开发工具,它提供了许多用于STM32系列芯片的代码生成器和配置工具。其中之一是USB虚拟串口USB虚拟串口是一种通过USB接口实现串口通信的技术,它可以代替传统的RS-232串口,并提供更好的性能和易用性。 在STM32CubeMX中,使用USB虚拟串口需要进行以下步骤: 1. 在配置选项卡中,选择“USB_DEVICE”并启用“Virtual COM port” 2. 选择需要的USB模式,可选的有Device_only、Host_only、Dual_role(OTG)三种模式中的任意一种 3. 配置USART串口,例如选择USART2,并设置波特率、数据位、校验位、停止位等参数 4. 生成代码并将其下载到开发板中进行验证 使用USB虚拟串口可以方便地进行PC机与STM32之间的数据传输和控制。在PC机上,可以使用任何串口通信软件,如Tera Term、Putty等,通过USB虚拟串口进行数据传输。在STM32上,可以通过编写相应的代码来实现与PC机的数据交换和处理。 此外,STM32CubeMX还提供了许多其它的功能和工具,例如中断配置、时钟设置、GPIO配置等等,使得我们在开发STM32嵌入式系统时更加快捷、高效。 ### 回答3: STM32CubeMX 是一款强大的微控制器开发工具。它可以帮助程序员快速生成基于 STM32 微控制器的代码和配置文件,以及项目的初始化和实现。STM32CubeMX 还支持使用 USB 虚拟串口通信协议,这使得 STM32 微控制器可以通过 USB 端口与计算机进行通信。 USB 虚拟串口通信协议可以将通信传输的数据转换成 COM 端口数据格式,从而实现和传统串口通信类似的功能。在 STM32CubeMX 中,通过配置 USB 虚拟串口 UART 来实现。在程序中,我们可以通过串口库函数调用实现 USB 虚拟串口通信。 通常情况下,使用 STM32CubeMX 生成代码时,启用 USB 虚拟串口通信的步骤如下: 1. 打开 STM32CubeMX 工具,并选择使用的微控制器模型。 2. 在“Pinout & Configuration”选项卡下启用 USB 设备(USB OTG FS 或 USB OTG HS,取决于所选模型)。 3. 选择“Middleware”选项卡,并启用 USB_DEVICE,接着启用 CDC(虚拟串口)。 4. 修改相关的设置,如虚拟串口的波特率、数据位等。 5. 生成代码并在程序中添加对串口库函数的调用。 需要注意的是,当使用 USB 虚拟串口通信时需要在计算机上安装对应的 USB 虚拟串口驱动程序,以便可以将 USB 端口识别成虚拟串口。 总之,在 STM32 微控制器的开发中使用 USB 虚拟串口通信是非常常见且有用的。通过 STM32CubeMX 生成代码的方式,我们可以在上述步骤中快速地配置 USB 虚拟串口通信,从而加快了开发速度。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值