从零实现 USB转虚拟串口 CDC

2023-05-16

上一次调试是USB读卡器+FATFS,这次是USB转虚拟串口。说来也巧了,这是我大学的毕设,那个时候用STC芯片实现USB转串口,差点儿没把我给搞死。多年后遇见故人,甚是感慨,五年过去了,混到这个水平,惭愧惭愧。

首先,配置cubemx,只需要修改中间层支持的类,原来是MSC,现在是CDC:

没有什么可改动的了,生成代码,编译,没有问题。

然后,需要安装一下ST的USB虚拟串口驱动。就跟我们平时用的USB转串口线似的,也得安装驱动。

然后重启下设备,可以看到,计算机识别出来了

但是识别出来不代表直接就能用,我们怎么知道收发是否正常呢?

同验证串口的方式一样,在主函数中,让USB发送出接收到的数据。

那么USB的接收/发送数据的callback是在哪呢?

同上一章类似,cubemx给我们封装进了一个文件中,usbd_cdc_if.c。我们按照自己的需求修改这个文件中的函数。我们想实现的是:将从USB_CDC接收到的数据+1后发送出去。这样呢就能验证接收到的和发送出去的都没问题了。并且在串口一打印USB状态,方便监控。

我们先定义一些全局变量,方便获取USB_CDC的状态

这是原始的读函数,由USB的中断进入。

 

这个接收函数已经实现的功能就是把接收的数据放入UserRxBufferFS[APP_RX_DATA_SIZE],但是长度需要我们自己记下。

 

发送函数类似,不同的是,发送函数是主动发送的。我们几乎不用修改。

 

然后我们在主函数的循环中判断接受标志是否使能,处理后发送。

 

可以看到发送A5 5A 03 00 00 00 00 50,接收长度没错是8,+1后发送出来的也没错。

神奇的是,波特率我设置多少都能正确返回。

 

 

总结:

  1. CDC_Transmit_FS不能连续两次调用,否则只发送成功第一次调用的。具体原因没找,望大神不吝赐教。
  2. 一定要安装ST的虚拟串口驱动。

 

明明看起来很简单,但是为什么我也调了一天呢?菜就完事儿了

 

 

 

 

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

