上位机图像处理和嵌入式模块部署(h750 mcu和usb虚拟串口)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        对于mcu usb而言,大部分情况下,它和上位机之间的关系都是device的关系。一般usb,可以分成host和device。如果mcu是host,那么意味着它可以主动访问别的usb设备,比如u盘、相机之类的设备。如果是device呢,这种情况下,mcu就是被别人访问,也就是说mcu会把自己伪装成一个u盘、camera或者串口这样的设备。

        另外不知道大家注意没有,很多的usb模块,里面本身没有usb转232的芯片,但是照样被识别成了com设备,道理就在这。因为mcu固件里面把会usb虚拟成com设备。

1、usb cdc虚拟串口和传统usb转串口的区别

        差别之处其实比较好分辨,前者是通过固件代码的形式实现的;而后者,一般都是需要添加一个usb转232的芯片实现。

2、usb cdc虚拟串口的好处

        把mcu的usb虚拟成一个串口,不仅速度比较快,没有波特率的限制,使用上面也比较简单,也没有额外的成本困扰。

3、cdc的目录结构

        stm32目前大部分mcu都支持cdc结构,大家只需要把对应的代码copy过来,会使用即可,不用过度追究里面的原理。

4、main函数的启动流程

        这部分代码其实和之前其他mcu的代码没有区别。在进行了usb设备的初始化,即调用MX_USB_DEVICE_Init函数之后,就是打印数据和接收数据。当然,mcu启动之后,需要一个type c的线连接到电脑上面。这个时候电脑的设备管理器就会生成一个新的com节点。我们借助于上位机串口打印工具,open这个com点之后,就可以看到对应的发送内容,以及接收的内容。

int main(void)
{SCB_EnableICache();		SCB_EnableDCache();		HAL_Init();					SystemClock_Config();	LED_Init();					MX_USB_DEVICE_Init();	USB_printf("STM32H750 virtual usb test\r\n");	while (1){USB_printf("1234567abcdefg\r\n");LED1_Toggle;HAL_Delay(1000);USB_getf();}
}

5、usb发送

        这里面发送的函数就是USB_printf,我们可以简单看下这个函数是怎么实现的。实现的文件来自于usbd_cdc_if.c,

void USB_printf(const char *format, ...)
{va_list args;					uint32_t length;			uint16_t	 USB_TimeOut;	uint32_t  Tickstart;			va_start(args, format);	length = vsnprintf((char *)UserTxBufferFS, APP_TX_DATA_SIZE, (char *)format, args);va_end(args);					USB_TimeOut = 3;	if( hUsbDeviceFS.dev_state == USBD_STATE_CONFIGURED )		{USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;	Tickstart = HAL_GetTick();		while(hcdc->TxState !=0)		{if((HAL_GetTick() - Tickstart) > USB_TimeOut){break;}}}		CDC_Transmit_FS(UserTxBufferFS, length); 
}

6、usb接收

        大家如果留心一下就会发现,刚才usb发送的时候,都是把数据copy到UserTxBufferFS里面的。其实接收数据也一样,整个接收区的内容,都是放在UserRxBufferFS缓存里面。这就意味着,我们检查UserRxBufferFS空间就可以拿到里面的内容,有数据可以打印出来,没有就算了。

void USB_getf(void)
{int num= strlen((const char*)UserRxBufferFS);if(num > 0){USB_printf("%s", UserRxBufferFS);memset(UserRxBufferFS, 0, num+1);}
}

7、测试和验证

        和前面几次打印、测试不一样,这一次的打印是通过usb线虚拟的串口实现的。这样的话就不需要实际的usb转串口工具。一个st-link v2烧录器,一个type c的线,就可以和pc电脑之间实现数据通信了。最后,还是建议大家可以把重点放在如何使用cdc、如何使用usb虚拟串口上面。等到用起来,比较熟练了,再去看usb cdc和usb协议的实现细节,这样更加稳妥。

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

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

相关文章

自动化测试git的使用

git是一款分布式的配置管理工具。本文主要讲git如何在自动化测试中安装,上传及拉取下载代码。 1 、git 介绍 每天早上到公司,从公司的git服务器上下载最新的代码,白天在最新的代码基础上,编写新的代码,下班时把“代码…

新能源汽车高压上电、高压下电逻辑分析

高压上电逻辑 新能源汽车的上电分为高压上电和低压上电,高压上电流程一般理解为高压件通电的过程,具体流程如下: 1、点火开关处于ON档时,仪表盘点亮,低压电接通。 2、VCU、BMS、MCU等控制模块依次被唤醒并开始进行自检…

解决JupyteNotebook打不开问题

问题:打开jupyternotebook出现黑色界面,马上闪退 步骤: 1、winr,cmd进入,conda activate yes 进入yes环境(后面是要下载新的jupyter notebook),我这里下载到了yes环境下 2、下载jupyter Note…

<Rust><iced>基于rust使用iced库构建GUI实例:图片的格式转换程序

