STM32与Python上位机通过USB虚拟串口通信

这篇具有很好参考价值的文章主要介绍了STM32与Python上位机通过USB虚拟串口通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

后采用正点原子的F103最小系统板进行demo测试,成功了。流程都是类似,所以这里做一个记录。


1. 查看原理图

新建工程前,我们需要对芯片的USB脚进行查询,通过查看原理图可以看到USB的DP与DM脚对应的芯片引脚,以及DP,DM脚在哪里使用到,这个就为我们插USB数据线进行通信测试打下了基础。

DP,DM啥意思呢?是D+,D - ;是Data +,Data - ;是数据接收与发送的正负方向。

正点原子的原理图如下所示:
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件python stm32,python,嵌入式,stm32,单片机,嵌入式硬件

通过原理图我们可以看到数据的传输是通过USB-SLAVE进行的,也就是实物图红框部分。

这个板子稍有些搞人的地方在于,这个红框部分不是烧录引脚,烧录是通过另一个microUSB脚。
我写这个是因为一开始用上面的microUSB口接电脑烧录发现无法烧录,后来仔细看板子的标识,上面对每一个口进行了标注,红框部分是USB_TTL,没标框部分是USB_DEVICE。我们通常使用ST-Link和串口进行烧录,这里TTL对应的接口是串口,DEVICE接口只是作为通信部分。

2. 新建工程

工程采用STM32CubeMX进行自动生成,配置直接看图即可。

因为只是做了个回环测试,所以这里我们根据上面看的原理图只需要进行相应端口配置即可。
选择引脚,配置功能
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件
USB两个引脚配置成功后。

python stm32,python,嵌入式,stm32,单片机,嵌入式硬件


设置外部晶振,用来产生时钟信号。
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件


设置调试模式,使用SW接口。
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件


设置STM32的USB模式和配置,默认即可。
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件


设置虚拟串口通信
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件

看过很多教程,他们还会在这里设置一个中断使能,我没设置,但最后效果一样。
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件


配置一下时钟树
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件

直接在第二个红箭头那里拉到最高即可,其余点确定,不用管,软件会自动配置好。


设置一些项目配置,堆栈大小的话,如果只和我一样做个通信测试,其实小点就小点无所谓。如果你代码写了不少,出现USB插上以后无法识别等情况,这个堆栈大小可以调大,比如都为0x1000

python stm32,python,嵌入式,stm32,单片机,嵌入式硬件


这里配置代码生成所需要的库,以及.c.h文件是否分开存放。
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件


这些都配置好了?那就点击。
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件


3.添加代码与烧录

因为是做回环测试,所以我们只需要在接受数据的时候把数据发送回去就行。
找到usb_cdc_if.c文件,
260行左右有个CDC_Receive_FS函数,
在return语句前一句添加CDC_Transmit_FS(Buf,*Len);
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件

重新编译后,进行烧录可能会报错。
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件
我这个最小系统班的构造有些独特,所以我keil里面直接烧录就出错了。
这个时候我们可以通过生成hex文件进行烧录,hex文件的生成设置是在魔术棒里设置的。
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件

然后我们可以用串口工具,比如:FlyMcu(正点原子自带的),选择hex文件烧录就行了。我这个板子烧录需要改变接口到USB_TTL部分,其他型号板子可能问题都不太一样,大同小异,看清原理图就知道了。下图还有个Port:可以点击一下选择自己的串口对应的端口。我这里烧录口对应的端口为COM8
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件


4. python代码编写

从机的相关配置在前三步已经OK了,下面就是上位机的部分了。

python编写上位机通信,我这里主要是通过第三方库pyserial,这个安装如果失败了可以参考《python pycharm安装包失败 使用pip安装失败 解决方案》

我们把STM32的端口换到USB_DEVICE口,对应的电脑上串口在电脑上的标识就可以通过右键此电脑->管理查询到。下图中我的板子对应的是虚拟串口COM16
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件


找到这个有什么用呢?那当然是配置上位机端口ID用呀。
代码已经贴在下面了,下面是具体说明。
1.导入第三方库
2.定义串口通信初始化函数,这里deviceId的值就是我们刚才在设备管理器中看到的端口号。
3.定义一个串口,并进行初始化。这里注释了很多语句,因为我们用的是USB虚拟串口通信,这个波特率什么的其实作用不是很大。注释的语句分别表示:配置波特率为115200、是否分组、停止位的大小、字节大小、超时配置。
4.刷新缓存输入,返回定义好的串口。
5.写数据并配置编码方式。这里发送的数据一般都是ascii或者16进制进行发送,字符串我试过了似乎无法直接发送。
6.判断有无数据返回,如果返回的数据就是我们发送的数据则输出nice,否则就一直发送。这样写是为了调试方便,没上面其他意思。

import serial.tools.list_ports
# 定义USB通信初试化函数
def Serial_Init():
    deviceId = 'COM16'
    ser = serial.Serial(
        port=deviceId,
        #baudrate=115200,
        #parity=serial.PARITY_NONE,
        #stopbits=serial.STOPBITS_TWO,
        #bytesize=serial.EIGHTBITS,
        #timeout=None
    )
    ser.flushInput()
    return ser


ser = Serial_Init()
ser.write("11".encode('ascii'))
flag = False
while not flag:
    if ser.inWaiting() > 0:
        text = ser.read(ser.inWaiting())
        if text[0:2] == str("11").encode('ascii'):
            flag = True
            print("nice")

    else:
        ser.write("11".encode('ascii'))

执行成功后就会出现这样的结果。
python stm32,python,嵌入式,stm32,单片机,嵌入式硬件


总结

