STM32 HAL库实现USB虚拟串口

1. 引言

在嵌入式系统开发中,USB 虚拟串口是一种非常实用的功能。它允许 STM32 微控制器通过 USB 接口与计算机进行通信,就像使用传统的串口一样。这种方式不仅简化了硬件设计,还提高了通信的灵活性和稳定性。STM32F407 系列微控制器具有强大的处理能力和丰富的外设资源,配合 HAL 库可以方便地实现 USB 虚拟串口功能。

2. 开发环境搭建

2.1 硬件准备
  • STM32F407 开发板:选择一款基于 STM32F407 的开发板,如正点原子的探索者 STM32F407 开发板。
  • USB 数据线:用于连接开发板和计算机。
2.2 软件准备
  • Keil MDK:一款专业的 ARM 微控制器开发工具,用于编写、编译和调试代码。
  • STM32CubeMX:ST 官方提供的图形化配置工具,可用于快速生成 STM32 项目的初始化代码。

 

点击生成代码;

注意几处需要修改的地方:

 

 

 

3. USB 虚拟串口原理

3.1 USB 协议基础

USB(Universal Serial Bus)是一种通用的串行总线标准,具有高速、可靠、易用等特点。USB 协议定义了设备与主机之间的通信方式,包括设备枚举、数据传输等过程。

3.2 CDC 类协议

CDC(Communication Device Class)是 USB 协议中的一种设备类,专门用于实现虚拟串口通信。CDC 类协议定义了两个接口:通信接口(Communication Interface)和数据接口(Data Interface)。通信接口用于发送和接收控制命令,数据接口用于传输实际的数据。

3.3 数据传输过程

4.2 数据接收处理

usbd_cdc_if.c文件中,有一个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);// 处理接收到的数据for (uint32_t i = 0; i < *Len; i++){// 这里可以添加具体的数据处理逻辑// 例如将接收到的数据原样发送回去CDC_Transmit_FS(&Buf[i], 1);}return (USBD_OK);/* USER CODE END 6 */
}
4.3 数据发送处理

usbd_cdc_if.c文件中,有一个CDC_Transmit_FS函数,用于发送数据。以下是该函数的示例代码:

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{uint8_t result = USBD_OK;/* USER CODE BEGIN 7 */USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;if (hcdc->TxState != 0){return USBD_BUSY;}USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);/* USER CODE END 7 */return result;
}
4.4 主函数代码

main.c文件中,需要对 USB 设备进行初始化,并启动数据接收。以下是主函数的示例代码:

5. 代码编译与下载

5.1 代码编译

打开 Keil MDK,导入 STM32CubeMX 生成的项目代码。在 Keil MDK 中进行编译,确保代码没有错误和警告。

5.2 代码下载

将开发板通过 USB 数据线连接到计算机,使用 ST-Link 或 J-Link 等调试器将编译好的代码下载到开发板中。

6. 测试与验证

6.1 计算机端软件准备

在计算机上安装串口调试助手,如串口调试精灵、SSCOM 等。

6.2 设备识别

将开发板通过 USB 数据线连接到计算机,计算机应该能够识别出一个新的串口设备。

6.3 数据收发测试

打开串口调试助手,选择识别到的串口,设置波特率为 115200(USB 虚拟串口的波特率不影响实际通信速度)。在串口调试助手中发送数据,开发板应该能够接收到数据并将其原样发送回去。

7. 常见问题及解决方法

7.1 设备无法识别

7.2 数据收发异常

8. 扩展功能

8.1 数据解析与处理

CDC_Receive_FS函数中添加更复杂的数据解析逻辑,例如解析特定的命令格式,实现不同的功能。

8.2 多线程处理

使用 STM32 的 RTOS(实时操作系统),如 FreeRTOS,将数据接收和处理任务分配到不同的线程中,提高系统的实时性和稳定性。

9. 总结

