USB-CDC(VCP虚拟串口)传输

用STM32cubeMX软件配置好USB设备为CDC设备,生成并打开工程。此功能方便用来作为程序的调试输出到电脑查看。

描述:

USB接口CDC传输做VCP虚拟串口设备
CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)

  • Buf: 传输的数据指针
  • Len: 传输数据的长度

CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)

  • Buf: 接收的数据指针,不需处理
  • Len: 接收数据的长度,需要处理

示例

打开usbd_cdc_if.c文件,修改传输数据长度为64,添加接收数据长度变量DataLen。

/* USER CODE BEGIN PRIVATE_DEFINES */
/* Define size for the receive and transmit buffer over CDC */
/* It's up to user to redefine and/or remove those define */
#define APP_RX_DATA_SIZE 64  //修改接收数据长度
#define APP_TX_DATA_SIZE 64  //修改发送数据长度
/* USER CODE END PRIVATE_DEFINES */
/**
 * @}
 */
/** @defgroup USBD_CDC_Private_Macros
 * @{
 */
/* USER CODE BEGIN PRIVATE_MACRO */
/* USER CODE END PRIVATE_MACRO */
/**
 * @}
 */
/** @defgroup USBD_CDC_Private_Variables
 * @{
 */
/* Create buffer for reception and transmission */
/* It's up to user to redefine and/or remove those define */
/* Received Data over USB are stored in this buffer */
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
/* Send Data over USB CDC are stored in this buffer */
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
/* USER CODE BEGIN PRIVATE_VARIABLES */
uint8_t DataLen; //定义接收数据长度变量
/* USER CODE END PRIVATE_VARIABLES */

修改CDC_Receive_FS ()函数,添加接收数据长度的赋值

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);
 DataLen = *Len; //添加接收数据长度的赋值,只添加这一句,其它别改!!!
 return (USBD_OK);
 /* USER CODE END 6 */
}

修改main.c文件,先声明外部变量

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
extern uint8_t UserRxBufferFS[]; //声明数据接收外部变量
extern uint8_t DataLen; //声明接收数据长度外部变量
/* USER CODE END PV */

开启使用到的外设初始化

 /* Initialize all configured peripherals */
 MX_GPIO_Init(); //初始化GPIO
// MX_I2C1_Init();
// MX_USART2_UART_Init();
 MX_USB_DEVICE_Init(); //初始化USB
// MX_ADC_Init();
// MX_TIM2_Init();
// MX_SPI1_Init();
// MX_WWDG_Init();
// MX_IWDG_Init();
// MX_RTC_Init();
// MX_USART1_UART_Init();

编辑主循环函数,当按下按键时,发送I love eefrog!到电脑串口,当接收到电脑串口数据时,返回接收到的数据,接收数据长度应小于64.

/* Infinite loop */
/* USER CODE BEGIN WHILE */
uint8_t MyTxData[15] = "I love eefrog!\n"; //定义字符串
while (1)
{
 if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == 0) //检测按键
 {
   while(CDC_Transmit_FS(MyTxData, 15)); //发送字符串到电脑
   HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //闪灯
   HAL_Delay(20);
   HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
   while(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == 0); //等待松开按键
 }
 if(DataLen > 0) //判断是否接收到数据
 {
   while(CDC_Transmit_FS(UserRxBufferFS, DataLen));//把接收到的数据发送回去
   DataLen = 0; //清除数据长度标记
 }
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

发表评论

电子邮件地址不会被公开。 必填项已用*标注