首页 > 其他分享 >上位机图像处理和嵌入式模块部署(h750 mcu和usb虚拟串口)

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

时间:2024-06-15 23:33:31浏览次数:12  
标签:USB cdc UserRxBufferFS 串口 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协议的实现细节,这样更加稳妥。

标签:USB,cdc,UserRxBufferFS,串口,mcu,usb
From: https://blog.csdn.net/feixiaoxing/article/details/139710309

相关文章

  • 51单片机有开发板A和开发板B,通过串口,实现开发板A的按键,控制开发板B的LED亮灭。
    1、功能描述有开发板A和开发板B,通过串口,实现开发板A的按键,控制开发板B的LED亮灭。2、实验原理1.串口通信(UART)串口通信是一种异步通信方式,它允许单片机通过两条线(发送线TX和接收线RX)进行数据传输。在51单片机中,串口通信是通过两个主要寄存器(SCON、SMO/SM1)和中断(RI、TI)......
  • NG32031单片机串口初始化
    目录1.串口基础2.串口配置步骤3.N32G031串口初始化示例3.1开启时钟3.2 配置GPIO3.3 配置USART3.4 使能中断(如果需要)    3.5. 示例代码4.调试和验证5.注意事项6.额外功能NG32G031单片机的串口(UART)通常用于与外部设备或计算机进行串行通信。以下......
  • ESP8266 NodeMCU Lua 开发看这里
    最近开发ESP8266-NodeMCU因为开发过合宙4G模块,用的Lua,所以这里也用Lua。但是最开始两眼一抹黑,在网上找资料,乱七八糟,需要Lua固件库、LuaAPI文档、Lua例程、固件下载工具、IDE(Lua代码编写和下载)、串口驱动(这是常识,就不用说了)找来找去,气死我了!!!!都是介绍下工具咋使用、弄个d......
  • 学习日志-C51-串口通信
    学习日志-C51-串口通信串口控制LED灯亮灭1.常见通信串口比较分类1:单工:只能由甲向乙传输信号,一根传输线。半双工:数据可以在双方传输,但同一时刻只能单方传输,发送数据的同时不能接收数据,一根传输线。全双工:数据可以在双方传输,发送数据的同时也能接收数据,需两根传输线。......
  • 串口收发UART(Verilog HDL)
    UART(UniversalAsynchronousReceiverTransmitter,通用异步收发器)是一种异步串行通信协议,主要用于计算机和嵌入式系统之间的数据交换。实现UART通信的接口规范和总线标准包括RS-232、RS449、RS423和RS485等,接口标准规定了通信标准的电气特性、传输速率、连接特性和机械特性。文......
  • USB端口管控软件|USB端口控制软件有哪些(小技巧)
    ​USB端口管控软件成为了保障企业数据安全的重要手段。 本文将为您介绍几款知名的USB端口控制软件,并分享一些实用的小技巧,帮助您更好地管理US端口,确保企业信息安全。#usb接口#一、USB端口控制软件推荐1,域智盾域智盾是一款功能强大的企业USB端口控制软件。它采用先进......
  • 怎么只读USB存储设备?教你两种方法
    电脑的USB可以帮助我们连接各种设备,比如移动存储设备。而只读USB则可以保护电脑数据和移动存储设备中的设备。那么,怎么只读USB存储设备?下面我们就一起来了解一下吧。USB设备只读加密USB设备只读加密可以在不影响移动存储设备正常使用的前提下,避免其他人复制、移动、删除其......
  • 单片机学习(9)--串口
    串口8.1串口通信1.串口介绍2.硬件电路3.电平标准4.接口及引脚定义5.常见通信接口比较6.相关术语6.51单片机的UART7.串口参数8.串口模式图8.串口和中断系统9.串口相关寄存器8.2串口向电脑发送数据,电脑通过串口控制LED1.串口向电脑发送数据程序(1)工程目录(2)main.c函数(3)UART......
  • 串口通信GPT
    目录硬件层面串口通信的基本原理是什么?常见的串口通信协议有哪些?硬件层面如何连接两个设备进行串口通信?需要哪些硬件支持?RS-232与RS-485的区别?软件层面如何在编程中实现串口通信?如何配置串口参数以确保通信正常?数据处理如何处理串口通信中的数据丢失或错误?如何处理......
  • 细说ARM MCU的串口接收数据的实现过程
    目录一、硬件及工程1、硬件2、软件目的3、创建.ioc工程二、代码修改1、串口初始化函数MX_USART2_UART_Init()(1)MX_USART2_UART_Init()串口参数初始化函数(2)HAL_UART_MspInit()串口功能模块初始化函数2、串口中断的执行过程3、启动串口接收中断4、自动生成main函数5......