USB虚拟串口实现多字节数据接收,基于stm32h743

2023-05-16

文章目录

  • 一.USB虚拟串口原理简介
  • 二.接收函数实现源码
  • 三.小结

一.USB虚拟串口原理简介

  USB 虚拟串口,简称 VCP,是 Virtual COM Port 的简写,它是利用 USB 的 CDC 类来实现的一种通信接口。
  我们可以利用 STM32 自带的 USB 功能,来实现一个 USB 虚拟串口,从而通过 USB,实现电脑与 STM32 的数据互传。上位机无需编写专门的 USB 程序,只需要一个串口调试助手即可调试,非常实用。
  这里我们移植HAL库的标准底层驱动文件,实现USB的底层配置。移植USB工程需要包含三个文件夹:
USB_DEVICE:USB设备选择,这里我们选择CDC类,用来实现虚拟串口
USB_CORE:内核文件,基本不需改动
USB_APP:用户层代码编写,由用户自己编写,实现功能
  由于USB协议规定,一次最多只能接收64字节数据,如果要传输的字节数是64整数倍,都要多传输一个0字节的数据包。而这里经过改写接收函数,可以实现任意长度数据的接收!!!非常方便。由于实现驱动的代码部分十分繁杂,就不一一列举,可参考正点原子的例程。正点原子的串口接收采用的是0x0a,0x0d判断的方式。这里我们仅对其接收函数进行改写,实现任意长度字节接收,且不需要结束字符判断。

二.接收函数实现源码

  这里要先对USB虚拟串口接收数据的流程做一个说明:在进行内核代码初始化后,USB会自动调用函数进行串口接收监测,一旦串口接收到数据就进入串口接收函数处理。调用的函数如下:

//CDC数据接收函数,供USB内核调用,用来接受数据
//Buf:接收数据缓冲区
//Len:接收到的数据长度
static int8_t CDC_Itf_Receive(uint8_t *Buf,uint32_t *Len)
{
    SCB_CleanDCache_by_Addr((uint32_t *)Buf,*Len);
    USBD_CDC_ReceivePacket(&USBD_Device);
    VCP_DataRx(Buf,*Len);
    return (USBD_OK);
}

CDC_Itf_Receive()函数是供USB内核调用的,用来接收数据,其中又调用了VCP_DataRx(Buf,*Len)函数供用户层对接收到的数据进行处理。我们要改写的就是VCP_DataRx(Buf,*Len)函数。这里要注意的是之前提到由于USB协议规定,一次最多只能接收64字节数据,因此若接收到的字节数小于64,则该函数只被调用一次,若是大于64字节则需被多次调用,这里我们按照这个原则来对其进行改写:

u8 receive_times=0;                //定义调用该函数的次数
u32 VCP_DataRx_Len=0;              //定义USB_Usart接收数据长度
uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len)
{
	u32 i;
    for(i=0;i<Len;i++)
    {
        USB_USART_RX_BUF[64*receive_times+i]=Buf[i];  //将接受到的数据放置在接收缓存区,缓存区大小可由自己定义
    }
    receive_times++;                        //进入一次接收函数标记接收次数加一
    VCP_DataRx_Len=64*(receive_times-1)+Len;//计算出最终接受到的字节数
	return USBD_OK;
}

上述代码很简单,主要工作是对调用接收函数的次数进行计数,最终获得完整的接收数据以及实际接收到的字节数。

  在主函数中我们对接收数据做判断并显示出来:

extern u32 VCP_DataRx_Len;                       //外部声明USB_Usart接收数据长度
extern u8 receive_times;                         //外部声明进入接收中断次数
while(1)
{
    if(VCP_DataRx_Len)        //判断接收的字节数是否为0,也就是判断接收标志
	{					   
		usb_printf("您发送的消息长度为:%d\r\n\r\n",VCP_DataRx_Len);
        VCP_DataTx(USB_USART_RX_BUF,VCP_DataRx_Len);//调用USB串口发送函数将接收到的数据发送出去
		usb_printf("\r\n\r\n");//插入换行
		VCP_DataRx_Len=0;      //接收数据个数清零
        receive_times=0;       //进入接收中断次数清零
	}
}   	

