OpenMV与STM32之间的通信

2023-11-12

OpenMV与STM32之间使用串口进行通信。


OpenMV

详细解释可以看代码里面的注释。
注意:转换成字节型传输时,负数会以补码形式传输,比如:-1在单片机接受时变成255.

import sensor, image, time, math#调用声明
from pyb import UART #串口

uart = UART(3, 115200, timeout_char=1000)  # i使用给定波特率初始化
uart.init(115200, bits=8, parity=None, stop=1, timeout_char=1000)
#这一行一定要写!!
#设置帧头和帧尾,便于接受方接收数据
u_start=bytearray([0xb3,0xb3])
u_over=bytearray([0x0d,0x0a])

# Camera setup...
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # use grayscale.
sensor.set_framesize(sensor.QVGA) # use QQVGA for speed.
sensor.skip_frames(30) # Let new settings take affect.
sensor.set_auto_gain(False) # must be turned off for color tracking
sensor.set_auto_whitebal(False) # must be turned off for color tracking
#关闭白平衡
clock = time.clock() # Tracks FPS.


mark=([-1,-1],[-1,-1],[-1,-1])
while(True):
    times=0
    clock.tick() # Track elapsed milliseconds between snapshots().
    img = sensor.snapshot()# Take a picture and return the image.
    row_data=[0,0,0,0]
    #row_data里面存放需要返回的数据,长度可以根据需要调整
    #print(row_data)
    uart_buf = bytearray(row_data) #转换成字节型
    uart.write(u_start)	#先发帧头,再发数据,最后发帧尾
    uart.write(uart_buf)
    uart.write(u_over)
    #print(clock.fps())
   


STM32

先在项目中加入串口通信包,PA2为TXD,PA3为RXD。可以开一个串口通过串口助手打印接收到的数据。
注意:OpenMV的TXD和RXD口可以查看官网的手册,OpenMV的TXD接单片机RXD,OpenMV的RXD接单片机TXD。!!小心OpenMV给单片机反向供电,OpenMV通过数据线接电脑时务必把VCC线拔掉。!!注意共地,不然数据传不过去。
UART2.c

#include "sys.h"
#include "USART2.h"	
#include "stm32f4xx.h"

u8 USART2_RX_BUF[USART2_REC_LEN]; 
u16 USART2_RX_STA=0;   
void uart2_init(u32 bound){
   //GPIO????
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
 
	//??2????????
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); 
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
	GPIO_Init(GPIOA,&GPIO_InitStructure); //???

   //??2?????
	USART_InitStructure.USART_BaudRate = bound;//?????
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//???8?????
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//?????
	USART_InitStructure.USART_Parity = USART_Parity_No;//??????
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//????????
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//????
  USART_Init(USART2, &USART_InitStructure); //?????2
	
	//??2 NVIC ??
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//??2????
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//?????3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//????3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ????
	NVIC_Init(&NVIC_InitStructure);	//??????????VIC???

	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//??????
	USART_Cmd(USART2, ENABLE);  //????1
}

void USART2_IRQHandler(void)                	//??2??????
{
	u8 Res;
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //????(?????????0x0d  0x0a??)
	{
		Res =USART_ReceiveData(USART2);//(USART1->DR);	//????????
		
		if((USART2_RX_STA&0x8000)==0)//?????
		{
			if(USART2_RX_STA&0x4000)//????0x0d
			{
				if(Res!=0x0a)USART2_RX_STA=0;//????,????
				else USART2_RX_STA|=0x8000;	//?????
			}
			else //???0X0D
			{	
				if(Res==0x0d)USART2_RX_STA|=0x4000;
				else
				{
					USART2_RX_BUF[USART2_RX_STA&0X3FFF]=Res ;
					USART2_RX_STA++;
					if(USART2_RX_STA>(USART2_REC_LEN-1))USART2_RX_STA=0;//??????,??????
				}		 
			}
		}   		 
  } 
}

UART2.h

#ifndef __USART2_H
#define __USART2_H
#include "stdio.h"	
#include "stm32f4xx_conf.h"
#include "sys.h" 

#define USART2_REC_LEN  200 

extern u8  USART2_RX_BUF[USART2_REC_LEN]; 
extern u16 USART2_RX_STA; 
void uart2_init(u32 bound);

#endif

main.c