从零实现 USB转虚拟串口 CDC 的相关文章

  • Android Studio 无法将 Nexus 7 识别为设备

    我在 Nexus 7 上运行我在 Android Studio 中开发的应用程序时遇到问题 在使用同一台平板电脑和计算机 运行 Windows 8 之前 我已成功使其正常工作 但自从我的笔记本电脑修好并且所有内容都被擦除后 我确信我的开发环
  • 有没有办法通过浏览器与 USB 设备通信?

    有没有办法在常规浏览器 FF Safari IE8 等 中与 USB 设备通信 我认为它可能是 Javascript gt Java 桥或其他东西 请指教 P S 是否可以以最小的依赖性实现 如果没有 基于浏览器的软件的全部意义就毫无用处
  • 如何禁用 Android 设备 USB 端口

    我正在尝试搜索是否有一种方法可以禁用 Android 设备 USB 端口 主要是软件级别 因此用户仍然可以为 Android 设备充电 但无法再与 PC 通信 我得到了一些线索link1 https groups google com fo
  • 如何阻止 Linux 初始化 USB HID 设备

    我有一个 USB HID 设备 可以在两种不同的模式下工作 模式的选择基于发送给它的 USB 枚举 初始化数据包的顺序 我使用的是运行 Raspbian 的 Raspberry Pi 3 但是如果我为桌面 Ubuntu 发行版编译代码 我也
  • 使用“设备过滤器”解决方案时如何处理 Android 上的 USB 权限对话框事件?

    当我将 已知 USB 设备连接到 Android 手机时出现的自动权限对话框中 用户按下 确定 或 取消 时 我试图处理该事件 我正在使用 android usb host 库 可以在 Android 手机和设备之间发送和接收 此外 我使用
  • ALSA 记录 - 了解内存映射

    我尝试使用 ALSA 从 USB 音频设备获取输入并将其作为一系列内容写入磁盘signed short价值观 我最终得到的是看似有效的数据块 其中散布着大块的零 我猜测我的缓冲区设置不正确并且没有正确使用内存映射 我正在尝试什么 采样率 8
  • 通过 USB 模拟 UART

    有谁知道是否可以通过 USB 模拟 UART 简单串行发送和接收 这将如何实现 我在 Microchip 网站上找到了这个链接 但不是很容易找到 http www microchip com forums m522571 print asp
  • 是否有可通过 USB 密钥在 Mac OS X 10.6 上运行的便携式 python 解释器?

    我一直在努力寻找一个可以通过工作计算机上的 USB 密钥运行的便携式解释器 Work comp 运行的是 Mac OS X 10 6 环境相当受限 无法访问终端 无法安装应用程序 但我知道便携式应用程序可以从 USB 驱动器运行 我一直在使
  • Android:与充当主机的 USB 设备通信

    我们制作了一个可以充当 USB 主机或从机并处理其接收到的数据的设备 我想使用Android手机通过USB向其发送数据 我的研究使我得出结论 如果不修改硬件或操作系统 我们就无法在 USB 主机模式下使用 Android 设备 这样做不是一
  • 为过程或函数 cdc.fn_cdc_get_all_changes_ 提供的参数数量不足

    看似有效的代码 用于查询表中最新跟踪的更改Fields DECLARE Begin LSN BINARY 10 End LSN BINARY 10 SET Begin LSN sys fn cdc get min lsn Fields SE
  • OSX:如何从 IOUSBDeviceInterface 或位置 id 获取卷名称(或 bsd 名称)

    我正在尝试编写一个应用程序 将特定的 USB 字符串描述符 USB 大容量存储设备 与其卷或 bsd 名称相关联 因此 代码会遍历所有连接的 USB 设备 获取字符串描述符并从其中之一提取信息 我想获取这些 USB 设备的卷名 我找不到合适
  • 从网络浏览器中检测和访问 USB 设备 - 即使用插件

    是否可以通过插件 activeX Java 或 Flex 编写一个能够检测从 USB 设备通道读取数据流的浏览器插件 我做了一些研究 但没有找到答案 http support microsoft com kb 832678 http sup
  • Java 两个独立键盘的独立输入

    我有两个 USB 键盘插入同一台机器 我正在开发一个 Java 应用程序 是否有办法允许 Java 应用程序分离出它来自哪个 USB 键盘 即是否有类似的东西http docs oracle com javase 6 docs api ja
  • 如何查找USB盘符?

    我正在编写一个安装程序来将应用程序安装到 USB 驱动器 该应用程序只能从 USB 驱动器使用 因此它可以通过自动选择要安装的 USB 驱动器来为用户节省额外的步骤 我可能会尝试使用 Nullsoft 或 MSI 进行安装 但由于我最熟悉
  • USB接口条码扫描器

    不完全是一个编程问题 但很接近 无论如何我都会试试运气 The 键盘楔子 扫码机插入 读者之间的翻译装置 和键盘 数据发送通过 楔形看起来就像是被输入的 电脑 而键盘 本身仍保持完整功能 因为电脑使用键盘 楔子无法区分 在输入的数据之间 扫
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • 如何设置USB连接模式?

    我正在编写一个应用程序 该应用程序应该将数据转储到 SD 卡上 然后在 PC 上编写另一个应用程序 当设备连接到 PC 时 在光盘驱动器模式下 该应用程序应该读取数据 在我的 HTC Legend 上 有一个对话框可供选择 仅充电 HTC
  • 使用 BeagleBone Black 内核 >= 3.8 打开/关闭 USB 电源

    我需要 关闭 gt 睡眠几秒钟 gt 打开 beaglebone black 的 USB 电源 能够对连接到 USB 的设备 华为 E220 调制解调器 进行硬件重置 已经尝试过软重置 使用取消绑定 绑定和授权0 1 但软件重置不足以使设备
  • 获取已连接 USB 设备的端口名称

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

    问题描述 每次我在电脑和手机之间连接 USB 线时 电池都会自动充电 我想使用 ADB 协议 但我不想在 ADB 连接期间为电池充电 是否可以关闭此充电功能 当然 我该怎么做呢 环境 Android 操作系统 4 及更高版本的手机 我只需要

