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

文章目录

  • 前言
  • 1. 查看原理图
  • 2. 新建工程
  • 3.添加代码与烧录
  • 4. python代码编写
  • 总结
  • 问题解决思路

前言

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

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


1. 查看原理图

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

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

正点原子的原理图如下所示:
USB口
在这里插入图片描述在这里插入图片描述

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

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

2. 新建工程

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

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


设置外部晶振,用来产生时钟信号。
在这里插入图片描述


设置调试模式,使用SW接口。
在这里插入图片描述


设置STM32的USB模式和配置,默认即可。
在这里插入图片描述


设置虚拟串口通信
在这里插入图片描述

看过很多教程,他们还会在这里设置一个中断使能,我没设置,但最后效果一样。
在这里插入图片描述


配置一下时钟树
在这里插入图片描述

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


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

在这里插入图片描述


这里配置代码生成所需要的库,以及.c.h文件是否分开存放。
在这里插入图片描述


这些都配置好了?那就点击。
在这里插入图片描述


3.添加代码与烧录

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

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

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


4. python代码编写

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

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

我们把STM32的端口换到USB_DEVICE口,对应的电脑上串口在电脑上的标识就可以通过右键此电脑->管理查询到。下图中我的板子对应的是虚拟串口COM16
在这里插入图片描述


找到这个有什么用呢?那当然是配置上位机端口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'))

执行成功后就会出现这样的结果。
在这里插入图片描述


总结

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


问题解决思路

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/8221.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux·异步IO编程框架

hi,大家好,今天分享一篇Linux异步IO编程框架文章,对比IO复用的epoll框架,到底性能提高多少?让我们看一看。 译者序 本文组合翻译了以下两篇文章的干货部分,作为 io_uring 相关的入门参考: Ho…

【RocketMQ】顺序消息实现原理

全局有序 在RocketMQ中,如果使消息全局有序,可以为Topic设置一个消息队列,使用一个生产者单线程发送数据,消费者端也使用单线程进行消费,从而保证消息的全局有序,但是这种方式效率低,一般不使用…

Web 攻防之业务安全:接口未授权访问/调用测试(敏感信息泄露)

Web 攻防之业务安全:接口未授权访问/调用测试 业务安全是指保护业务系统免受安全威胁的措施或手段。广义的业务安全应包括业务运行的软硬件平台(操作系统、数据库,中间件等)、业务系统自身(软件或设备)、业…

ViT/vit/VIT详解

参考: Vision Transformer详解: https://blog.csdn.net/qq_37541097/article/details/118242600 目录: x.1 (论文中)模型理解x.2 代码理解 建议阅读时间:10min x.1 模型理解 ViT是发表在ICLR2021上的一篇文章,通过将图片分割…

Java并发控制 学习笔记1

一、并发控制的方法 1、悲观锁:常用的互斥锁都属于悲观锁,一个线程访问共享资源时其他线程不能访问。 2、乐观锁:允许同时访问共享数据,只有在提交时利用如版本号检查是否有冲突,应用github。 3、什么时候用乐观锁、什…

携程平台增长部总经理王绩强:原生互联网企业正在经历一场数字升级丨数据猿专访...

‍数据智能产业创新服务媒体——聚焦数智 改变商业以大数据和人工智能为核心,众多新兴技术开始赋能数字营销。于是,智能营销已然从工具化走向了业务化。如今,数字化营销已经成为了企业数字化转型中的重要一环。相较于传统营销逻辑&#xff0…

新版新款影视直播粉红色UI的麻豆CMS源码/带教程/支付已接

基于苹果CMS v10影视系统框架开发的前端模板,带会员中心,可设置试看付费观看等功能。 经过测试及修复,这套源码功能还是很强大的,可以设置一键采集,并且支付我们给他接到了易支付,拓展性强,基本…

【压测】通过Jemeter进行压力测试(超详细)

文章目录背景一、前言二、关于JMeter三、准备工作四、创建测试4.1、创建线程组4.2、配置元件4.3、构造HTTP请求4.4、添加HTTP请求头4.5、添加断言4.6、添加察看结果树4.7、添加Summary Report4.8、测试计划创建完成五、执行测试计划总结背景 通过SpringCloudGateway整合Nacos进…