#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "initGPIO.h"
#include "USART2.h"	
#include "math.h"
#include "stdlib.h"
#define num_pul 1
#define move_time_ms 1
#define len_things 4
#define delay_time_ms 5
extern u16 TIM5_Flag;

 u8 row_data[200];//接受已经收到的数字;
 void get_data()//获得PA2、PA3传回的数据;
 {
		u8 t,n=0;
		u8 len=0;
	 if(USART2_RX_STA&0x8000)
		{					   
			len=USART2_RX_STA&0x3fff;
			for(t=0;t<len;t++)//检测到开头数字,并开始记录数据;
			{
				 if(USART2_RX_BUF[t]==0xb3)   
				 {
					 if(USART2_RX_BUF[t+1]==0xb3)
					 {
					    n=t+2;
						  break;
					 }
				 }
			}
			for(t=0;n<len;t++,n++)
			{
				row_data[t] = USART2_RX_BUF[n];	
        printf("row_data%d:%d  ",t+1,row_data[t]);		
			}
			printf("\r\n");
			USART2_RX_STA=0;
		}
 }

 int main(void)
{
	uart2_init(115200);
	uart_init(115200);
  while(1)
	{
		//后续操作
  }
}

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

OpenMV与STM32之间的通信 的相关文章

  • ChatGPT会取代互联网程序员吗?

    ChatGPT会取代互联网程序员吗 ChatGPT是一个基于GPT 3模型的自然语言对话系统 它可以与用户进行自然 流畅 智能的对话交互 回答用户的问题 提供用户所需的信息 甚至生成一些有趣和创意的内容 ChatGPT最近火爆全网 一时间C
  • Linux系统启动分析

    文章目录 大体流程分析 一 BIOS 1 1 BIOS简介 1 2 POST 二 BootLoader GRUB 2 1 What s MBR 2 2 What s GRUB 2 3 boot img 2 4 core img lzma d
  • 我花了一夜用数据结构给女朋友写个H5走迷宫游戏

    文章目录 起因 分析 画线 棋盘 画迷宫 方块移动 结语 先看效果图 在线电脑尝试地址http biggsai com maze html 起因 又到深夜了 我按照以往在公众号写着数据结构 这占用了我大量的时间 我的超越妹妹严重缺乏陪伴而
  • Vue-数据驱动视图(一)数据监听机制

    前言 Vue的一大特点就是数据双向绑定 当数据发生变化时 也可以同时触发界面的变化 即数据驱动视图 要想实现数据驱动视图 那么有这么几个步骤 1 收集我们需要监听的数据 并给他配置个监听器 当数据状态发生变化时触发监听器 然后判断是否需要重
  • Echarts地图自定义图标Symbol同时动态更改图标进行切换显示

    Echarts地图自定义图标Symbol同时动态更改图标进行切换显示 文章目录 0 前言 1 引用模块 2 界面设计 3 数据准备 4 实例地图 5 动态修改气泡图标 6 结束语 0 前言 实现的效果 实现广东显示地图 然后点击地图上的气泡
  • MATLAB数据曲线拟合

    MATLAB数据曲线拟合 数据拟合是我们常用的一种方法 可以通过一组离散的数据点来找到一个函数 使这个函数能够对数据进行预测和描绘 在MATLAB中实现数据拟合非常简单 而且MATLAB还提供了许多工具箱来帮助我们完成这项任务 下面我们将会