随机推荐

  • ClickHouse 基于角色访问控制(RBAC)最佳实践

    本文介绍ClickHouse RBAC访问控制模型 包括如何启用SQL管理 xff0c 创建管理员用户 xff0c 创建角色 xff0c 授权 xff0c 细粒度列和行级授权 并通过示例进行验证实现过程 启用RBAC 在users xml中
  • R语言中mean函数

    mean函数是求算术平均值 用法 xff1a mean x trim 61 0 na rm 61 FALSE x是数值型 逻辑向量 trim表示截尾平均数 xff0c 0 0 5之间的数值 xff0c 如 xff1a 0 10表示丢弃最大1
  • 使用Spring @DependsOn控制bean加载顺序

    使用Spring 64 DependsOn控制bean加载顺序 spring容器载入bean顺序是不确定的 xff0c spring框架没有约定特定顺序逻辑规范 但spring保证如果A依赖B 如beanA中有 64 Autowired B
  • 使用R中merge()函数合并数据

    使用R中merge 函数合并数据 在R中可以使用merge 函数去合并数据框 xff0c 其强大之处在于在两个不同的数据框中标识共同的列或行 如何使用merge 获取数据集中交叉部分 merge 最简单的形式为获取两个不同数据框中交叉部分
  • 介绍java中Pair

    介绍java中Pair 在这篇文章中 xff0c 我们讨论了一个非常有用的编程概念 xff0c 配对 Pair 配对提供了一种方便方式来处理简单的键值关联 xff0c 当我们想从方法返回两个值时特别有用 在核心Java库中可以使用配对 Pa
  • python numpy 中linspace函数

    python numpy 中linspace函数 numpy提供linspace函数 有时也称为np linspace 是python中创建数值序列工具 与Numpy arange函数类似 xff0c 生成结构与Numpy 数组类似的均匀分
  • Spring框架学习重点概要笔记(一)

    spring框架的注解实现 xff1a xff08 1 xff09 首先在spring的核心配置文件中开启注解配置 xff1a xff08 2 xff09 64 Component 目前Spring中提供了四个注解 xff0c 相当于时Co
  • 做个爱读书的程序员

    很多时候我们抱怨工作过于忙碌 xff0c 疲于应付各种事情 但是往往即使有时间也总是会无所事事地浪费掉 xff0c 我们可以找很多理由去给自己解脱 xff0c 固然是想在忙碌之外给自己放松一下 xff0c 大多却是过于可惜的时候 今天跟一个
  • xming Error: Can‘t open display:

    运行 xclock xhost 报错 xff1a xming Error Can 39 t open display 需要安装xorg x11 xauth在运行 xclock 或 xhost root 64 stone yum y inst
  • onItemClickListener不起作用解决办法2(原创)

    写这边文章之前 xff0c 犹豫再三 xff0c 不知道会不会冒犯一位朋友 xff0c 他给我之前的一篇文章提出的意见 但我声明真心无意 xff0c 只是想把问题拿出来分析一下 xff0c 希望获得理解 listview在android开发
  • 关于STM32系列串口打印乱码原因解析

    STM32打印串口乱码 xff0c 如果你的配置确认没有问题 xff0c 那么最有可能是 HSE VALUE 这个值不对 xff0c 你可能使用的是一份demo程序 xff0c 而demo程序的时钟晶振和你的时钟晶振不一定都是一样 xff0
  • node.js提取html中的内部引入css和js代码,并修改为外部引入

    前提 xff1a 配置好node环境 xff0c 能够使用终端 xff08 cmd或Windows PowerShell xff09 node命令运行js文件 nodejs安装教程 某位大佬整理的nodejs入门教程 node xxx sp
  • Ffplay视频播放流程

    背景说明 FFmpeg是一个开源 xff0c 免费 xff0c 跨平台的视频和音频流方案 xff0c 它提供了一套完整的录制 转换以及流化音视频的解决方案 而ffplay是有ffmpeg官方提供的一个基于ffmpeg的简单播放器 学习ffp
  • 统计机器学习方法 for NLP:基于LSA的主题模型

    前言 最近在重刷李航老师的 统计机器学习方法 尝试将其与NLP结合 xff0c 通过具体的NLP应用场景 xff0c 强化对书中公式的理解 xff0c 最终形成 统计机器学习方法 for NLP 的系列 这篇将介绍潜在语义分析LSA xff
  • 知识图谱最新权威综述论文解读:时序知识图谱部分

    从最近一两年有关知识图谱的顶会论文中可以发现 xff0c 越来越多的国内外研究者开始关注动态时序知识图谱 xff0c 可见时序知识图谱已经成为了一大研究趋势 xff0c 相信之后会有更多相关研究出来 因此 xff0c 这期我们对综述论文的时
  • RabbitMQ简介、概念、安装、启动、工作模式

    RabbitMQ简介 概念 安装 启动 工作模式 1 RabbitMQ简介 RabbitMQ是支持多种消息协议 xff0c 易于部署和使用的开源消息代理服务器 xff0c 用于在分布式系统中存储转发消息 由以高性能 健壮以及可伸缩性出名的E
  • 递归删除某一文件夹下某一后缀名的所有文件,包括嵌套文件(例如删除.cfg文件)

    递归删除某一文件夹下某一后缀名的所有文件 xff0c 包括嵌套文件 xff08 例如删除 cfg文件 xff09 有时候我的电脑中会莫名生成很多 cfg文件 xff0c 一个一个的删除太繁琐了 xff0c 所有就写了这个函数 当然这个函数的
  • SQL 基础篇 SQL 4 查询结果限制返回行数

    SQL基础篇 汇总 刷题传送门 题目链接 题面 样例输入 drop table if exists user profile CREATE TABLE 96 user profile 96 96 id 96 int NOT NULL 96
  • RabbitMQ(一):工作模型

    RabbitMQ实现了AMQP协议 xff0c 所以RabbitMQ的工作模型也是基于AMQP的 Broker xff1a RabbitMQ宿主机 默认端口是5672 Connection xff1a 无论是生产者发送消息 xff0c 还是
  • 从零实现 USB转虚拟串口 CDC

    上一次调试是USB读卡器 43 FATFS xff0c 这次是USB转虚拟串口 说来也巧了 xff0c 这是我大学的毕设 xff0c 那个时候用STC芯片实现USB转串口 xff0c 差点儿没把我给搞死 多年后遇见故人 xff0c 甚是感慨