如何下载ChatGPT-ChatGPT如何写作

CHATGPT能否改一下文章 ChatGPT 作为一种自然语言处理技术,生成的文章可能存在表达不够准确或文风不符合要求等问题。在这种情况下,可以使用编辑和修改来改变输出的文章,使其符合特定的要求和期望。 具体来说,可以采用以下步骤对…

超越竞争对手:利用Facebook A/B测试优化广告效果!

随着社交媒体广告的普及,Facebook已经成为了许多公司推广业务的重要平台。但是,在Facebook上发布广告并不意味着成功,这也让许多公司开始关注如何优化广告效果。 在这篇文章中,我将介绍如何使用A/B测试来优化Facebook广告&#x…

纳米软件关于集成电路测试的分类介绍

集成电路测试可以按照测试目的、测试内容、按照器件开发和制造阶段分类。参照需要达到的测试目的对集成电路测试进行分类,可以分为:验证测试、制造测试、老化测试、入厂测试等。按照测试所涉及内容,集成电路测试可分为:参数测试、功能测试、结构测试等。…

2023/4/4总结

题解: Problem ​​​​​​ A - Codeforces 1.这道题目我们需要判断。 2.如果是奇数,亦或出来的总值不为0,那么每一个数字再去亦或任何一个数字,都不会为0。 3.如果是偶数并且亦或总值为0,那么我们亦或的总值不满…

记录重启csdn

有太多收藏的链接落灰了,在此重启~ 1、社会 https://mp.weixin.qq.com/s/Uq0koAbMUk8OFZg2nCg_fg https://mp.weixin.qq.com/s/yCtLdEWSKVVAKhvLHxjeig https://zhuanlan.zhihu.com/p/569162335?utm_mediumsocial&utm_oi938179755602853888&ut…

使用npm包,全局共享数据,分包

使用 npm 包 1、Vant Weapp 1.1、什么是 Vant Weapp Vant Weapp 是有赞前端团队开源的一套小程序 UI 组件库,助力开发者快速搭建小程序应用。它所使用的是MIT 开源许可协议,对商业使用比较友好。 官方文档地址 https://youzan.github.io/vant-weapp …

Huggingface微调BART的代码示例:WMT16数据集训练新的标记进行翻译

BART模型是用来预训练seq-to-seq模型的降噪自动编码器(autoencoder)。它是一个序列到序列的模型,具有对损坏文本的双向编码器和一个从左到右的自回归解码器,所以它可以完美的执行翻译任务。 如果你想在翻译任务上测试一个新的体系…

游戏运营专员的职责有哪些?提高游戏收入的关键是什么?

游戏运营是将一款游戏平台推入市场,通过对平台的运作,使用户从接触、认识、再到了解实际线上的一种操作、最终成为这款游戏平台的忠实玩家的这一过程。同时通过一系列的营销手段达到提高线上人数,刺激消费增长利润的目的。 游戏运营专员的职…

Go 连接池的设计与实现

为什么需要连接池 如果不用连接池,而是每次请求都创建一个连接是比较昂贵的,因此需要完成3次tcp握手 同时在高并发场景下,由于没有连接池的最大连接数限制,可以创建无数个连接,耗尽文件描述符 连接池就是为了复用这…

高效的实现金蝶云星空ERP与自研MES系统数据集成

一、项目背景 随着企业数字化转型的不断深入,数据集成变得愈发重要。金蝶云星空ERP与自研MES系统之间的数据集成是企业提高管理效率、降低运营成本的关键。为了实现这一目标,企业选择了轻易云数据集成平台进行数据集成。 二、项目实施过程 低耦合、高内…

二叉树的前序遍历(力扣144)

目录 题目描述: 解法一:递归法 解法二:迭代法 解法三:Morris 遍历 二叉树的前序遍历 题目描述: 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root […

Unity反编译:AssetStudio资源浏览器及代码查看器

前言 假如你手上有Unity发布出来的exe文件、apk文件或者webGL文件,但就是没有工程源文件,那么,如何从这些文件里面一窥究竟呢?这就需要资源提取工具以及代码反编译工具! 本文所涉软件【文中附有下载链接】&#xff1…