OpenMV与STM32单片机串口通信,如何使用openmv连续发送多帧数据给单片机

2023-05-16

首先,我使用STM 32单片机有2 年左右的时间了,但是openmv却不足一个月的时间,由于近几天问我关于两者之间如何进行通讯问题的人比较多,所以特地写这样一篇文章进行讲解。如果有什么讲的不对的地方,还请各位读者指正。

在开始的时候,我们得必须明白一件事,我们要干什么。我们先来梳理一下任务。

openmv与单片机通讯,大多数时候都不是只发送一两个字符或数字,一般都需要进行大量数据传输,将识别到的图像,位置,颜色信息通过转换为数字的方式发送给单片机。既然是很多数字,那么如何才能使数字能准确的传输而不发生错误和“错位”呢?我想,将数据以帧格式进行发送,是一种非常不错的选择。简单的说一下帧格式备用:

百度的解释太过于复杂,一般 我们常用到的帧格式为:

帧头+帧头+数据类型+数据量+数据....+校验和+结束标志。就像这样:

5A 5A 01  08 FF DD 00 1B 40 12 00 00  54 C0     (随意编的,不一定对)。需要说明的是,一帧数据不一定需要这里面的所以东西,最简单的一帧可以只有帧头和数据构成,就变成了这样:5A 5A  FF DD 00 1B 40 12 00 00。数据总不能省略吧。帧头也是不能省略的,如果没有帧头,那怎么能在一大串连续的数据中分辨出数据的开始呢,而且经验告诉我,用两个Byte的帧头很有必要的。接下来我就以最简单的方式来讲解如何发送一帧数据给单片机,大家后期可以根据自己的需求在添加上需要的帧段。

openmv如何配置串口,并且利用串口助手发送单个字符串给电脑相信大家都已经实现,网上教程也很多,这里就不再讲解。

openmv的一个while(true)循环,一般产生一帧数据

就像这样:这是一个颜色识别并输出色块中心点坐标的程序

# Untitled - By: 小柱 - 周三 4月 17 2019

import sensor, image, time
from pyb import UART
import json

threshold = [(37, 67, 45, 84, 4, 68),         #red
             (34, 67, -55, -22, 2, 41),      #green
             (25, 67, -37, 26, -63, -26)]    #blue
#设置红色的阈值,括号里面的数值分别是L A B 的最大值和最小值(minL, maxL, minA,
# maxA, minB, maxB),LAB的值在图像左侧三个坐标图中选取。如果是灰度图,则只需
#设置(min, max)两个数字即可。

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000 )
sensor.set_auto_whitebal(False)
#关闭白平衡。白平衡是默认开启的,在颜色识别中,需要关闭白平衡。

clock = time.clock()

uart = UART(3, 115200)

uart.init(115200, bits=8, parity=None, stop=1)  #8位数据位,无校验位,1位停止位、

while(True):
    clock.tick()
    img = sensor.snapshot()
    blob = img.find_blobs(threshold, area_threshold=300)
    if blob: #如果找到了目标颜色
       # print(blob)
       # uart.write("B3 B3 ")    #一帧数据的帧头
        FH = bytearray([0xb3,0xb3])
        uart.write(FH)
        for b in blob:
        #迭代找到的目标颜色区域
            img.draw_rectangle(b[0:4]) # rect
            img.draw_cross(b[5], b[6]) # cx, cy
            x = b.cx()
            y = b.cy()

            print(x, y, end = ',')

            data = bytearray([x,y])
            uart.write(data)
            #uart.write("%x %x \r"%(x,y))   #以16进制的格式输出,(16进制不能这样输出啊,浪费了我两天的时间)

    #img.draw_circle((50, 50, 30), color = (250, 0, 0))


    print(clock.fps())

我们主要看while(true)。其中,uart.write(FH)输出的是帧头,uart.write(data)输出的是色块坐标位置信息。

          简单分析一下,while(true)是一个大循环,通常情况下,一个大循环才能完成一轮识别,产生一帧数据(这当然取决于你的代码怎么写)。所以会在识别到摄像头识别到颜色(if blob)后首先发送出帧头 0xb3 ,0xb3。然后进入for循环(for b in blob)当for循环完的时候,一帧数据中完整的数据量就产生了。这样就在openmv当中产生了完整的一帧数据,利用串口助手可以观察到

这就是在串口助手中看到的数据内容

 

特别注意:!!!!

一帧数据的每一个Byte必须要以字节的显示发送(data = bytearray([x,y])),而不能是用16进制发送(uart.write("%x %x \r"%(x,y))),他们两个函数在串口助手里面看到的内容是一样的(大小写的区别),但是后者是无法让单片机接收到的。如果采用后者发送方式,就会出现openmv和单片机分别于PC通讯没问题,但是二者之间却无法通讯的问题,我也是在这里浪费了很多的时间,希望读者特别小心这个问题。

