USB VCP虚拟串口通讯详细配置步骤(STM32H732)

这篇具有很好参考价值的文章主要介绍了USB VCP虚拟串口通讯详细配置步骤(STM32H732)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、软件版本

1、单片机型号:STM32H743IIT6;正点原子-阿波罗版
2、Keil-MDK:V5.32
3、CubeMX:6.7.0
4、HAL:STM32Cube FW_H7 V1.11.0
5、参考文章:

1.STM32 USB使用记录:使用CDC类虚拟串口(VCP)进行通讯
2.STM32CubeIDE 简单配置USB虚拟串口 并实现printf
3.STM32Cube配置USB虚拟串口发送与接收回传
4.STM32USB开发备忘之CDC_VCP实验

二、CodeMX配置

1、使能外部高速时钟。

USB VCP虚拟串口通讯详细配置步骤(STM32H732)

2、开启USB外设,选择USB Device功能,速度为默认全速USB设备12Mbps,使用默认配置。

USB VCP虚拟串口通讯详细配置步骤(STM32H732)

3、配置中间层使能CDC(VPC),参数依然全默认。

USB VCP虚拟串口通讯详细配置步骤(STM32H732)

4、时钟配置,选用外部HSE时钟源,将USB时钟配置为48MHz。

USB VCP虚拟串口通讯详细配置步骤(STM32H732)
USB VCP虚拟串口通讯详细配置步骤(STM32H732)

5、修改Heap Size和Stack Size大小,太小导致串口识别不到或者识别错误出现黄色感叹号。

USB VCP虚拟串口通讯详细配置步骤(STM32H732)

6、生成Keil工程,编译运行代码。

USB VCP虚拟串口通讯详细配置步骤(STM32H732)

7、打开设备管理器,复位单片机,识别到虚拟串口。

USB VCP虚拟串口通讯详细配置步骤(STM32H732)

USB VCP虚拟串口通讯详细配置步骤(STM32H732)

三、软件配置

主要修改usbd_cdc_if.c和main.c,会使用这四个函数,就可以用单片机与PC进行USB基本通信:
CDC_Control_FS()

来自主机请求的回调函数;CDC控制命令处理,列举了主机有可能向设备发送的一些命令。没有具体的处理过程,需要用户自己编写。其中包括串口参数的设置,要做串口转USB通信的话需要修改这里。只是为了用USB与PC通信则不用管这里。每个命令具体的意思需要查询CDC类手册。

CDC_Receive_FS()

接收数据回调函数;Buf为接收缓存。这个缓存实际上就是CDC_Init_FS()中设置的UserRxBufferFS[]数组。这个全局数组的定义在usbd_cdc_if.c文件中。Len为接收到数据的长度。这个变量不是全局的,需要用户声明变量把这个传出去。

CDC_Transmit_FS()

用来发送数据;

CDC_TransmitCplt_FS()

发送完成回调函数;

1、单片机向PC发送,在main.c中声明发送字符串和长度。
#include "usbd_core.h"
#include "usbd_cdc.h"
#include "usbd_cdc_if.h"
char USB_TxBuf[32];
uint16_t len;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
		len=sprintf(USB_TxBuf,"Hello GJtech!\r\n");
		CDC_Transmit_FS((uint8_t*)USB_TxBuf,len);
		HAL_Delay(1000);
		/* USER CODE END WHILE */
 
		/* USER CODE BEGIN 3 */
}

USB VCP虚拟串口通讯详细配置步骤(STM32H732)

USB VCP虚拟串口通讯详细配置步骤(STM32H732)

2、PC向单片机发送,在usbd_cdc_if.c修改函数,实现接收回传。

接收函数在usbd_cdc_if.h中并没有给出,而是在usbd_cdc_if.c中以static关键字给出的,这个函数其实是在USB接收时自动进入中断并调用的,可以直接在其中将接收缓冲区的内容做处理或转存。

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  CDC_Transmit_FS(Buf,*Len);
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  return (USBD_OK);
}