三.小结

  USB虚拟串口功能很具有实用功能,在不需要进行电平转换的情况下直接通过USB与电脑实现串口通信。本文主要对USB串口接收数据做了处理,巧妙的解决了USB串口一次只能接受64字节的局限,算是自己开发过程中用到的小技巧,与大家分享,谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

USB虚拟串口实现多字节数据接收,基于stm32h743 的相关文章

  • 使用“设备过滤器”解决方案时如何处理 Android 上的 USB 权限对话框事件?

    当我将 已知 USB 设备连接到 Android 手机时出现的自动权限对话框中 用户按下 确定 或 取消 时 我试图处理该事件 我正在使用 android usb host 库 可以在 Android 手机和设备之间发送和接收 此外 我使用
  • Java Android 激光条码扫描器

    我正在尝试开发一个能够读取条形码 1d 而不是 qr 的应用程序 真正的问题是 常见的条形码阅读器软件非常有用 但它们似乎太慢 无法作为非常频繁和常见的功能使用 这些条形码相当长 有 20 30 位数字 对于 zxing 等应用程序来说似乎
  • 使用 C# 向 USB 连接的 GPRS 调制解调器发送 AT 命令

    任何人都可以给我一个关于如何访问连接到 USB 端口的 GPRS 调制解调器的良好指示或指南 我应该为我的程序制作一个 USB 驱动程序以将 AT 命令发送到调制解调器吗 或者就像一个路由器 我可以使用IP地址访问它 谢谢 如果 Windo
  • adb 未检测到 micromax a111

    最近我购买了 micromax a111 Android 设备 我是安卓开发者 因此尝试使用该设备进行调试选项 但 adb 无法检测到该设备 我也更改了设置 但没有成功 如果有人有解决方案 请帮助我解决这个问题 micromax没有官方的P
  • USB 调试 - 安装 Epson Moverio 驱动程序时出现问题

    Android 开发新手 我使用以下命令制作了一个小应用程序Eclipse http en wikipedia org wiki Eclipse 28software 29在虚拟 Android 设备上完美运行 现在 我想在真实的设备上运行
  • Android:与充当主机的 USB 设备通信

    我们制作了一个可以充当 USB 主机或从机并处理其接收到的数据的设备 我想使用Android手机通过USB向其发送数据 我的研究使我得出结论 如果不修改硬件或操作系统 我们就无法在 USB 主机模式下使用 Android 设备 这样做不是一
  • 如何在没有窗口句柄的情况下使用 RegisterDeviceNotification?

    我正在编写一个 DLL 库 该库使用 VB NET 中的 winusb 连接到 USB 设备 由于它是一个 DLL 所以我没有窗口 而且我的库的用户也可能没有窗口 例如命令行应用程序 我见过的检测设备连接和分离的示例都使用RegisterD
  • 如何在 DriverKit 中将我的 dex 与 USB 设备匹配?

    我正在编写一个驱动程序包扩展 其目标是阻止 USB 设备 例如闪存驱动器 作为起点 我选择了示例项目https developer apple com documentation driverkit communicating Betwee
  • Android 版 usbmon

    我想分析我的设备的 USB 通信 SGS4 我到处都看到需要配置 usbmon 并将其编译到内核中 Afaik 这个模块没有内置在android linux系统中 我在编译内核方面没有太多经验 但如果有必要 我会这样做 您能说出这样做的步骤
  • 我可以从哪里开始使用可编程硬件?

    一段时间以来 我一直渴望至少学习一点有关硬件编程的知识 并想在这里提出要求以获得一些起点 我是一位相当有成就的程序员 具有 Delphi 和 Objective c 经验 但从未听过设备端口 中断 我什至不知道术语 更不用说对硬件进行编程了
  • 如何在 C# 中从 USB 令牌读取证书

    我有一个 USB 令牌 其中包含一个加密证书 该证书具有公钥和私钥 现在我想用 C 创建一个应用程序 通过它我可以找到可访问的证书信息 当我插入 USB 令牌时 它会被检测到 但计算机部分上没有显示任何驱动器 就像闪存驱动器一样 如何从 U
  • USB 端口速度 Linux [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何以编程方式确定运行 Linux 内核的嵌入式设备中的 USB 端口速度 你可以阅读 sys bus usb devices usb s
  • Android USB_DEVICE_ATTACHED 持久权限

    如何让 Android 在每次重新连接 USB 设备时都不再请求权限 我想让它记住 USB 设备的 默认使用 复选标记 这样我就不必每次都向同一设备授予权限 我以编程方式检测 USB 设备 Android 手机 何时连接到我的主机设备 An
  • 获取已连接 USB 设备的端口名称

    当USB设备连接到计算机时 如何使用C 代码获取它所连接的端口名称 我找到了很多方法来查找 USB 何时连接 断开 驱动器号 路径 设备 ID 等 但没有找到任何明确的示例来说明如何知道它连接到哪个端口 我看到了一种可能的解释 但这涉及很多
  • Android 两次请求 USB 许可

    我有一个运行 Android 4 0 4 的开发板 并将其用作 USB 配件 当我关闭板上的应用程序然后通过 USB 插入 Android 手机时 板会提示 连接此 USB 设备时打开 AppName 当我触摸 确定 时 应用程序启动并再次
  • 如何在java中访问USB端口[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试编写一个java应用程序来访问USB端口以读取和写入通过USB连接的设备 我面临的问题是我不
  • Android 3.1 USB 主机 - BroadcastReceiver 未收到 USB_DEVICE_ATTACHED

    我经历过USB 主机的描述和示例位于developer android com http developer android com guide topics usb host html检测连接和分离的 USB 设备 如果我在清单文件中使用
  • ASP.NET/Silverlight 控制 USB 设备

    我想使用某种 USB 设备 例如闪光灯 提醒用户有新消息 是否可以从 ASP NET 或 Silverlight 控制 USB 设备 您可以在网页中使用自定义 ActiveX 组件和一些 javascript 来完成此操作 或者 您可以使用
  • 在 Windows 中以编程方式重新启动 USB 设备

    我正在开发的一些软件需要 USB 设备 我作为串行端口与 USB 转 UART 桥进行交互 有时 计算机从休眠状态重新启动后 无法检测到该设备 并且我无法再通过串行端口写入或读取该设备 需要对设备进行读 写访问 我不能依赖用户采取任何操作
  • Linux中根据USB VID:PID获取设备路径

    如果我插入一个设备 比如说 dev ttyUSB0我想知道号码0基于其 VID PID 通过lsusb 我怎样才能在 C Linux 中做到这一点 我有这个代码来查找一台打印机设备 如果有帮助的话 int printer open void

随机推荐

  • php curl digest,php curl with digest返回两个响应

    如果对标头使用 I选项 则看起来curl具有相同的行为 xff1a curl I digest u root somepassword http localhost digest test 收益 xff1a HTTP 1 1 401 Aut
  • SET PASSWORD FOR ‘root‘@localhost=PASSWORD(‘XXXX‘);报错

    原因 xff1a 数据库版本较高 老版本 SET PASSWORD FOR root 64 localhost 61 PASSWORD XXXXX 新版本 SET PASSWORD FOR root 64 localhost 61 XXXX
  • ROS学习笔记之小乌龟跟随

    ROS学习笔记之小乌龟跟随 说明 xff1a 整个案例是跟着赵虚左老师的视频和文档资料学习的 xff0c 特此感谢赵虚左老师和Autolabor官方 文档地址 视频地址 学习案例之前的预备知识 xff1a TF坐标变换 大体实现流程 xff
  • MPC,PID,LQR,DDP算法

    算法原理 xff1a
  • 对‘image_transport::ImageTransport::~Image Transport()’未定义的引用

    这是因为cmakelist文件没配置好 xff0c 一般的cmakelist文件配置如下 xff1a cmake minimum required VERSION 2 8 3 project first test pkg Compile a
  • 【VIO笔记(学习VINS的必备基础)】第六讲 视觉前端

    文章目录 前端工作的综述特征点提取 匹配和光流为什么需要角点角点的提取光流的计算光流的总结 关键帧与三角化关键帧三角化三角化程序实现 系列教程来自某学院 xff0c 侵权删除 学习完这一系列课程再去看VINS才能做到不吃力 xff0c 不然
  • windows开机自启动frp教程

    https wp gxnas com 12153 html
  • ubuntu20.08下获取realsense内参

    ubuntu20 08下使用realsense过程记录 介绍一 安装SDK1 注册公钥2 将服务器添加到存储库列表中3 安装库4 安装开发者和调试包5 测试SDK 二 下载realsense2 camera包1 下载包2 测试包3 激活相关
  • 深度视场角(Depth Field of View)

    深度视场角 Depth Field of View Realsense相机深度图的建立依赖双目立体成像原理 xff0c 其有效视场是左 右成像器视场的重叠部分 xff0c 如下图所示 顺带一提 xff0c 这张图不能用于计算双目相机深度成像
  • ROS: Publisher and Subscriber

    通过上一节编写ROS的第一个程序hello world xff0c 我们对ROS的整个编程开发过程有了基本的了解 xff0c 现在我们就来编写真正意义上的使用ROS进行节点间通信的程序 由于之前已经建好了catkin ws这样一个工作空间
  • phpStorm2018安装教程

    1 鼠标右击 PhpStorm 2018 2 3 压缩包选择 解压到PhpStorm 2018 2 3 2 双击打开解压后的 PhpStorm 2018 2 3 文件夹 3 鼠标右击 PhpStorm 2018 2 3 exe 选择 以管理
  • 学习Java第一个星期感受和收获

    最近在学习java xff0c 学了有一个星期 xff0c 说一说这个星期的收获和总结吧 xff01 首先我也是从一个小白做起 xff0c 这个星期学习了很多 xff0c 很多java基础知识 xff0c 我印象比较深刻的是基本数据类型和引
  • MySql知识体系总结(2021版)

    一 MySQL三层逻辑架构 MySQL的存储引擎架构将查询处理与数据的存储 提取相分离 下面是MySQL的逻辑架构图 xff1a 1 第一层负责连接管理 授权认证 安全等等 每个客户端的连接都对应着服务器上的一个线程 服务器上维护了一个线程
  • freertos与linux区别,μClinux、μC/OS-II、eCos、FreeRTOS和djyos操作系统的特点及不足-嵌入式系统-与非网...

    基于 STM 平台且满足实时控制要求操作系统 xff0c 有以下 5 种可供移植选择 分别为 Clinux C xff0f OS II eCos FreeRTOS 和都江堰操作系统 djyos 下面分别介绍这五种嵌入式操作系统的特点及不足
  • SM4加密算法原理以及C语言实现

    文章目录 一 算法原理描述1 密钥及密钥参量 xff1a 2 加密算法 3 解密算法 xff1a 4 密钥扩展算法 xff1a 二 C语言算法实现 h部分代码 xff1a c部分代码 xff1a 一 算法原理描述 SM4分组密码算法是一个迭
  • SIM900A GPRS无线通信

    文章目录 一 模块介绍1 基本概况2 GPRS通信开发说明 二 TCP连接实现及其源码1 TCP连接实现方法2 程序源码 xff08 基于MSP430F149单片机 xff09 1 main c2 Config h及Config c3 SI
  • UCOSII-信号量与信号量集

    文章目录 一 前言1 任务间的同步2 事件 二 信号量1 信号与信号量介绍2 信号量常用函数3 信号量使用流程 xff08 互斥信号量和信号量两种 xff09 4 互斥型信号量使用5 使用一般信号量做任务同步 三 信号量集 事件标志组 1
  • UCOSII-消息邮箱与消息队列

    文章目录 一 事件控制块及事件处理函数1 等待任务列表2 事件控制块的结构3 操作事件控制块的函数4 空事件控制块列表 二 消息邮箱1 消息邮箱介绍2 消息邮箱操作步骤 三 消息队列1 消息指针数组2 队列控制块3 消息队列的操作流程 四
  • float型数据与4字节之间的转换

    文章目录 一 前言二 地址指针转换的方法三 共用体的方法 xff08 注意要定义全局变量数组s xff0c 即地址要分配为固定地址 xff09 一 前言 在与上位机之间进行数据收发 xff0c 要将float型数据转换成字节进行传输 xff
  • USB虚拟串口实现多字节数据接收,基于stm32h743

    文章目录 一 USB虚拟串口原理简介二 接收函数实现源码三 小结 一 USB虚拟串口原理简介 USB 虚拟串口 xff0c 简称 VCP xff0c 是 Virtual COM Port 的简写 xff0c 它是利用 USB 的 CDC 类