再一个,以上程序数据不一定是6个!!!,当只识别到一个或者两个色块时,就只产生两个或者四个数据!!!!

 

现在openmv能产生一帧有效数据了。STM32该如何接收到呢?由于stm32串口接收是以中断的方式。

void USART2_IRQHandler(void)
{
	
	static uint8_t rebuf[8]={0},i=0;
	
	if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)
	{
		rebuf[i++]=USART_ReceiveData(USART2);	
		if(rebuf[0]!=0xb3)//帧头
			i=0;
	  if((i==2)&&(rebuf[1]!=0xb3))//判断帧头
			i=0;
		if(i>=7)//代表一帧数据完毕
		{
			memcpy(OpenMV_Rx_BUF,rebuf,i);
			
			i = 0;

		}
		USART_ClearFlag(USART2,USART_FLAG_RXNE);
	}	
}

其中OpenMV_Rx_BUF是一个外部变量用于保存从openmv接收到的数据,中断子程序中,每当进入中断,会首先判断帧头,如果不是 帧头,会直接丢弃,直到等到帧头的到来。

值得注意的是,中断子程序每进入一次,只会接收一个Byte的数据。也就是说接收完一帧数据需要进入8次中断才行。这一点的理解也比较重要,需要多多体会才行。

当数据保存在OpenMV_Rx_BUF[]后,就可以调用来使用了(注意数据不一定是完整的)使用时最好加以判断。

void Color_Blob_Show(void)
{
	OLED_ShowNum(0,6,OpenMV_Rx_BUF[0],3,12);
	
	OLED_ShowNum(20,6,OpenMV_Rx_BUF[1],3,12);
	OLED_ShowNum(40,6,OpenMV_Rx_BUF[2],3,12);
	OLED_ShowNum(60,6,OpenMV_Rx_BUF[3],3,12);
	
}

显示图像

 

这样,一帧数据的发送和接受就完成了。

