当前位置: 首页 > news >正文

K210(openMV)与STM32 通信教程

目录

前言:

一、K210 串口部分教程

二、STM32部分


前言:

       很多打比赛的同学,通常只是用K210 或者openMV来进行视觉部分的信息采集,传输数据给STM32(或者其他主控那边)进行对分析,对小车或者舵机等其他模块进行相对应控制,比较少的同学是K210 当成一块开发板使用(因为它也有很多外设),那么此篇文章就讲述如何进行K210 与STM32 进行通信(openMV也是一样)

一、K210 串口部分教程

 经过资料找到Maix bit(K210)有3个串口,而且引脚不是固定的,可以根据自己对板子资源的利用,对引脚进行合理的分配,对引脚进行重映射,配置我们想要的引脚为TX、RX。

下面是引脚配置以及串口初始化

from machine import UART
from fpioa_manager import fmfm.register(6, fm.fpioa.UART1_TX, force=True)
fm.register(7, fm.fpioa.UART1_RX, force=True)
uart = UART(UART.UART1, 115200, 8, 0, 0, timeout=1000, read_buf_len=4096)

代码解析:

from machine import UART

 从 machine 模块导入 UART 类。这个类提供了串行通信的功能。

 

from fpioa_manager import fm

从 fpioa_manager 模块导入 fm 对象。fpioa_manager 是用于管理 FPIOA(Field Programmable Input/Output Array)的模块,它允许你将特定的功能映射到 GPIO(通用输入输出)引脚上。

fm.register(6, fm.fpioa.UART1_TX, force=True)


这行代码将 GPIO 引脚编号 6 映射为 UART1 的发送(TX)引脚。force=True 参数表示强制覆盖之前的映射设置。

fm.register(7, fm.fpioa.UART1_RX, force=True)

这行代码将 GPIO 引脚编号 7 映射为 UART1 的接收(RX)引脚。同样,force=True 参数表示强制覆盖之前的映射设置。

uart = UART(UART.UART1, 115200, 8, 0, 0, timeout=1000, read_buf_len=4096)

创建一个 UART 实例,用于初始化 UART 通信。
UART.UART1:指定使用 UART1。
115200:设置波特率为 115200,这是数据传输的速率,单位是比特每秒。
8:设置数据位为 8 位。
0:设置停止位为 1 位(因为传入的是 0,这里可能是一个错误,通常停止位应该是 1)。
0:设置无奇偶校验位。
timeout=1000:设置超时时间为 1000 毫秒,这意味着如果在这段时间内没有接收到数据,UART 将停止等待。
read_buf_len=4096:设置接收缓冲区的长度为 4096 字节,这是 UART 可以存储的接收数据的最大量。

K210 串口发送数据

uart.write(write_str)

 uart:串口初始化赋值的对象

 write_str:想要发送的数据

数据类型可以是:

1.字符串(str):Python 中的字符串可以被编码成字节序列,然后通过 UART 发送。通常使用 UTF-8 编码,但也可以指定其他编码方式。
2.字节序列(bytes 或 bytearray):这些是已经编码的字节序列,可以直接发送。
3.数字(int 或 float):数字需要先被转换为字节序列。通常使用 struct 模块来打包数字,因为不同的系统可能有不同的字节序(大端或小端)。
4.结构化数据:可以使用 struct 模块将复杂的数据结构打包成字节序列,然后再发送。

 例如:发送一个'utf-8'类型的字符串

uart.write(write_str.encode('utf-8'))  # 使用 UTF-8 编码字符串

串口接收数据:

data = uart.read(2)

 这句话就是串口接收2个数据,通常可以拿来判断并执行指定功能;如下:

data = uart.read(2)if data!=None:if data == b'A':save = 0  #不存到SD卡中elif data == b'B':save = 1  #存到SD卡中

read_str = read_data.decode('utf-8')

 这句话就是串口接收'utf-8'类型的字符串

那么,在知道怎么发送数据的函数,现在就是要使用K210 发送数据给STM32 那边

要使用uart.write() 函数吗,NO!有更好的方法,就是将数据打包发送,不然用uart.write()一个一个发太麻烦了

那么怎么发送数据包呢?

首先导入ustruct库

import ustruct

 打包函数:

ustruct.pack

ustruct.pack 函数用于将 Python 数据类型打包成字节流。这在需要通过串行通信发送二进制数据时非常有用。ustruct 模块提供了与 C 语言中的 struct 类似的功能,允许你指定数据的格式并将其打包成二进制形式。如下:

data1 = ustruct.pack("<bBBBb", 0xFF,0XAA,0xBB,0XCC,0xFE)
uart.write(data1)

 功能:打包5个char(B)类型(类型可以自己决定)的数据赋值给data1 ,并发送出去,通常可以把0XFF、0XFE作为包头包尾在STM32进行接收开始和完成判断,中间3个数据(0XAA,BB,CC----随便写的)就是我们要发送stm32的数据(至于是什么数据就是自己更改,个数也可以是改"<BBBBBB(改这里,几个数据就再加几个B))

B、b代表数据类型,还有下面其他类型:

b:有符号字节(char)
B:无符号字节(unsigned char)
h:有符号短整型(short)
H:无符号短整型(unsigned short)
i:有符号整型(int)
I:无符号整型(unsigned int)
l:有符号长整型(long)
L:无符号长整型(unsigned long)
q:有符号长整型(long long)
Q:无符号长整型(unsigned long long)
f:单精度浮点数(float)
d:双精度浮点数(double)

最后:K210 代码串口发送数据部分就是怎样打包一起发送给STM32那边

二、STM32部分

 代码接收部分展示:

uint8_t Serial_RxPacket[3];       //数据包长度3,只存发送或接受的载荷数据,不存包头包尾
unsigned char K210_data[3];
void USART2_IRQHandler(void)
{u8 Res;static uint8_t RxState = 0;//静态变量只能在本函数使用static uint8_t pRxPacket = 0;if (USART_GetITStatus(USART2, USART_IT_RXNE) == SET){Res =USART_ReceiveData(USART2);//(USART1->DR);	//读取接收到的数据if (RxState == 0)//矩形包头{if (Res == 0xFF){RxState = 1;pRxPacket = 0;}		}else if (RxState == 1)//矩形数据{Serial_RxPacket[pRxPacket] = Res;pRxPacket ++;if (pRxPacket >= 3){RxState = 2;}}else if (RxState == 2)//矩形数据  包尾{if (Res == 0xFE)//说明收到包头{//LED0 = !LED0;K210_data[0] = Serial_RxPacket[0];K210_data[1] = Serial_RxPacket[1];	K210_data[2] = Serial_RxPacket[2];	}else//接收错误,全部清0{Serial_RxPacket[0]=0;Serial_RxPacket[1]=0;	Serial_RxPacket[2]=0;	RxState = 0;						}}USART_ClearITPendingBit(USART2, USART_IT_RXNE);//清除标志位		}
}

 解释:使用状态机方法对包头0XFF和包尾0XFE进行判断,说明K210 那边发来数据了,使用STM32定义的变量char K210_data[3]将数据存储下来,用来STM32这边数据分析,然后实现指定功能操作。

 总结:以上就是K210 与STM32 串口通信的教程,不理解的欢迎评论区讨论

相关文章:

K210(openMV)与STM32 通信教程

目录 前言&#xff1a; 一、K210 串口部分教程 二、STM32部分 前言&#xff1a; 很多打比赛的同学&#xff0c;通常只是用K210 或者openMV来进行视觉部分的信息采集&#xff0c;传输数据给STM32&#xff08;或者其他主控那边&#xff09;进行对分析&#xff0c;对小车或者舵…...

【HarmonyOS】HMRouter使用详解(三)生命周期

生命周期&#xff08;Lifecycle&#xff09; 使用HMRouter的页面跳转时&#xff0c;想实现和Navigation一样的生命周期时&#xff0c;需要通过新建生命周期类来实现对页面对某一个生命周期的监控。 新建Lifecycle类 通过继承IHMLifecycle接口实现生命周期接口的方法重写。 通过…...

Docker 教程三 (Ubuntu Docker安装)

Ubuntu Docker 安装 Docker Engine-Community 支持以下的 Ubuntu 版本&#xff1a; Xenial 16.04 (LTS)Bionic 18.04 (LTS)Cosmic 18.10Disco 19.04 其他更新的版本…… Docker Engine - Community 支持上 x86_64&#xff08;或 amd64&#xff09;armhf&#xff0c;arm64&am…...

Redis:持久化

Redis&#xff1a;持久化 持久化RDBdump.rdb优缺点 AOF文件同步重写机制 混合持久化 持久化 虽然Redis是一个内存级别的数据库&#xff0c;但是Redis也是有持久化的能力的。当系统崩溃时&#xff0c;Redis就会被强制退出&#xff0c;此时内存中的数据就会丢失。为了能够在下次…...

精准监控,高效运营 —— 商品信息实时分析为商家带来新机遇

在现代商业环境中&#xff0c;精准监控和高效运营是商家成功的关键。通过实时分析商品信息&#xff0c;商家可以洞察市场趋势、优化库存管理、提升销售策略&#xff0c;从而抓住新的商业机遇。本文将介绍如何利用Python和一些流行的数据分析工具来实现商品信息的实时分析&#…...

Nginx应用配置实战

Nginx通用部署 Nginx常见参数介绍 Nginx 配置文件中的指令和参数决定了它的行为。下面详细介绍一些常见的 Nginx 参数&#xff0c;以帮助你更好地理解和配置 Nginx。 1. worker_processes worker_processes auto;作用&#xff1a;设置 Nginx 处理请求的工作进程数量。auto …...

html实现倒计时

参考网址 <!DOCTYPE html> <html> <head><title>倒计时示例</title> </head> <body><h1 id"titleCountDown"></h1><div id"countdown"></div><script>// 目标日期var targetDat…...

HTMLCSS练习

1) 效果如下 2) 代码如下 2.1) HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" conte…...

LeetCode讲解篇之377. 组合总和 Ⅳ

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 总和为target的元素组合个数 可以由 总和为target - nums[j]的元素组合个数 转换而来&#xff0c;其中j为nums所有元素的下标 而总和target - nums[j]的元素组合个数 可以由 总和为target - nums[j] - nums[k]的…...