本文可以说是上位机从0开始记录了,怎么看原理图,怎么配工程,写代码等等。都是我一步一步踩坑走来的,虽然回首看去比较简单,但总归还是收获颇丰。
这一次尝试让我对上位机通信的具体流程有了一定的了解,后面具体运用之类的还会涉及到很多协议的上位机通信,到时候整明白了再做记录。


问题解决思路

这里对于我NUCLEO-L4768RG板子的一些问题,当时看遍了互联网也没找到的解决方案,但是看到了其他的一些问题与解决方案。

大体如下:
1.如果USB配置为全速模式,要接一个上拉电阻,我查了一下是在芯片手册里面有写,这个具体情况具体考虑,这里只写一下解决问题的思路。

2.如果出现USB无法识别或带问号的设备,考虑是否安装驱动,堆栈是否设置过小。

3.NUCLEO-L4768RG的有两个芯片,STM32F103CBT6和STM32L476RG两块,这里比较坑爹的地方就是板子烧写的代码是烧写到L476里面,但是唯一的USB供电以及烧录的端口是在F103上面。L476上面的DP,DM引脚没有接东西,只有两个空着的引脚;
我现在的思路是用一个USB的口,后面飞线大法,直接接到排针上面进行通信。理论上应该可行,就是实现起来稍微有点麻烦。
因此我这个博客写的是F103的最小系统板,其实主要是为了验证通信的流程以及功能。文章来源地址https://www.toymoban.com/news/detail-614261.html

到了这里,关于STM32与Python上位机通过USB虚拟串口通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • ROS机器人制作(三)—— ROS上位机与stm32进行串口通信

    总代码在文末,需要完整的工程文件可以私聊(收一点点辛苦费) 首先创建一个功能包,用于发送和接收数据。 注意: 1.功能包依赖: roscpp std_msgs rosserial 2.当有两个c++文件进行编译时可以在功能包下的CMakeLists.txt文件中 第一部分是ROS上位机给stm32发送数据。第二部分是stm

    2024年02月15日
    浏览(14)
  • 调试STM32F4 USB3300 USB_HS虚拟串口

    调试STM32F4 USB3300 USB_HS虚拟串口

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

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

    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日
    浏览(21)
  • C#上位机的USB通信与串口通信接口区别

    USB通信与串口通信接口的代码区别有以下几个方面: 通信方式不同:串口通信采用全双工或半双工通信方式,而USB通信采用异步、同步和批量传输等多种传输方式。 端口号设置不同:串口通信设置端口号,如\\\"COM1\\\"、\\\"COM2\\\"等,而USB通信通过设备描述符和VID/PID等参数进行识别和

    2024年02月08日
    浏览(12)
  • STM32入门笔记10_USART串口通信+案例:上位机控制LED亮灭(USART串口通信、TIM定时器、EXTI综合案例)

    STM32入门笔记10_USART串口通信+案例:上位机控制LED亮灭(USART串口通信、TIM定时器、EXTI综合案例)

    通信的目的: 将一个设备的数据传送到另一个设备, 扩展硬件系统 通信协议: 制定通信的规则, 通信双方按照协议规则进行数据收发 名称 引脚 双工 时钟 电平 设备 USART TX、RX 全双工 异步 单端 点对点 I2C SCL、SDA 半双工 同步 单端 多设备 SPI SCLK、MOSI、MISO、CS 全双工 同步 单端

    2024年02月09日
    浏览(12)
  • 【STM32】STM32F4中USB的CDC虚拟串口(VCP)使用方法

    【STM32】STM32F4中USB的CDC虚拟串口(VCP)使用方法

    最近在学习STM32的USB功能,主要是想要使用虚拟串口(VCP)功能,来解决串口传输速率较低的问题,达到于上位机高效通信的目的。 使用芯片:STM32F407ZGT6 使用函数:HAL库 使用工具:STM32CubeMX + Keil uVision5 串口工具:VOFA 主要配置内容: 调试模式为Serial; 使用外部时钟 设置为

    2024年02月21日
    浏览(16)
  • 【嵌入式知识08】STM32的USART串口通信,给上位机连续发送Hello Windows!

    【嵌入式知识08】STM32的USART串口通信,给上位机连续发送Hello Windows!

    本文主要介绍串口协议和RS-232、485标准,以及RS232、485电平与TTL电平的区别,了解\\\"USB/TTL转232\\\"模块的工作原理;并完成一个STM32的USART串口通讯程序。   串口通信(Serial Communication)的概念非常简单,串口按位(bit)发送和接收字节的通信方式。尽管比按字节(byte)的并行通信

    2024年02月13日
    浏览(14)
  • 基于STM32CubeMx配置FreeRtos以及USB虚拟串口步骤详解

    基于STM32CubeMx配置FreeRtos以及USB虚拟串口步骤详解

       Debug:推荐选择 Serial Wire (方便使用STLink打断点在线调试) 中间两项默认Disable就好 TimeBase Source:若需要配置FreeRtos则不能选择SysTick,随机选择一个TIM定时器即可,这里我选择TIM1定时器。 (解释:裸机的时钟源默认是SysTick,但是开启FreeRtos后,FreeRtos会占用SysTick,用于任

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

    STM32CubeMX学习笔记(43)——USB接口使用(CDC虚拟串口)

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

    2024年02月02日
    浏览(16)
  • STM32与USB3300共同实现USB OTG HS的CDC串口通信速度测试

    STM32与USB3300共同实现USB OTG HS的CDC串口通信速度测试

      STM32和上位机传统通信方式就是串口,IIC,SPI等。IIC和SPI一般不常用,串口是用的最多的通信方式。然而串口一般用于输出调试信息这种对传输速度没要求的场景,那种大容量数据快速传输的场景,串口显得捉襟见肘。STM32自带USB FS,然而既然都使用USB了,为什么不用US

    2024年02月07日
    浏览(10)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包