最后我要特别感谢CSDN,给了我一个学习的平台,在这里我学习到了很多知识,解决了我很多问题,感谢各位前辈的无私奉献。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenMV与STM32单片机串口通信,如何使用openmv连续发送多帧数据给单片机 的相关文章

  • px4ctrl代码解读-calculateControl()

    compute u thrust and u q controller gains and other parameters are in param quadrotor msgs Px4ctrlDebug LinearControl ca
  • linux系统启动过程(面试热点)

    linux系统启动过程 启动过程总览1 内核的引导2 运行init3 系统初始化4 建立终端5 用户登录系统6 进入login shell 启动过程总览 1 内核的引导 当计算机打开电源后 xff0c 首先是BIOS开机自检 xff0c 按
  • ZYNQ图像处理(4)——灰度图像转二值化图像

    1 二值化图像简介 前面已经完成了摄像头图像的采集和显示 xff0c 以及RGB图像转灰度图 二值化图像在图像处理领域同样有广泛的应用 xff0c 本节介绍如何用FPGA实现灰度转二值化图形 灰度实现二值化的原理很简单 xff0c 只需要设
  • Axios和Ajax处理后台返回文件流实现文件下载(图片和Excel)

    Axios 定义公共方法 xff0c 下载Excel download url data fileName return axios method 39 post 39 url headers里面设置token headers 34 tok
  • c++每日十题10.18

    1 将两个字符串连接起来组成一个字符串时 xff0c 选用 xff08 xff09 函数 正确答案 C 你的答案 C 正确 A strlen B strcap C strcat D strcmp strlen 测字符串长度 strcap复制
  • 人脸识别算法原理过程详解

    本文为转载内容 xff0c 由于找不到源作者链接 xff0c 故特此说明 人脸识别各算法详解 最近 xff0c 由于工作需要 xff0c 为了找到一款高效的人脸识别算法 xff0c 对各种人脸识别算法都研究了一番 xff0c 以下记录的是各
  • ERROR: Could not build wheels for cryptography which use PEP 517 and cannot be installed directly

    Note When installing in a non Anaconda environment make sure to install the Protobuf compiler before running the pip ins
  • Jetson Nano 关闭开启图形界面减少内存占用

    如果希望一直保持桌面关闭 xff0c 则可以使用下述命令 xff0c 然后 xff0c 重新启动后 xff0c 桌面将保持禁用或启用状态 xff1a ubuntu关闭图形用户界面 sudo systemctl set default mul
  • python程序docker化部署

    启动docker systemctl start docker 启动docker systemctl enable docker 设置开机自启动docker systemctl status docker 查看docker状态 步骤 xff
  • 嵌入式(一)——MPU9250九轴学习

    加速度计对四轴或小车的加速度比较敏感 xff0c 取瞬时值计算倾角误差比较大 xff1b 而陀螺仪积分得到的角度不受小车加速的的影响 xff0c 但是随着时间的增加积分漂移和温度漂移带来的误差比较大 xff0c 所以这两个传感器正好可以弥补
  • jetson nano Docker化部署

    Docker安装 1 安装docker https docs docker com engine install ubuntu sudo apt get update sudo apt get install apt transport h
  • 钢筋盘点计数数据集图片展示

    数据集分为训练集和测试集 xff0c 其中训练集共有569张已标注图片 xff0c 测试集共有85张未标注图片 xff0c 共计654张 其图片质量与标注质量满足工业化生产实际需要 xff0c 质量保障 有需要的可以到我的资源中进行下载 x
  • Windows下使用pip安装包 出错 TLS/SSL

    Windows下使用pip安装包的时候出现如下问题 xff1a WARNING pip is configured with locations that require TLS SSL however the ssl module in
  • opencv模板匹配步骤及Code

    opencv模板匹配步骤及Code 首先介绍一下模板匹配的适用场景 xff1a 1 图像检索 2 目标跟踪 简单的说 xff0c 模板匹配最主要的功能就是在一幅图像中去寻找和另一幅模板图像中相似度最高的部分 xff0c 这就是模板匹配 比如
  • Tensorflow简单项目讲解

    Tensorflow简单项目讲解 转载请注明出处 xff1a https blog csdn net qq 41007606 article details 81906486 这里对Tensorflow就不在做具体介绍了 xff0c 直接切
  • Keras Model模型方法

    Model模型方法 compile compile self optimizer loss metrics 61 None loss weights 61 None sample weight mode 61 None weighted m
  • 关于Keras的“层”(Layer)——常用层

    所有的Keras层对象都有如下方法 xff1a layer get weights xff1a 返回层的权重 xff08 numpy array xff09 layer set weights weights xff1a 从numpy ar
  • Centos7 glibc库升级到2.23(实测可行)

    注意 xff1a Centos 为了稳定使用的glibc版本通常比较低 而安装有些程序需要依赖新版本 升级glibc需要慎重 xff0c 因很多人升级失败后导致系统不能用了 本人亲测 xff0c 升级了多台机器 xff0c 全部升级成功 g
  • [linux]wsl环境挂载window共享文件

    场景 xff1a 公司有一台内网的机器用来共享文件 xff0c 这里面的磁盘都是T级以上 xff0c 平时大家都是把文件存储到这台电脑上 xff0c 确保公司的资源安全 如果要用脚本来处理文件 xff0c 就需要挂载到内网的linux服务器
  • 最简单C/C++数据可视化函数库MathGL配置方法

    1 简介 xff1a MathGL是一个可用于C C 43 43 数据可视化的函数库 xff0c 可以对不同种类的数据进行可视化 由于MathGL本身不具有显示功能 xff0c 需要配合opencv以及其他可视化工具才能够显示图形 由于目前