前言 本专栏是Rust实例应用。 环境配置 平台:windows 软件:vscode 语言:rust 库:iced、iced_aw 概述 本文是专栏第二篇实例,是一个图像格式转换程序,基于rust图像处理库image以及文件处理库rfd。 UI演示&…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] URL拼接(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 URL拼接(100分) 🌍 评测功能需要订阅专栏后私信联系清隆解…

Python中的数据可视化:绘制三维线框图plot_wireframe()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 Python中的数据可视化: 绘制三维线框图 plot_wireframe() [太阳]选择题 在上面的代码中,plot_wireframe() 方法用于绘制什么类型的图形? import matplot…

[Algorithm][贪心][K次取反后最大化的数组和][身高排序][优势洗牌][最长回文串]详细讲解

目录 1.K 次取反后最大化的数组和1.题目链接2.算法原理详解3.代码实现 2.身高排序1.题目链接2.算法原理详解3.代码实现 3.优势洗牌1.题目链接2.算法思路详解3.代码实现 4.最长回文串1.题目链接2.代码实现 1.K 次取反后最大化的数组和 1.题目链接 K 次取反后最大化的数组和 2.…

Java课程设计:基于Javaweb的校园订餐系统

文章目录 一、项目介绍二、项目技术栈三、核心代码四、项目展示五、源码获取 一、项目介绍 在当今互联网高速发展的时代,大学校园内的学生生活正在发生着翻天覆地的变化。其中,校园内的餐饮服务无疑是亟需改革和创新的领域之一。 传统的校园食堂模式,往往存在就餐高峰时段拥挤…

DELL服务器插入新磁盘、创建虚拟磁盘、挂载磁盘步骤

文章目录 一、磁盘清理(可选,针对新硬盘是Foreign状态)1、进入VD Mgmt2、清理新硬盘配置 二、创建虚拟磁盘1、进入Device Settings2、创建虚拟磁盘 三、挂载磁盘到系统1、分区磁盘(注意实际磁盘的名称)2、格式化分区3、…

Java web应用性能分析之【prometheus+Grafana监控springboot服务和服务器监控】

Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 Java web应用性能分析之【java进程问题分析工具】-CSDN博客 Java web应用性能分析之【jvisualvm远程连接云服务器】-CSDN博客 Java web应用性能分析之【java进程问题分析定位】-CSDN博客 Java web应用性能分析之【…

【数学代码】幂

Hello!大家好,我是学霸小羊,今天来讲讲幂。 求几个相同因数的积的运算,叫做乘方,乘方的结果叫做幂。 a^n,读作 “ a的n次方 ” 或 “ a的n次方幂”,a叫做底数,n叫做指数。 对于底数、指数和幂…

Stm32超声波测距实验

一.任务需求 1. 采用stm32F103和HC-SR04超声波模块, 使用标准库或HAL库 定时器中断,完成1或2路的超声波障碍物测距功能。 2. 当前智能汽车上一般配置有12路超声波雷达,这些专用超声波雷达内置了MCU,直接输出数字化的测距结果&am…

【QT Creator软件】解决中文乱码问题

QT Creator软件解决中文乱码问题 问题描述:Qtcreator安装好后打印中文在控制台输出乱码 在网上也查找了修改编辑器的默认编码为UTF-8,但是仍然没有任何作用,于是有了以下的解决方案 原因剖析:因为项目的编码与控制台的编码不一致…

Windows10安装配置Docker客户端和WSL2与Hyper-V虚拟机

一、需求说明 需要在Windows系统中安装配置Docker的客户端,方便直接管理配置docker镜像容器内容。 二、Windows10安装Docker客户端步骤 2.1、下载安装Docker客户端 对于Windows 10以下的用户,推荐使用Docker Toolbox Windows安装文件:http://mirrors.aliyun.com/docker-…

16.大模型分布式训练框架 Microsoft DeepSpeed

微调、预训练显存对比占用 预训练LLaMA2-7B模型需要多少显存? 假设以bf16混合精度预训练 LLaMA2-7B模型,需要近120GB显存。即使A100/H100(80GB)单卡也无法支持。 为何比 QLoRA多了100GB?不妨展开计算下显存占用&…

给类设置serialVersionUID

第一步打开idea设置窗口(setting窗口默认快捷键CtrlAltS) 第二步搜索找到Inspections 第三步勾选主窗口中Java->Serializations issues->下的Serializable class without serialVersionUID’项 ,并点击“OK”确认 第四步鼠标选中要加…

DearLicy主题 | 小众化小清新风格的博客主题源码 | Typecho主题模版

DearLicy主题,一款小众化小清新风格的博客主题 主题支持Typecho所支持的所有版本PHP 简约、小众、优雅 安装教程 1.将主题上传至/usr/themes/文件夹下解压 2.后台进行启用 3.访问前台查看效果 源码下载:https://download.csdn.net/download/m0_6604…

热门开源项目ChatTTS: 国内语音技术突破,实现弯道超车

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

python简单练习案例-石头剪刀布小游戏

🌈所属专栏:【python】 ✨作者主页: Mr.Zwq ✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询!…

IDEA SpringBoot整合Mybatis(保姆级教程,超详细!!!)

目录 1. 简介 2. 创建SpringBoot项目 3. Maven依赖引入 4. 创建mapper文件夹 5. 数据源和Mybatis配置 6. 工程启动类配置 7. 连接数据库和创建测试表 8. Mapper接口和XML自动生成 9. 接口测试 1. 简介 本博客将详细介绍在IDEA中,如何整合SpringBoot与Myba…