描述:
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)) //检测按键 { 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)); //等待松开按键 } if(DataLen > 0) //判断是否接收到数据 { while(CDC_Transmit_FS(UserRxBufferFS, DataLen));//把接收到的数据发送回去 DataLen = 0; //清除数据长度标记 } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */
以上示例针对eefrog的STM32F042G模块,根据STM32cubeMX综合配置基础上设计,不保证在其它模块上有同样效果。