随机推荐

  • 数学建模系列-优化模型---(一)规划模型

    数学建模中我们经常遇到的一种问题是给定一些条件 xff0c 目标是求得基于单或者多自变量的某个条件之的最优结果 一 线性规划模型 给定多个条件 xff0c 求某一个线性方程的最大值 xff08 对与这种问题 xff0c 我们一般采用的是最普
  • Linux----网络编程(相关名词概念)

    网络编程即编写通过计算机网络与其他程序进行通信的这类程序 相互通信的网络程序中 xff0c 一方称为客户程序 xff08 client xff09 xff0c 另一方称为服务器程序 server 计算机网络 xff08 简称网络 xff09
  • Python 列表参数 修改与赋值 对外部变量的影响

    两个函数 def test1 alist 对参数列表进行修改 alist 0 61 233 alist append 33 def test2 alist 对参数列表进行赋值 alist 61 9 5 1 10 调用结果 alist 61
  • APM配置

    开源飞控apm配置研究 项目介绍引言配置之前的文件准备我的配置过程配置文件链接小结 项目介绍 项目 xff1a 自动驾驶无人船 是老师的一个课题 xff0c 我们负责控制算法相关 当然 xff0c 也免不了要搬砖 做之前老师说 xff0c
  • python opencv实践 图像去畸变

    目录 前言镜头成像畸变原因去畸变方法python去畸变输入代码结果 前言 由于相机的镜头并不完全理想 xff0c 成像时会产生线条扭曲 失真等 对双目图像 鸟瞰图等进行处理时 xff0c 首先要矫正去畸变 镜头成像畸变原因 相机的镜头前有一
  • 通过直链下载google网盘里的文件

    目录 前言通过直链云下载保存在google drive的datasets 前言 科研学习的时候 xff0c 很多数据集是保存在google drive上的 xff0c 正常情况下国内打不开 xff0c 也就下载不了 于是我翻到了一个解决方法
  • 机器人建图算法2.1从栅格占据地图到ESDF地图

    机器人建图算法2 1从栅格占据地图到ESDF地图 前言论文解读示意图说明伪代码说明算法流程 总结 前言 最基础的地图是占据栅格地图Occupancy map xff0c 每个格子标明了该位置是否被物体占据 然而对于规划和避障而言 xff0c
  • 控制算法学习 一、卡尔曼滤波(1)以小车为例

    控制算法学习 一 卡尔曼滤波 xff08 1 xff09 以小车为例 前言线性系统状态方程和观测方程举例 卡尔曼滤波状态预测状态更新 卡尔曼滤波流程图 前言 卡尔曼滤波 xff08 Kalman Filter KF xff09 是最经典的传
  • ROS python3使用cv_bridge报错,在melodic中使用python3 cv_bridge

    ROS cv bridge报错 xff1a 在melodic中使用python3 43 cv bridge 问题描述解决方案使用方法2022 7补充 问题描述 ROS与opencv之间的数据类型转换是通过cv bridge这个包来实现的 m
  • 控制算法学习 四、扩展卡尔曼滤波EKF

    控制算法学习 四 扩展卡尔曼滤波EKF 前言非线性系统状态 观测方程线性化扩展卡尔曼滤波EKF后记 前言 经典卡尔曼滤波的使用场景是线性系统 xff0c 但现实应用时 xff0c 大多数系统都是非线性的 扩展卡尔曼滤波 xff08 Exte
  • ROS学习十、无人机通信模块mavros(1)常用的mavros消息类型

    ROS学习十 无人机通信模块mavros xff08 1 xff09 常用的mavros消息类型 前言数传全局位置IMU惯导本地位置飞控命令设置飞行位点 速度 加速度系统状态系统时间其它 前言 mavros用于无人机通信 xff0c 可以将
  • PX4FLOW--光流评价

    做了有三个月的光流 xff0c 进度很慢 过程如下 xff1a 1 从光流算法原理入手 xff1b 2 再了解PX4FLOW模块 xff1b 3 将相机曝光时间分三个等级保证输出频率在120HZ以上 xff1b 4 修改flow c部分源码
  • 视觉SLAM十四讲学习5 位姿估计(2)本质矩阵的计算

    视觉SLAM十四讲学习5 位姿估计 xff08 2 xff09 本质矩阵的计算 前言本质矩阵的性质本质矩阵计算五点法八点法 位姿计算对极几何计算本质矩阵的问题后记 前言 本篇详细推导对极几何中 xff0c 本质矩阵的计算 本质矩阵的性质 根
  • PX4Firmware源码下载和子模块更新

    PX4Firmware源码下载和子模块更新 前言修改git配置PX4Firmware下载更新 前言 PX4是无人机开源飞控 xff0c 但是其代码在github上 xff0c 经常下载不下来 xff1b 而且即使下载下来了 xff0c 更新
  • Gazebo安装与升级,gazebo: symbol lookup error

    Gazebo版本升级 前言Step 1 xff08 可选 xff09 Step 2Step 3报错 gazebo symbol lookup error 前言 现在将gazebo9 0升级到gazebo9 19 Step 1 xff08 可
  • CMakeLists学习一、find_package查找包

    CMakeLists学习一 find package查找包 前言引例环境变量find package查询路径设定查询路径默认路径 链接库问题find package 命令 前言 很久之前就想写关于CMakeLists相关的学习记录 xff0
  • 英伟达Jetson Nano 开发(1)、Jetpack镜像烧录,使用jtop,测试cuda并行,增加交换内存空间,SSH远程连接

    英伟达Jetson Nano 开发 xff08 1 xff09 Jetpack镜像烧录 xff0c 使用jtop xff0c 测试cuda并行 xff0c 增加交换内存空间 xff0c ssh远程连接 xff0c 激活Jupyterlab设
  • Python: 使用sphinx生成python项目文档

    Python 使用sphinx生成python项目文档 前言安装sphinx生成配置文件修改配置文件生成rst文件编译文档 前言 本篇记录使用sphinx生产成python项目文档的方法 安装sphinx 直接通过pip安装sphinx x
  • 相机的内参矩阵、外参矩阵、畸变矩阵(引博客)

    https www zhihu com question 29448299 answer 102658379 https blog csdn net qq 16481211 article details 79464786
  • OpenMV与STM32单片机串口通信,如何使用openmv连续发送多帧数据给单片机

    首先 xff0c 我使用STM 32单片机有2 年左右的时间了 xff0c 但是openmv却不足一个月的时间 xff0c 由于近几天问我关于两者之间如何进行通讯问题的人比较多 xff0c 所以特地写这样一篇文章进行讲解 如果有什么讲的不对