USB VCP虚拟串口通讯详细配置步骤(STM32H732)
USB VCP虚拟串口通讯详细配置步骤(STM32H732)

3、添加USB_printf打印函数,在usbd_cdc_if.c添加函数,方便直接输出字符串。
/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
#include <stdarg.h>
void usb_printf(const char *format, ...)
{
    va_list args;
    uint32_t length;
 
    va_start(args, format);
    length = vsnprintf((char *)UserTxBufferFS, APP_TX_DATA_SIZE, (char *)format, args);
    va_end(args);
    CDC_Transmit_FS(UserTxBufferFS, length);
}
/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */

USB VCP虚拟串口通讯详细配置步骤(STM32H732)

四、速度测试

在此正点原子单片机上,编写Python代码测试速度,可得到单片机发送数据速度为868.352K Byte/s(6.9M bps),接收速度为804.864K Byte/s(6.4M bps)。
USB VCP虚拟串口通讯详细配置步骤(STM32H732)

因为相比硬件串口而言,USB虚拟的串口速度可以变得非常快,图形化的串口工具已经无法用来测速了,所以用python写了个脚本进行测试,测试脚本如下:文章来源地址https://www.toymoban.com/news/detail-410504.html

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from typing import Counter
import serial
import serial.tools.list_ports
import time
import datetime
print('正在搜索串口……')
port_list = list(serial.tools.list_ports.comports())
print('发现串口:')
for i in range(0, len(port_list)):
    print(port_list[i])
print('')
port = input('请输入串口号,并按回车确认: ')
print('')
ser = serial.Serial(port, 22333, timeout=5)
run = True
count = 0
starttime = int(round(time.time() * 1000))
print(datetime.datetime.now().strftime('%H:%M:%S.%f') + ':开始测试单片机向上位机发送数据……')
ser.write('S'.encode('utf-8'))
while (run):
    ser.read(2048) # 接收来自单片机的数据
    count += 1
    currenttime = int(round(time.time() * 1000))
    run = False if (currenttime - starttime) >= 1000 else True
ser.write('E'.encode('utf-8'))
print(datetime.datetime.now().strftime('%H:%M:%S.%f') + ':结束测试,速度约为 ' + str(count * 2048 / 1000) + 'K Byte/s' +'='+ str(count * 2048 / 1000*8) + 'K bps\n')
sendbuf = bytes(2048)
run = True
count = 0
starttime = int(round(time.time() * 1000))
print(datetime.datetime.now().strftime('%H:%M:%S.%f') + ':开始测试单片机接收上位机的数据……')
while (run):
    count += ser.write(sendbuf) # 向单片机发送数据
    currenttime = int(round(time.time() * 1000))
    run = False if (currenttime - starttime) >= 1000 else True
print(datetime.datetime.now().strftime('%H:%M:%S.%f') + ':结束测试,速度约为 ' + str(count / 1000) + 'K Byte/s' +'=' +str(count / 1000*8) + 'K bps\n')
ser.close()
exit()