通过以上步骤,你可以基于 STM32F407 HAL 库实现 USB 虚拟串口功能。USB 虚拟串口为 STM32 开发板与计算机之间的通信提供了一种方便、高效的方式,在实际应用中具有广泛的用途。

  1. 设备枚举:当 STM32 开发板通过 USB 连接到计算机时,计算机会对设备进行枚举,获取设备的描述符信息,确定设备的类型和功能。
  2. 建立通信:枚举完成后,计算机和 STM32 开发板之间建立起 USB 通信连接。
  3. 数据传输:通过 CDC 类协议,计算机可以向 STM32 开发板发送数据,也可以接收 STM32 开发板发送的数据。

    4. 代码实现

    4.1 生成的代码结构

    使用 STM32CubeMX 生成的代码包含了 USB 虚拟串口的基本框架,主要文件有:

  4. usbd_cdc_if.c:实现了 CDC 类接口的回调函数,负责处理数据的发送和接收。
  5. usbd_cdc.c:实现了 CDC 类的核心功能,包括设备枚举、控制命令处理等。
  6. usbd_core.c:实现了 USB 设备的核心功能,包括设备初始化、数据传输等。
  7. 检查硬件连接:确保 USB 数据线连接正常,开发板的电源正常。
  8. 检查 USB 驱动:在设备管理器中查看是否有未识别的设备,尝试更新 USB 驱动。
  9. 检查代码逻辑:确保CDC_Receive_FSCDC_Transmit_FS函数的实现正确。
  10. 检查缓冲区大小:确保数据缓冲区足够大,避免数据溢出。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/78081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA EE_网络原理_UDP与TCP

人海中未遇见时&#xff0c;我将独自前行... ----------陳長生. 1.UDP协议 1.1.UDP协议端格式 UDP&#xff08;用户数据报协议&#xff09;是由 源端口&#xff0c;目标端口&#xff0c;长度&#xff0c;校验和&#xff0c;数据 5种结构组成。16位是UDP报文中字段的长度&#…

【免费】1992-2021年各省GDP数据/各省地区生产总值数据

1992-2021年各省GDP数据/各省地区生产总值数据 1、时间&#xff1a;1992-2021年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;GDP/地区生产总值 4、范围&#xff1a;31省 5、指标说明:国内生产总值&#xff08;GDP&#xff09;是一个国家或地区在一定时期…

C++11新特性_范围-based for 循环

based for 循环介绍 范围 - based for 循环&#xff08;Range-based for loop&#xff09;是 C11 引入的一种新的 for 循环语法&#xff0c;它可以更简洁地遍历容器和数组。 遍历数组&#xff1a;定义了一个整数数组 arr&#xff0c;使用范围 - based for 循环 for (int num :…

【Bootstrap V4系列】学习入门教程之 页面内容排版

Bootstrap V4 学习入门教程之 页面内容排版 按钮上的指针排版一、Global settings 全局设置二、Headings 标题2.1 Customizing headings 自定义标题2.2 Display headings 显示标题2.3 Lead 引导 三、Blockquotes 块引用3.1 Naming a source 命名源3.2 Alignment 对齐 四、Lists…

Flowable7.x学习笔记(十六)分页查询我的待办

前言 我的待办具体区分为3种情况&#xff0c;第一个就是办理人指定就是我&#xff0c;我可以直接审批&#xff1b;第二种就是我是候选人&#xff0c;我需要先拾取任务然后再办理&#xff1b;第三种是我是候选组&#xff0c;我需要切换到指定的角色去拾取任务再办理。如果任务已…

EBO的使用

EBO 其实就是个索引&#xff0c;绑定在相应的VAO中&#xff0c;用来描述绘制顺序。比如在OpenGL绘制三角形的时候&#xff0c;假设有四个顶点&#xff0c;我称他们分别为1&#xff0c;2&#xff0c;3&#xff0c;4号顶点&#xff0c;常规绘制三角形函数是按三个点为一组&#x…

界面控件DevExpress WPF v25.1预览 - AI功能增强(语义搜索)

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

零基础做自动驾驶集成测试(仿真)

图 1&#xff1a;使用 GPUDrive 进行极快的多代理模拟。上图&#xff1a;GPUDrive 中 Waymo Open Motion Dataset 场景的鸟瞰图&#xff0c;方框表示受控智能体&#xff0c;圆圈表示其目标。底部&#xff1a;相应的代理视图&#xff0c;以一个代理为中心。可以根据用户的目标轻…

EasyRTC嵌入式音视频实时通话SDK技术,打造低延迟、高安全的远程技术支持

一、背景 在当今数字化时代&#xff0c;远程技术支持已成为解决各类技术问题的关键手段。随着企业业务的拓展和技术的日益复杂&#xff0c;快速、高效地解决远程设备与系统的技术难题变得至关重要。EasyRTC作为一款高性能的实时通信解决方案&#xff0c;为远程技术支持提供了创…

【C语言常用字符串解析】

