USB协议学习笔记 - CDC类虚拟串口Virtual Port Com

描述

  • 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协议比较的庞大,需要不断的学习研究,加上不断的【使用】与【实践】,才能真正的掌握起来

版权声明:本文为CSDN博主「张世争」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tcjy1000/article/details/122815543

生成海报
点赞 0

张世争

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

USB协议学习笔记 - 引言

概述 最近想基于STM32做个USB设备,但是搜索了下USB相关的技术资料比较少,并且USB相关的书籍也是比较的少,所以打算系统的学习下USB协议相关的技术。USB 的官方网站:http

USB协议学习笔记 - HID 设备

前言 为了尽快的熟悉USB的使用,我没有通读USB2.0的规格书,这是初步的了解的USB协议的各个描述符学习新技术,要先有个感官的认识,再深入学习,或许也是一种好的方法这里