到了这里,关于USB VCP虚拟串口通讯详细配置步骤(STM32H732)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 调试STM32F4 USB3300 USB_HS虚拟串口

    参考了csdn上面的几篇文章,经历了一个多小时的调试排除找bug,终于成功了! 通过STM32cubeMx配置USB phy芯片 1. 2. 3. 4. 5.生成代码出来,打开工程,编译下载通过。 在上电之前,电脑得先安装ST的USB 虚拟串口驱动 点击前往下载--STSW-STM32102 - STM32虚拟COM端口驱动程序 - STMicroelect

    2024年02月02日
    浏览(72)
  • STM32F40 USB虚拟串口 HAL库

    1.CubeMX设置 选择USB Device功能,速度为默认全速USB设备12MHZ,并使能USB_DEVICE库,选择Virtual Port Com (虚拟串口,VPC),使用默认配置。  完成USB_DEVICE配置后,USB中断自动开启,引脚自动配置;USB_DEVICE配置参数默认即可; 选择独立 .h .c 文件,Heap size有一些文档建议填写500以上,

    2024年02月10日
    浏览(64)
  • STM32与Python上位机通过USB虚拟串口通信

    在详细阅读广大网友的教程之后,我对STM32和Python通过USB通信的流程烂熟于心。 尝试用ST公司的NUCLEO-L476RG板子进行简单的回环通信测试,发现还是存在网上无法找到的问题,这个耽搁了几天,期间找到了原因,但没有焊接调试,所以暂时就不以它为例子进行写了。 后采用正点

    2024年02月15日
    浏览(40)
  • stm32 使用keil无实物(软件)仿真,虚拟串口通讯

    准备 1.keil 2.vspd虚拟串口 3.sscom串口助手 4.CubeMX 设置好ini文件和程序后,编译前虚拟串口是关闭的  编译完成后,串口显示打开,说明keil使用了vspd的串口。  然后就是修改程序,接收和发送数据。 无硬件仿真,有些定时器和其他一些配置通过 CubeMX 进行配置,再把配置文件给

    2024年02月12日
    浏览(69)
  • STM32CubeMX学习笔记(43)——USB接口使用(CDC虚拟串口)

    USB(Universal Serial BUS)通用串行总线 ,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在 PC 领域的接口技术。USB 接口支持设备的即插即用和热插拔功能。USB 是在 1994 年底由英特尔、康柏、IBM、Microsoft 等多家公司联合提出的。 USB 发展到现在已经有 US

    2024年02月02日
    浏览(47)
  • STM32的USB HID通用模式,双向通讯USB数据库参数配置

    目录 一、 usb_desc.c 1.配置描述符 2.报文描述符 二、usb_prop.c 三、usb_conf.h 四、usb_endp.c #define USB_HID_IN_SIZE    26         /*发送数据大小*/ #define USB_HID_OUT_SIZE  0x08   /*接收数据大小*/ 1.配置描述符         配置USB设备为HID设备,配置IN端点1,发送数据;OUT端点2接收数据;

    2024年02月05日
    浏览(45)
  • stm32 USB HID+CDC 鼠标键盘串口 组合设备配置解析

    查阅网上的博客与代码,很多都是关于USB的鼠标配置、USB的键盘配置、USB的虚拟串口配置,稍微深入一点的会将鼠标键盘合在一起,但移植起来就会报很多错误,要么是检测不到,要么是警告,这很正常,因为不理解这些数字代表着什么。但只要理解每个数字代表什么意思,

    2024年02月13日
    浏览(47)
  • 野火指南者(STM32F103VET6)应用:实现USB虚拟串口(CDC_VPC)

    MCU:STM32F103VET6 开发环境:STM32CubeMX+MDK5   实现USB的虚拟串口不需要去理解USB的底层驱动,只需要STM32CubeMX去配置生成工程即可。在野火的指南者中,是没有这一类的视频和示例的,博主使用这款开发板实现USB虚拟串口。 首先需要打开STM32CubeMX工具。输入开发板MCU对应型号,找

    2024年02月08日
    浏览(44)
  • STM32(2)-串口通讯实际应用:串口屏

    文章以UART基础知识和串口屏实际应用来说明串口的作用。 、 UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)的缩写,是一种串行通讯协议,通常用于将计算机或微处理器与其他设备(如传感器、模块、显示器等)进行通信。UART可以将数据以一定速率和格式(

    2024年02月16日
    浏览(43)
  • STM32CubeMX串口通讯

    根据通讯使用的电平标准不同, 串口通讯可分为 TTL 标准及 RS-232 标准 。而STM32的串口是TTL电平标准的。如果需要使用到RS-232则需要一个电平转换芯片。 讲到串口,我们还需要具备这些基础概念。 单工通讯 (1)单工通讯特点很简单,就是只有一个发送端,一个接收端。 从一

    2024年02月02日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包