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

一.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字节的局限,算是自己开发过程中用到的小技巧,与大家分享,谢谢!

四. 感谢支持

    完结撒花!希望看到这里的小伙伴能点个关注,我后续会持续更新,也欢迎大家广泛交流。
    码字实属不易,如果本文对你有10分帮助,就赏个10分把,感谢各位大佬支持!

在这里插入图片描述

stm32f429是一款高性能的32位微控制器,它具有丰富的外设资源和强大的处理能力。其中,stm32f429的USB功能可以实现虚拟串口驱动,使其可以通过USB接口与计算机进行通信。 实现stm32f429 USB虚拟串口驱动的步骤如下: 1. 首先,我们需要在stm32f429的固件库中选择合适的USB外设模块并进行初始化。这些模块通常包括USB OTG(On-The-Go)控制器和相关的中断和DMA(Direct Memory Access)控制器。 2. 接下来,我们需要编写一些相关的程序代码来配置和控制USB外设模块。这些代码通常包括设备描述符、配置描述符、端点描述符等的设置,以及状态检测、中断处理、数据传输等操作的实现。 3. 在代码编写完成后,我们需要将代码烧录到stm32f429的Flash存储器中,并在运行时启动USB虚拟串口驱动。这通常需要在系统初始化时调用相应的初始化函数,并设置合适的中断优先级和中断服务函数。 4. 最后,我们需要在计算机上安装相应的USB虚拟串口驱动程序,以便能够识别stm32f429作为一个虚拟串口设备。这通常需要将相关的驱动文件复制到计算机的驱动目录中,并在设备管理器中手动添加和配置串口设备。 总之,通过以上步骤,我们可以实现stm32f429的USB虚拟串口驱动,使其能够与计算机进行通信。这在很多应用场景中都非常有用,比如嵌入式设备与上位机的数据交互、固件升级等。同时,我们也可以根据具体的需求和应用场景,对USB虚拟串口驱动进行定制和优化,以满足不同的需求。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tutu-hu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值