总结一下在 C 语言中用于字符串解析&#xff08;特别是从文件中读取行并提取数据&#xff09;的常用函数、 核心任务&#xff1a; 通常是从文件中读取一行文本&#xff08;一个字符串&#xff09;&#xff0c;然后从这个字符串中提取出需要的数据&#xff08;比如数字、单词等…

SpringTas定时任务使用详解

文章目录 Spring Task概述1、环境配置2.注解实现定时任务2.注解实现定时任务4. cron表达式详解&#xff1a; Spring Task概述 在开发中&#xff0c;我们经常会用到定时任务&#xff0c;而Spring Task 则是Spring提供的定时任务框架。 其它定时任务实现框架又jdk自带Timer和Qua…

数字智慧方案6172丨智慧医院扩建信息化整体规划方案(60页PPT)(文末有下载方式)

资料解读&#xff1a;智慧医院扩建信息化整体规划方案 详细资料请看本解读文章的最后内容。 在信息技术飞速发展的当下&#xff0c;医疗行业的信息化建设成为提升医疗服务水平、优化医院管理的关键路径。这份智慧医院扩建信息化整体规划方案&#xff0c;针对医院扩建过程中的信…

ts全局导入接口

为了在项目中全局导入 ITableColumn 接口&#xff0c;避免每次使用时手动导入&#xff0c;可以通过以下步骤实现&#xff1a; 1. 全局导入的实现方式 在 Vue 项目中&#xff0c;可以通过在 src 目录下创建一个 global.d.ts 文件&#xff0c;将 ITableColumn 接口声明为全局类型…

汽车启动原理是什么?

好的&#xff01;同学们&#xff0c;今天我们来讨论汽车的启动原理&#xff0c;重点分析其中的动力来源和摩擦力作用。我会结合物理概念&#xff0c;用尽量直观的方式讲解。 1. 汽车为什么会动&#xff1f;——动力的来源 汽车发动机&#xff08;内燃机或电动机&#xff09;工…

【音频】Qt6实现MP3播放器

1、简介 解码MP3有很多种方法,比如:FFmpeg、GStreamer、Qt、libmpg123 库等,下面介绍使用,只使用Qt的接口方法解码、播放MP3。 开发配置: 1)操作系统:Windows11 2)Qt版本:Qt6.5.1 3)编译器:MinGW_64 2、获取音频输出设备 QMediaDevices 用于获取媒体设备,包括音…

【Linux】VSCode用法

描述 部分图片和经验来源于网络&#xff0c;若有侵权麻烦联系我删除&#xff0c;主要是做笔记的时候忘记写来源了&#xff0c;做完笔记很久才写博客。 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 安装环境及运行C/C 1.1 安装及配置步骤 1.2 运…

WPF之RadioButton控件详解

文章目录 一、RadioButton简介二、RadioButton的基本用法1. 创建基本的RadioButton2. 分组管理3. 设置默认选中 三、RadioButton的重要属性和事件1. 关键属性2. 主要事件3. 事件处理流程4. 监听选中状态变化 四、数据绑定与RadioButton1. 基本数据绑定2. 数据绑定流程3. 使用枚…

笔试专题(十三)

文章目录 kotori和气球题解代码 走迷宫题解代码 主持人调度&#xff08;二&#xff09;&#xff08;难题&#xff09;题解代码 kotori和气球 题目链接 题解 1. 数学-排列组合 2. 每次乘完之后对109取模 代码 #include<iostream>using namespace std;int main() {int…

图形图像基础知识(1)---- RGB/YUV 颜色格式

目录 常见RAW颜色格式RGB类型YUV类型YUV类型汇总YUV444类型YUV422类型YUV420类型 参考实例 常见RAW颜色格式 RGB 类型&#xff1a; ARGB1010102&#xff0c;ABGR1010102&#xff0c;BGRA1010102&#xff0c;RGBA1010102 ARGB8888&#xff0c;ABGR8888&#xff0c;BGRA8888&…

CentOS7.9安装OpenSSL 1.1.1t和OpenSSH9.9p1

一、临时开启telnet登录方式&#xff0c;避免升级失败无法登录系统 &#xff08;注意telnet登录方式存在安全隐患&#xff0c;升级openssh相关服务后要记得关闭&#xff09; 1.安装telnet服务 yum -y install xinetd telnet* 2.允许root用户通过telnet登陆&#xff0c;编辑…