openmv和stm32串口通信完成二维码识别

openmv和stm32串口通信完成二维码识别


前言

注:我只是个大一的小白,本文只完成基本功能,希望能帮助有困惑的人(我也是刚刚走出谜团,大佬勿喷。)
工训赛期间,突击学习了二维码识别(基于openmv4)。openmv4通过串口通信加json与stm32f103完成通信,结果由stm32所连的lcd屏显示

一、所用的硬件:

openmv4、正点原子的mini板(stm32f103rct6)、正点原子配套的lcd屏。

二、openmv端

直接上代码:

代码如下(示例):

mport sensor, image, time
from pyb import UART

uart = UART(3, 115200)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA) # can be QVGA on M7...
sensor.skip_frames(30)
sensor.set_auto_gain(False) # must turn this off to prevent image washout...
while(True):
    img = sensor.snapshot()
    img.lens_corr(1.8) # strength of 1.8 is good for the 2.8mm lens.
    for code in img.find_qrcodes():
        print(code)
        FH= bytearray([0xb3,0xb3])
        uart.write(FH)
        uart.write(code.payload())
        FH = bytearray([0x0d,0x0a])
        uart.write(FH)
        time.sleep_ms(1000)

注:
1、openmv4的 p4为TX p5为RX。(不要接错线哦)
2、FH为帧头用于检验数据发送是否正确。(不懂的可以结合32端代码理解)
3、 code.payload()函数记录的二维码内的字符。
4、波特率设置为115200(要和32端保持一致)。
5、关于二维码识别的详细代码可以去openmv官网查找。

2.stm32端

main.c:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "lcd.h"


 int main(void)
 {		
 	u8 len;
	u8 t,n;
	u8 UsartDisPlay[200];
	uart_init(115200);
	 delay_init();
	 LCD_Init();
	POINT_COLOR=RED; 
while(1)
{
   if(USART_RX_STA&0x8000)
   {
       len=USART_RX_STA&0x3fff;
		 for(t=0;t<len;t++)
		  { if(USART_RX_BUF[t]==0xb3)
				 if(USART_RX_BUF[t]==0xb3) n=t+1;
			}
			for(t=0;n<len;t++,n++)
			{UsartDisPlay[t]=USART_RX_BUF[n];
				delay_ms(3000);
			 }
			USART_RX_STA=0;
    }
	 
LCD_ShowString(15,50,260,16,16,UsartDisPlay);
	
}	
	  

usart1配置:

void uart_init(u32 bound){
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
  
	//USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
   
  //USART1_RX	  GPIOA.10初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

	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(USART1, &USART_InitStructure); //初始化串口1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART1, ENABLE);                    //使能串口1 

}

中断函数:

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
		{
		Res =USART_ReceiveData(USART1);	//读取接收到的数据
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART_RX_STA&0x4000)//接收到了0x0d
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
				else USART_RX_STA|=0x8000;	//接收完成了 
				}
			else //还没收到0X0D
				{	
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
					{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
					}		 
				}
			}   		 
     } 

注:
1、PA9为TX,PA10为RX。
2、openmv和stm32一定要共接GND。


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总结

要源码的可以评论区留邮箱,本人刚入门,有错欢迎指正。

hi,这是我用百度网盘分享的内容~复制这段内容打开「百度网盘」APP即可获取
链接:https://pan.baidu.com/s/1V7UudQBo1524rFaDENnd2A?pwd=p16x
提取码:p16x
源码来了,不一一回复了

版权声明:本文为CSDN博主「云中落羽」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_51621579/article/details/115057847

openmv和stm32串口通信完成二维码识别


前言

注:我只是个大一的小白,本文只完成基本功能,希望能帮助有困惑的人(我也是刚刚走出谜团,大佬勿喷。)
工训赛期间,突击学习了二维码识别(基于openmv4)。openmv4通过串口通信加json与stm32f103完成通信,结果由stm32所连的lcd屏显示

一、所用的硬件:

openmv4、正点原子的mini板(stm32f103rct6)、正点原子配套的lcd屏。

二、openmv端

直接上代码:

代码如下(示例):

mport sensor, image, time
from pyb import UART

uart = UART(3, 115200)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA) # can be QVGA on M7...
sensor.skip_frames(30)
sensor.set_auto_gain(False) # must turn this off to prevent image washout...
while(True):
    img = sensor.snapshot()
    img.lens_corr(1.8) # strength of 1.8 is good for the 2.8mm lens.
    for code in img.find_qrcodes():
        print(code)
        FH= bytearray([0xb3,0xb3])
        uart.write(FH)
        uart.write(code.payload())
        FH = bytearray([0x0d,0x0a])
        uart.write(FH)
        time.sleep_ms(1000)

注:
1、openmv4的 p4为TX p5为RX。(不要接错线哦)
2、FH为帧头用于检验数据发送是否正确。(不懂的可以结合32端代码理解)
3、 code.payload()函数记录的二维码内的字符。
4、波特率设置为115200(要和32端保持一致)。
5、关于二维码识别的详细代码可以去openmv官网查找。

2.stm32端

main.c:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "lcd.h"


 int main(void)
 {		
 	u8 len;
	u8 t,n;
	u8 UsartDisPlay[200];
	uart_init(115200);
	 delay_init();
	 LCD_Init();
	POINT_COLOR=RED; 
while(1)
{
   if(USART_RX_STA&0x8000)
   {
       len=USART_RX_STA&0x3fff;
		 for(t=0;t<len;t++)
		  { if(USART_RX_BUF[t]==0xb3)
				 if(USART_RX_BUF[t]==0xb3) n=t+1;
			}
			for(t=0;n<len;t++,n++)
			{UsartDisPlay[t]=USART_RX_BUF[n];
				delay_ms(3000);
			 }
			USART_RX_STA=0;
    }
	 
LCD_ShowString(15,50,260,16,16,UsartDisPlay);
	
}	
	  

usart1配置:

void uart_init(u32 bound){
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
  
	//USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
   
  //USART1_RX	  GPIOA.10初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

	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(USART1, &USART_InitStructure); //初始化串口1
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART1, ENABLE);                    //使能串口1 

}

中断函数:

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
		{
		Res =USART_ReceiveData(USART1);	//读取接收到的数据
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART_RX_STA&0x4000)//接收到了0x0d
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
				else USART_RX_STA|=0x8000;	//接收完成了 
				}
			else //还没收到0X0D
				{	
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
					{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
					}		 
				}
			}   		 
     } 

注:
1、PA9为TX,PA10为RX。
2、openmv和stm32一定要共接GND。


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总结

要源码的可以评论区留邮箱,本人刚入门,有错欢迎指正。

hi,这是我用百度网盘分享的内容~复制这段内容打开「百度网盘」APP即可获取
链接:https://pan.baidu.com/s/1V7UudQBo1524rFaDENnd2A?pwd=p16x
提取码:p16x
源码来了,不一一回复了

版权声明:本文为CSDN博主「云中落羽」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_51621579/article/details/115057847

生成海报
点赞 0

云中落羽

我还没有学会写个人说明!

暂无评论

相关推荐

Matlab 与stm32单片机之间的串口通信

Matlab 与stm32单片机之间的串口通信 在我们用stm32做信号处理时,我时常需要用到Matlab对我们采集的数据进行分析,拟合。按照传统的方法,我们一般都会先将数据通过串口助手打印出来&#x

串口调试助手 安卓版

平时工作中和硬件同事对接的比较多,软件和硬件的通讯,串口用的也比较多的。在网上找了很多串口调试工具,大都年代久远,没有继续更新维护的了。 于是,自己抽空写了一个&#xff1