描述
- USB 的功能还是比较的复杂,这里主要了解USB CDC类(Communication Device Class)实现的虚拟串口 【Virtual Port Com】
- 学习的思路依旧是先用起来,再去针对性的熟悉USB相关的协议
- USB转串口,是的,本篇就是实现这个功能
平台搭建
- STM32平台:STM32L475,当然其他的STM32系列拥有USB接口的依旧可以拿来验证
- 这里使用
STM32CubeMX
快速搭建USB的学习环境
- 这里主要为:USB Device, 选择USB组件:【Virtual Port Com】
- 这里生成Keil MDK5的功能,不用改代码,就可以编译成功,下载到开发板,发现枚举了一个USB的虚拟串口出来
功能验证
- 既然是串口,我就使用串口助手,打开这个【虚拟串口】,发送数据,没响应,通过看代码,发现,接收串口数据的API为:
usbd_cdc_if.c
中的:CDC_Receive_FS
- 在:
CDC_Receive_FS
函数打上【断点】,进入调试模式,看看是否可以接收到 PC端通过串口助手发送的串口数据
- 实测发现接收到了全局的数组:
UserRxBufferFS
中了,并且,PC端波特率随便设置,发送的数据,都能正确的接收到
验证发送
- 看代码,STM32端发送串口数据的函数为:
CDC_Transmit_FS
,这里不需要设置波特率之类的
#include "main.h"
#include "usb_device.h"
#include "usbd_cdc_if.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
#define VCP_BUF_MAX_LEN 128
void vcp_send_test(uint8_t ch)
{
uint8_t temp_buf[VCP_BUF_MAX_LEN];
for (uint16_t i = 0; i < VCP_BUF_MAX_LEN; i++)
{
temp_buf[i] = 0x41;
}
temp_buf[0] = ch;
CDC_Transmit_FS(temp_buf, sizeof(temp_buf));
}
int main(void)
{
uint8_t ch = 0x00;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USB_DEVICE_Init();
while (1)
{
HAL_Delay(5000);
vcp_send_test(ch);
ch++;
}
}
- 验证发现,STM32 虚拟串口发送出来的数据,是正确的
小结
- 初步通过ST官方提供的
STM32CubeMX
,快速搭建了USB【虚拟串口】工程,但是CDC类的使用细节,还需要进一步了解
- USB协议比较的庞大,需要不断的学习研究,加上不断的【使用】与【实践】,才能真正的掌握起来