OpenMV与STM32之间的通信

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

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文章来源地址https://www.toymoban.com/news/detail-579366.html

#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)
	{
		//后续操作
  }
}

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

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

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

相关文章

  • 关于openmv与stm32之间的串口通信实现

    已经在研一度过快3个月了,研究生学习跟本科学习还是有很大区别的,要善于自己找资料善于自己总结,因此我也决定从现在开始时不时的写写博客总结后面每段时间遇到的各种困难以及解决方法,为以后工作积累经验也方便以后查阅。 这是我第一篇博客,之前都是在做关

    2024年02月14日
    浏览(24)
  • openmv与stm32串口通信数据传输

    在openmv与stm32数据传输过程中遇到了奇怪的问题。 先说明我遇到的问题,后面又源码。 若发现问题-------或者有什么想法-------还望指教!!! 我的目的: openmv矩形识别,获取中心点坐标,通过串口发给stm32接受数据 我在main函数中,将存放的数据打印出来,然而并没有。如图

    2024年02月15日
    浏览(33)
  • stm32f103与openmv串口通信

    串口通信是指通过串行通信接口进行数据传输的一种通信方式。在串口通信中,数据被分成一个个的字节,按照一定的顺序依次发送和接收。串口通信通常使用UART(通用异步收发传输)协议进行数据传输。 串口通信在嵌入式系统中应用非常广泛,其主要用途包括: 调试和监

    2024年02月13日
    浏览(35)
  • 【嵌入式】openmv与stm32的串口通信

    参考:(文中部分图/文字/代码来自以下文章,部分内容由于时间久远已经找不到原作者,可联系注明或删除) PYTHON串口数据打包发送STM32接收数据解析 openmv中文文档 这里以openmv循迹代码为例 main.py 关于struct.pack: 函数原型:struct.pack(fmt, v1, v2, …) fmt是格式字符串 v1,v2是要转

    2024年02月14日
    浏览(31)
  • 两块stm32单片机串口通信讲解

    本篇文章记录了如何使用stm32f103zet6核心板(下位机)通过串口向stm32f103zet6学习板(上位机)发送数据,stm32f103zet6学习板完成接收,并将接收到的数据显示在LCD显示屏上。 正点原子精英STM32F103ZET6学习板一块(带2.8寸显示屏) STM32F103ZET6核心板一块 电源适配器、数据线以及杜

    2024年02月16日
    浏览(33)
  • Openmv识别Apriltag码并与stm32进行串口通信

            本文使用带有独立处理图像模块的摄像头Openmv进行Apriltag码的识别,并将Openmv与stm32进行串口通信,将Apriltag码的ID、中心位置相对于Openmv摄像头中心坐标的偏移量、以及Apriltag码相对于Openmv镜头的距离通过串口通信传输给stm32。         接线图Openmv通过电脑USB口

    2024年04月27日
    浏览(23)
  • 基于OpenMV与STM32的数据通信项目(代码开源)

    前言: 本文为手把手教学   OpenMV 与 STM32 的数据通信项目 教程,本教程使用  STM32F103C8T6 与 OpenMV 进行操作。 OpenMV 是非常强大的计算机视觉实现工具,自身提供了非常多的视觉项目案例,编程与使用门槛极低。为了进一步增强作品的功能与创意性,往往需要将 OpenMV 的视觉与

    2024年02月02日
    浏览(39)
  • 关于openmv与stm32通信数据传输遇到的问题

      遇到smt32与openmv无法通信,或者数据对不上。 上面的是openmv端发给stm32端的数据 %c4 b‘  ’:是stm32打印接收到的数据  逐个排查: openmv与pc端串口助手正常发收。stm32与pc端也可以正常发,但是接收数据的时候不能正常接收。 利用LED灯debug。   确定问题出在stm32端的中断服

    2024年02月15日
    浏览(21)
  • 【单片机】基于STM32的UART串口通信

    简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32CubeMX来配置芯片的一些操作。实验内容基于 正点原子精英板 开发板,单片机芯片为 STM32F103ZET6 。 在后面我会以我使用的STM32F429开发板来举例讲解(其他STM32系列芯片大多数都可以按照这些步骤来操作

    2024年01月17日
    浏览(56)
  • 学习记录之openmv和STM32F103的通信

    分上下位机,下位机向上位机发送数据。(上位机控制,下位机收集数据) 可能用到的函数: UART :通用异步 收/发器 USART :通用同步/异步 收/发器 USART_ init() 串口初始化:波特率、数据字长,奇偶校验,硬件流控及收发使能 USART_ Cmd 使能串口                             

    2024年02月14日
    浏览(27)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包