打印
[应用相关]

STM32 USB Virtual_Port_Com虚拟串口通信

[复制链接]
738|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1.配置STM32CubeMX



默认配置



选择虚拟串口通信



设置堆栈大小

2.修改代码
打开usbd_cdc_if.h 添加如下代码

#define USB_REC_LEN 12
extern uint8_t USB_RX_BUF[USB_REC_LEN];
extern uint16_t USB_RX_STA;
void USB_printf(const char *format,...);
打开 usbd_cdc_if.c

uint8_t USB_RX_BUF[USB_REC_LEN];
uint16_t USB_RX_STA=0;
修改以下代码


/**
  * @brief  Data received over USB OUT endpoint are sent over CDC interface
  *         through this function.
  *
  *         @note
  *         This function will issue a NAK packet on any OUT packet received on
  *         USB endpoint until exiting this function. If you exit this function
  *         before transfer is complete on CDC interface (ie. using DMA controller)
  *         it will result in receiving more data while previous ones are still
  *         not sent.
  *
  * @param  Buf: Buffer of data to be received
  * @param  Len: Number of data received (in bytes)
  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
  if(*Len<USB_REC_LEN)
        {
                uint16_t i;
                USB_RX_STA = *Len;
                for(i=0;i<*Len;i++)
                {
                        USB_RX_BUF=Buf;
                }
        }
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  return (USBD_OK);
  /* USER CODE END 6 */
}

/**
  * @brief  CDC_Transmit_FS
  *         Data to send over USB IN endpoint are sent over CDC interface
  *         through this function.
  *         @note
  *
  *
  * @param  Buf: Buffer of data to be sent
  * @param  Len: Number of data to be sent (in bytes)
  * @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY
  */
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
  uint8_t result = USBD_OK;
  /* USER CODE BEGIN 7 */
  uint32_t TimeStart=HAL_GetTick();
  USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
//  if (hcdc->TxState != 0){
//    return USBD_BUSY;
//  }
        while(hcdc->TxState)
        {
                if(HAL_GetTick()-TimeStart>10)
                        return USBD_BUSY;
                else
                        break;
        }
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
  result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
        TimeStart=HAL_GetTick();
        while(hcdc->TxState)
        {
                if(HAL_GetTick()-TimeStart>10)
                        return USBD_BUSY;
        }
  /* USER CODE END 7 */
  return result;
}

添加函数

#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);
}
打开main.c

uint8_t i;
        uint8_t USB_RX_BUF_Change[USB_REC_LEN];
  while (1)
  {
                if(USB_RX_STA!=0)
                        {
                        //USB_printf("USB_RX:");
                        //CDC_Transmit_FS(USB_RX_BUF,USB_RX_STA);
                        for(i=0;i<12;i++)
                        {
                               
                                USB_RX_BUF_Change=USB_RX_BUF;
                                //USB_printf("USB_RX_BUF[%d]=%X\n",i,USB_RX_BUF_Change);
                                USB_printf("%X ",USB_RX_BUF_Change);
                        }
                        //USB_printf("\r\n");
                        USB_RX_STA=0;
                        memset(USB_RX_BUF,0,sizeof(USB_RX_BUF));
                        }
               
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

数据长度为12

打开串口,接收成功。



————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_53197842/article/details/145615284

使用特权

评论回复
沙发
febgxu| | 2025-2-22 19:54 | 只看该作者
STM32 的 USB Virtual_Port_Com 虚拟串口通信是一种通过 USB 接口模拟串口通信的技术,它能让 STM32 设备像传统串口设备一样与上位机进行数据交互。

使用特权

评论回复
板凳
adolphcocker| | 2025-2-22 20:06 | 只看该作者
当首次将STM32设备连接到计算机时,可能需要安装USB设备驱动程序。STM32官方通常提供适用于不同操作系统的驱动程序。

使用特权

评论回复
地板
plsbackup| | 2025-2-22 20:20 | 只看该作者
重写CDC_Receive_FS函数以处理接收到的数据,将接收到的数据存储到缓冲区中,并通过回调函数或其他机制通知主程序有数据接收。

使用特权

评论回复
5
uptown| | 2025-2-22 20:28 | 只看该作者
在CubeMX生成的代码基础上,编写或修改应用程序代码以实现数据的发送和接收。

使用特权

评论回复
6
cemaj| | 2025-2-22 20:38 | 只看该作者
USB虚拟串口不仅扩展了设备的通信能力,还提高了数据传输速率,特别适用于需要高速通信的场景。

使用特权

评论回复
7
ccook11| | 2025-2-22 20:58 | 只看该作者
可以在STM32中实现USB虚拟串口通信,方便地与上位机进行数据交换

使用特权

评论回复
8
wengh2016| | 2025-2-22 21:13 | 只看该作者
STM32的USB Virtual COM Port功能为开发者提供了一种方便、低成本的方式来实现与计算机的串行通信。

使用特权

评论回复
9
mickit| | 2025-2-22 21:24 | 只看该作者
USB CDC 的接收回调函数。

使用特权

评论回复
10
zerorobert| | 2025-2-22 21:35 | 只看该作者
发送和接收数据时,注意数据长度不要超过缓冲区大小。

使用特权

评论回复
11
jackcat| | 2025-2-22 21:46 | 只看该作者
在main.c文件中包含必要的头文件,如usbd_cdc_if.h等。

使用特权

评论回复
12
belindagraham| | 2025-2-22 21:59 | 只看该作者
使用USB虚拟串口通信的优势在于,对于上位机来说,操作的是一个串口,但实际上数据传输是基于USB的,因此数据传输速度得到了提升

使用特权

评论回复
13
fengm| | 2025-2-22 22:12 | 只看该作者
这种功能通常用于调试、配置或数据传输等场景。

使用特权

评论回复
14
louliana| | 2025-2-22 22:21 | 只看该作者
利用STM32微控制器的USB功能来模拟传统串口通信的技术。

使用特权

评论回复
15
kmzuaz| | 2025-2-22 22:32 | 只看该作者
在工程中添加 STM32 的 USB CDC 库文件,并根据芯片型号和开发板的硬件配置进行相应的初始化设置。

使用特权

评论回复
16
uptown| | 2025-2-22 22:44 | 只看该作者
STM32CubeMX:用于生成初始化代码。
STM32CubeIDE:用于编写和编译代码。

使用特权

评论回复
17
jkl21| | 2025-2-22 22:54 | 只看该作者
STM32 内部集成了 USB 控制器,支持多种 USB 设备类。在虚拟串口通信中,使用的是 USB 通信设备类(CDC,Communication Device Class)协议栈。该协议栈允许设备模拟一个串口,将数据封装成符合 USB 协议的数据包进行传输。

使用特权

评论回复
18
bestwell| | 2025-2-26 16:40 | 只看该作者
USB虚拟串口通信是通过USB接口模拟传统的串口(UART)通信。STM32微控制器通过USB CDC(Communication Device Class)实现这种通信方式,使得数据可以通过USB接口传输,就像通过传统的串口一样

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

70

帖子

0

粉丝