随机推荐

  • JAVA并发编程学习笔记10-volatile

    JAVA并发编程学习笔记10 volatile 概念 JMM JAVA内存模型 常见概念 可见性 指令重排序 happens before规则 synchronized volatile Thread start 方法 Thread int
  • 手把手使用Python教你破解谷歌(Google)人机验证码—上篇

    点击上方 Python爬虫与数据挖掘 进行关注 回复 书籍 即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 众里寻他千百度 蓦然回首 那人却在 灯火阑珊处 1 前言 今天呢 咱们来说一下Google 我们都知道 Google
  • 嵌入式习题

    2 STMF4 1 单选题 关于ARM的描述正确的是 D A 代表一家公司名字 B 代表一类处理器 B 代表一种技术 D 以上都正确 2 单选题 STM32F4与ARM的关系 正确的是 A A STM32F4采用ARM Cortex M4内
  • C#教程(6)———— 比较运算符与逻辑运算符

    C 教程 6 比较运算符与逻辑运算符 前言 1 比较运算符 1 1 不同数据类型之间比较 1 2 使用比较运算符比较字符类型 1 3 其它数据类型比较 2 逻辑运算符 总结 前言 在之前的文章中 我们介绍了各种数学运算该怎么进行 而在数学中
  • java.lang.IllegalArgumentException: parameter must be a descendant of this view 的解决方案

    异常出现情况 mLayoutMap为布局view的集合 如当前view为view1可见visible 正常情况view2 view3 view4 为不可见gone 当点击tab2 让view2显示 时抛出上面的异常 分析以及解决方案 par
  • 原型链解释

    一 什么是原型链 原型链是javascript中用来实现类似类继承的一套机制 像链条一样把javascript中的对象连接起来 实现类似子联系父的现象 二 原型链的实现 总的来说 就是 对象的 proto 指向其构造器的prototype对
  • ahx文件转mav文件 工具分享及说明

    前言 今天用ndstool 拆了个nds的游戏 提取音频资源时发现格式为ahx 查了查网上都没有转换资料 格式工厂也不支持此格式 于是在github上找到了个好工具 分享一下 根据 文件格式查询信息库 数据统计 AHX 文件扩展名相关的格式
  • Docker8_2:Docker volume容器数据卷挂载:具名挂载和匿名挂载

    Docker8 2 Docker volume容器数据卷挂载 具名挂载和匿名挂载 docker volume 匿名挂载 不常用 具名挂载 常用 三种挂载方式 docker volume docker volume相关命令 docker 卷操
  • Qt Installer Framework的学习

    Qt Installer Framework的学习 Qt Installer Framework是Qt默认包的发布框架 它很方便 使用静态编译Qt制作而成 并且使用了压缩率很高的7z对组件进行压缩 之所以有这些好处 我才觉得值得花一点儿精力
  • 包装类之Integer案例学习

    引入 首先标题我写了学习Integer作为案例 是因为了解了一个包装类 其他便能深入浅出的学习到了 1 什么是包装类 以前定义变量 经常使用基本数据类型 对于基本数据类型来说 它就是一个数 加点属性 加点方法 加点构造器 将基本数据类型对应
  • 「Python 机器学习」Pandas 数据分析

    Pandas 是一个开源的 Python 库 专为数据处理和分析任务而设计 它提供了高性能 易用的数据结构和数据分析工具 使得在 Python 中进行数据科学变得简单高效 Pandas 基于 NumPy 因此可以与许多其他基于 NumPy
  • 蓝桥杯VIP试题 基础练习 龟兔赛跑预测C语言,C++

    试题 基础练习 龟兔赛跑预测 资源限制 时间限制 1 0s 内存限制 512 0MB 问题描述 话说这个世界上有各种各样的兔子和乌龟 但是研究发现 所有的兔子和乌龟都有一个共同的特点 喜欢赛跑 于是世界上各个角落都不断在发生着乌龟和兔子的比
  • 推荐系统综述:初识推荐系统

    目录 1 引言 2 发展历史 3 研究现状 4 推荐方式和效果评估 4 1 评分预测 4 2 TopN推荐 5 推荐算法 5 1 基于用户行为推荐 5 1 1 基于用户的协同过滤 User Based CF 5 1 2 基于物品的协同过滤
  • c++11新特性-可变参数模板

    在c 11中声明可变函数模板需要typename或者class后面跟上 省略号有两个作用 1 声明一个参数包 这个参数包可以有0到任意个参数 2 在模板定义的右边 可以将参数包展开成一个一个独立的参数 可变函数模板的定义 template
  • JAVA安装详细教程

    JAVA安装详细教程 如果下面的博客没有能解决你的问题或者你还有其他关于计算机方面的问题需要咨询可以加博主QQ 1732501467 JAVA安装总共分为三部分 一 下载JAVA安装包并安装JAVA 二 电脑环境设置 三 验证Java是否安
  • spring核心框架体系结构(jar包依赖)

    很多人都在用spring开发java项目 但是配置maven依赖的时候并不能明确要配置哪些spring的jar 经常是胡乱添加一堆 编译或运行报错就继续配置jar依赖 导致spring依赖混乱 甚至下一次创建相同类型的工程时也不知道要配置哪
  • stm32c8t6-PWM控制SG90舵机及用串口下载程序

    舵机是用PWM波控制的 学完PWM就可以简单的控制舵机啦 我用的是stm32c8t6单片机 高级定时器TIM1 CH1 使用通用定时器也行 大同小异 结果都一样 定时器部分的知识 代码网上都有 我这里不再赘述 开始之前我们先了解一下舵机的特
  • 树莓派3B安装64位操作系统

    树莓派3B 安装Ubuntu MATE 树莓派3b 安装ubuntu 雨田大大的博客 CSDN博客https blog csdn net lsjackson13 article details 92423694 utm medium dis
  • python3.8 Crypto.Cipher报错快速解决办法

    python3 8 Crypto Cipher报错快速解决办法 使用大佬编译好的whl安装包 把python3安装目录Lib和Lib site packges下的crypto改成Crypto 再安装crypto pip3 install c
  • OpenMV与STM32之间的通信

    OpenMV与STM32之间使用串口进行通信 OpenMV 详细解释可以看代码里面的注释 注意 转换成字节型传输时 负数会以补码形式传输 比如 1在单片机接受时变成255 import sensor image time math 调用声明