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

news2024/11/20 19:35:30

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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.coloradmin.cn/o/1837995.html

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

相关文章

windows如何运行wgcloud-agent-release

只需要右击wgcloud-agent-release.exe,用管理员身份,启动就好啦 你也可以双击regAgentService.bat,将agent注册为系统服务,然后在系统服务里面启动wgcloud-agent-release服务,这样可以隐藏运行窗口,也可以…

Vue59-全局事件总线:任意组件间通信

一、原理图 只是总结出的经验,不是新的API! 二、x的要求: 1、保证x被所有组件看见; 2、x可以调用的到$on,才能绑定事件,还能调用到:$of, $emit; 三、x的创建&#xff…

linux系统定时任务执行脚本中断,而手动运行正常

1.问题排查 linux会给对的crontab执行者 返回信息。而这个返回的信息就是通过邮件发给执行者的,通过邮件可以查看你的定时任务 然后发现是在定时任务中找不到对应的命令 2. 定时任务用的什么环境 crontab默认的环境变量并没有一个固定的文件来直接定义&#xf…

Hype 4(html5工具) mac版下载-Hype 4 for mac软件最新版下载附加详细安装步骤

用户量向我们证明了矢量形状,矢量是使用矢量工具绘制的形状,包括直线,曲线和复杂形状。有目共睹的是Hype是一款强大的Mac OS平台 HTML5 创作工具,它能够在网页上做出赏心悦目的动画片效果,创建丰富的网页交互动画片&am…

SpringBoot的入门案例

1、创建一个Maven工程 2、点击设置自动导入jar包 3、导入spring boot需要的依赖 打开sping boot的文档 导入依赖的pom.xml配置内容 4、创建一个spring boot的执行入口程序 5、写controller,service,dao的页面逻辑代码 6、测试,运行工程&#…

【Hive安装】— “schematool -initSchema -dbType mysql -verbose” 报错!!!

项目场景:Hive 元数据配置到 MySQL 执行 “schematool -initSchema -dbType mysql -verbose” 命令 问题描述 报错:org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state would be inconsistent !! 原因…

掌握市场脉动,Anzo Capital深度解析随机指标的超买超卖秘密

随机指标,作为市场分析的利器,主要用于判断资产价格的相对位置,是揭示市场超买与超卖状态的关键工具,也是大多数交易平台的标准配置。它以独特的视角,帮助交易者捕捉市场的微妙变化。下面跟随Anzo Capital视角&#xf…

内置类型不够用?试试Python内置类型子类化!

目录 1、经典继承法:直接子类化内置类型 🧬 1.1 了解Python内置类型 1.2 实现子类化的基础步骤 步骤1:定义子类 步骤2:添加自定义行为 步骤3:使用子类 1.3 实战:子类化列表list示例 1.4 优化:重写魔法方法实现自定义行为 2、高级技巧:元类介入定制 🪐 2.1 …

C语言入门系列:数据类型之浮点数

文章目录 一,什么是浮点数二,C语言中的浮点数1,float1.1 float的声明1.2 float的存储格式1.3 float的精度和范围 2,double2.1 double变量的声明2.2 double的存储格式1.3 double的精度和范围1.4 long double 3,0.2 0.1…

【查看显卡信息】——Ubuntu和windows

1、VMware虚拟机 VMware虚拟机上不能使用CUDA/CUDNN,也安装不了显卡驱动 查看显卡信息: lspci | grep -i vga 不会显示显卡信息,只会输出VMware SVGA II Adapter,表示这是一个虚拟机,无法安装和使用显卡驱动 使用上…

餐饮点餐系统小程序(ThinkPHP+FastAdmin+UniApp)

便捷美食新体验🍔📱 基于ThinkPHPFastAdminUniApp开发的餐饮点餐系统,主要应用于餐饮,例如早餐、面馆、快餐、零食小吃等快捷扫码点餐需求,标准版本仅支持先付款后就餐模式,高级版本支持先付后就餐和先就餐…

照度计仪器校准检测需要注意哪些因素?通常选择什么校准机构?

照度计是计量中光学领域常见的一类计量器具,一般是用于测量光照影响的微量变化,在实验室和机构中,都有广泛运用。常规的照度计在仪器校准检测中,误差主要因素是外界光线干扰,以及温湿度变化和稳压直流电源的电压变化差…

深度优先遍历-在二叉树中找到两个节点的最近公共祖先

目录 一、问题描述 二、解题思路 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 使用深度递归的方式,如果当前结点val为o1时,返回1,如果当前结点是val为o2时,返回2; 1.当前结点的左右子树结点返回值分别…

[UE虚幻引擎] DTSpeechVoice 文字转语音播放 插件说明

本插件可以在UE中使用蓝图把文本转成语音播放,播放的声音引擎是使用Windows自带的语音引擎,支持Win10,Win11。 系统设置 首先确认电脑是否有语音系统,一般正常安装的电脑都是自带的。 如果要播放多语言的,请自己下载其…

5.00001 postgresql的辅助线程 - pg_stat架构整理

文章目录 整体架构关键变量PgStat_LocalState pgStatLocal; // (pg_stat.c:193)static dlist_head pgStatPending = DLIST_STATIC_INIT(pgStatPending); (pg_stat.c:218)static MemoryContext pgStatPendingContext = NULL;(pg_stat.c:210)static const PgStat_KindInfo pgstat…

网络安全:深入探讨端点保护的策略与实践

文章目录 网络安全:深入探讨端点保护的策略与实践引言端点保护简介端点保护面临的挑战端点保护的最佳实践定期更新和打补丁使用强大的防病毒软件实施多因素认证 结语 网络安全:深入探讨端点保护的策略与实践 引言 在我们的网络安全系列文章中&#xff…

陶建辉入选 2023 年度“中国物联网行业卓越人物榜”

在这个技术飞速发展的时代,物联网行业作为推动社会进步的重要力量,正在不断地演化和革新。近日,中国智联网生态大会暨“2023 物联之星”年度榜单颁奖典礼在上海浦东举行。现场公布了拥有物联网行业奥斯卡奖之称的 ——“物联之星 2023 中国物…

必看!!! 2024 最新 PG 硬核干货大盘点(上)

PGConf.dev(原名PGCon,从2007年至2023年)首次在风景如画的加拿大温哥华市举办。此次重新定位的会议带来了全新的视角和多项新的内容,参会体验再次升级。尽管 PGCon 历来更侧重于开发者,吸引来自世界各地的资深开发者、…

零信任是对抗AI威胁的“解药”

人工智能的变革力量正在重塑众多行业的业务运营。通过机器人流程自动化(RPA),人工智能正在将人力资源从重复的、基于规则的任务中解放出来,并将其重点放在战略性的、复杂的操作上。此外,人工智能和机器学习算法可以以前…

LabVIEW电池管理系统测试平台

随着混合动力汽车技术的快速发展,对电池管理系统(BMS)的测试需求显著增加。利用LabVIEW软件开发了一款电池管理系统测试平台,通过模拟电池行为验证BMS的控制策略,从而降低成本、缩短开发周期,并提高整车的能…