Midjourney中文版:创意无限,艺术之旅由此启程

Midjourney中文版——一个将你的文字想象转化为视觉艺术的神奇平台。无需繁琐的绘画技巧&#xff0c;只需简单的文字描述&#xff0c;你就能开启一场前所未有的艺术之旅。 Midjourney AI超强绘画 (原生态系统&#xff09;用户端&#xff1a;Ai Loadinghttps://www.mjdiscord.c…...

安装R和RStudio:开始你的数据分析之旅

数据分析是当今世界中一个非常热门的领域&#xff0c;而R语言是进行数据分析的强大工具之一。R是一种编程语言和软件环境&#xff0c;用于统计计算和图形表示。RStudio是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;它为R语言提供了一个更加友好和高效的工作环境。…...

如何使用python连接数据库?

数据分析离不开数据库&#xff0c;如何使用python连接数据库呢&#xff1f;听我娓娓道来哈 该笔记参考了PyMySQL官方文档和《python数据采集》关于数据存储的部分&#xff0c;欢迎大家去阅读原著&#xff0c;相信会理解的更加透彻。 补充&#xff1a;文末增加Oracle数据库的连…...

停车位识别数据集 图片数量12416张YOLO,xml和txt标签都有; 2类类别:space-empty,space-occupied;

YOLO停车位识别 图片数量12416张&#xff0c;xml和txt标签都有&#xff1b; 2类类别&#xff1a;space-empty&#xff0c;space-occupied&#xff1b; 用于yolo&#xff0c;Python&#xff0c;目标检测&#xff0c;机器学习&#xff0c;人工智能&#xff0c;深度学习&#xff0…...

MySQL 创建子账号

1. 使用 root 账号登录 MySQL 使用 root 账号登录 MySQL&#xff0c;登录成功如图所示&#xff1a; 新建一个 MySQL 子账号&#xff0c;新建子账号命令如下&#xff1a; 命令 : CREATE USER testlocalhost IDENTIFIED BY 123456;若出现如下图所示&#xff0c;则表示新建 MySQL…...

代码随想录 106. 岛屿的周长

106. 岛屿的周长 #include<bits/stdc.h> using namespace std;int main(){int n, m;cin >> n >> m;vector<vector<int>> mp(n, vector<int>(m, 0));for (int i 0; i < n; i){for (int j 0; j < m; j){cin >> mp[i][j];}}in…...

阿里云融合认证中的App端一键登录能力

在如今的移动互联网环境中&#xff0c;App端的一键登录功能逐渐成为提升用户体验的关键。用户不再需要繁琐的注册流程或输入短信验证码&#xff0c;一键即可通过手机号码完成登录。而阿里云融合认证中&#xff0c;一键登录能力为移动应用提供了一个简单、便捷且安全的用户身份验…...

基于YOLO11/v10/v8/v5深度学习的安检X光危险品检测与识别系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…...

vue-插槽作用域实用场景

vue-插槽作用域实用场景 1.插槽1.1 自定义列表渲染1.2 数据表格组件1.3 树形组件1.4 表单验证组件1.5 无限滚动组件 1.插槽 插槽感觉知道有这个东西&#xff0c;但是挺少用过的&#xff0c;每次看到基本都会再去看一遍用法和概念。但是在项目里&#xff0c;自己还是没有用到过…...

Prometheus+Grafana 监控 K8S Ingress-Ningx Controller

文章目录 一、prometheus中添加ingress-nginx的服务发现配置二、ingress-nginx controller的service添加端口暴露监控指标三、grafana添加ingress-nginx controller的监控模版 ingress-nginx默认是没有开启监控指标的&#xff0c;需要我们在ingress-nginx controller的svc里面开…...

如何在Visual Studio 2019中创建.Net Core WPF工程

如何在Visual Studio 2019中创建.Net Core WPF工程 打开Visual Studio 2019&#xff0c;选择Create a new project 选择WPF App(.Net Core) 输入项目名称和位置&#xff0c;单击Create 这样我们就创建好了一个WPF工程 工程文件说明 Dependencies 当前项目所使用的依赖库&…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

动态规划-1035.不相交的线-力扣(LeetCode)

一、题目解析 光看题目要求和例图&#xff0c;感觉这题好麻烦&#xff0c;直线不能相交啊&#xff0c;每个数字只属于一条连线啊等等&#xff0c;但我们结合题目所给的信息和例图的内容&#xff0c;这不就是最长公共子序列吗&#xff1f;&#xff0c;我们把最长公共子序列连线起…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…...

2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】

1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…...

JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除

目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作&#xf…...

在MobaXterm 打开图形工具firefox

目录 1.安装 X 服务器软件 2.服务器端配置 3.客户端配置 4.安装并打开 Firefox 1.安装 X 服务器软件 Centos系统 # CentOS/RHEL 7 及之前&#xff08;YUM&#xff09; sudo yum install xorg-x11-server-Xorg xorg-x11-xinit xorg-x11-utils mesa-libEGL mesa-libGL mesa-…...