赞
踩
openmv和stm32串口通信完成二维码识别
注:我只是个大一的小白,本文只完成基本功能,希望能帮助有困惑的人(我也是刚刚走出谜团,大佬勿喷。)
工训赛期间,突击学习了二维码识别(基于openmv4)。openmv4通过串口通信加json与stm32f103完成通信,结果由stm32所连的lcd屏显示
openmv4、正点原子的mini板(stm32f103rct6)、正点原子配套的lcd屏。
直接上代码:
代码如下(示例):
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官网查找。
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
源码来了,不一一回复了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。