openmv与stm32的串口通信

  • 简谈闲话
  • Openmv主要代码
  • STM32单片机的配置
  • 运行效果图片如下

简谈闲话

这两天本人利用周末时间粗略的学习一下openmv的使用,目的是用openmv图像处理数据并通过串口发送数据给STM32F103的单片机,并且用TFTLCD显示屏打印数据。在学习的过程中遇到了一些问题且成功解决,下面将讲述其中的过程,希望可以帮助需要的朋友,欢迎大家一起交流学习。

Openmv主要代码

import sensor, image, time, math
from pyb import UART
import jsonsensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
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()uart = UART(3,115200)   #定义串口3变量
def find_max(blobs):    #定义寻找色块面积最大的函数max_size=0for blob in blobs:if blob.pixels() > max_size:max_blob=blobmax_size = blob.pixels()return max_blob
####################################
#
#此为颜色处理代码
#
###################################
#bytearray为可变序列的字节数组 返回一个新的字节数组(将数据转为16进制)
img_data = bytearray([0x2C,18,X_black_Sign,Y_black_Sign,X_black_relative_displacement,Y_black_relative_displacement,X_red_Sign,Y_red_Sign,X_red_relative_displacement,Y_red_relative_displacement,X_yellow_Sign,Y_yellow_Sign,X_yellow_relative_displacement,Y_yellow_relative_displacement,L_black,L_red,L_yellow,0x5B])uart.write(img_data)

上述代码中引用了感光元件sensor及串口UART.
先定义了一个寻色块面积最大的函数,然后对目标颜色进行处理,最后通过bytearray对数据进行处理并赋值给变量img_data。

bytearray为python内字节数组,详情请点击此处

STM32单片机的配置

  • UART4库函数初始化配置
void uart4_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure; //串口端口配置结构体变量USART_InitTypeDef USART_InitStructure;//串口参数配置结构体变量NVIC_InitTypeDef NVIC_InitStructure;//串口中断配置结构体变量//使能 UART4 时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);   //打开串口复用时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);   //打开PC端口时钟//UART4_TX   GPIOC.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PC.10GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设定IO口的输出速度为50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC.10//UART4_RX     GPIOC.11初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PC.11GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC.10  //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;       //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = 115200;//串口波特率为115200USART_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(UART4, &USART_InitStructure); //初始化串口4USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(UART4, ENABLE);                    //使能串口4 //如下语句解决第1个字节无法正确发送出去的问题USART_ClearFlag(UART4, USART_FLAG_TC);       //清串口4发送标志
}
  • UART4的中断函数
void UART4_IRQHandler(void)             //串口4全局中断服务函数
{u8 com_data;//接收中断if( USART_GetITStatus(UART4,USART_IT_RXNE) ){USART_ClearITPendingBit(UART4,USART_IT_RXNE);//清除中断标志com_data = UART4->DR;Openmv_Receive_Data(com_data);//openmv数据处理函数}
}

本次实验我采用的是STM32F103zet6精英版单片机,具体配置请参考其数据手册。

  • 接收openmv数据
void Openmv_Receive_Data(int16_t data)//接收Openmv传过来的数据
{static u8 openmv[18];  //存取数据static u8 state = 0; static u8 bit_number=0;    if(state==0&&data==0x2C){state=1;openmv[bit_number++]=data;}else if(state==1&&data==18){state=2;openmv[bit_number++]=data;}else if(state==2){openmv[bit_number++]=data;if(bit_number>=17){state=3;}}else if(state==3)       //检测是否接受到结束标志{if(data == 0x5B){state = 0;openmv[bit_number++]=data;}else if(data != 0x5B){state = 0;for(i=0;i<18;i++){openmv[i]=0x00;}           }}    else{state = 0;bit_number=0;for(i=0;i<18;i++){openmv[i]=0x00;}}
}

函数就是数据后先对比帧头是否正确,正确则进行数据存储,否则数据数组一直等待正确帧头的到来。

  • 主函数
int main(void){      delay_init();            //延时函数初始化    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200);     //串口初始化为115200uart4_Init();LED_Init();              //LED端口初始化KEY_Init();          //初始化与按键连接的硬件接口LCD_Init();POINT_COLOR=RED;while(1) {   LCD_ShowNum(0,20,200,10,24);LCD_ShowNum(0,40,X_black_data,10,24); LCD_ShowNum(0,70,Y_black_data,10,24);LCD_ShowNum(0,90,X_red_data,10,24);LCD_ShowNum(0,110,Y_red_data,10,24);                               LCD_ShowNum(0,130,X_yellow_data,10,24);      LCD_ShowNum(0,150,Y_yellow_data,10,24);               }    }

运行效果图片如下


  • 注意事项
  • 若使用寄存器初始化串口,则应只有USART1使用PCLK2(最高72MHz)。其它USART使用PCLK1(最高36MHz)。
  • openmv的波特率应与接收端单片机串口波特率对应
  • openmv与STM32单片机两个串口的的数据格式应保持一致

STM32单片机与Openmv的串口通信相关推荐

  1. 单片机与PC机串口通信编程

    单片机与PC机串口通信编程 实验目的 利用PROTUES仿真软件.串口调试助手.虚拟串口,搭建单片机与PC通信仿真平台,熟悉单片机串口的配置及与PC机的通信方法. 实验目的 1.PROTUES仿真软件 ...

  2. 合泰杯——合泰单片机工程5之串口通信

    合泰杯--合泰单片机工程5之串口通信 前言 一.usat例程分析? 二.编写程序 总结 前言 这一章更新的是关于合泰单片机串口通信的内容,用的是HT66F2390的芯片和板子,使用e-link下载程序 ...

  3. 【自学51单片机】11 -- UART串口通信

    文章目录 1.串行通信的初步认识 2.USB转串口通信 3.UART串口通信的基本应用 3.1 通信的三种基本类型 3.2 UARM模块介绍 3.3编写UART串口步骤及程序 4.串口调试助手 5.通 ...

  4. 51单片机学习--定时器--中断--串口通信

    51单片机学习–定时器–中断–串口通信 定时器–中断–串口通信 中断分类 定时器中断 外部中断 串口中断 基本概念 对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B, ...

  5. linux gpio 模拟串口,STM32的GPIO口模拟串口通信.rar

    [实例简介] 利用GPIO.EXTI外部中断.TIM定时器实现URAT串口,该例子来自21IC网,未做改动,明天自己调试,看看效果 完全是根据UART协议编写 [实例截图] [核心代码] STM32的 ...

  6. STM32单片机与蓝牙模块HC-05通信数据帧处理

    本章将会详细讲述蓝牙模块(HC-05)和STM32单片机之间的通信收发的数据如何处理,在测试开始前首先在手机上下载好一个蓝牙调试APP,此APP可以是手机端和PC端口的,以我常用的手机端的为例. 在配 ...

  7. STM32最小核心板F103串口通信USART

    文章目录 一.串口协议和RS-232标准,RS232电平与TTL电平的区别,"USB/TTL转232"模块的工作原理 1.串口协议 2.RS-232标准 3.RS232电平与TTL ...

  8. 基于stm32的温湿度检测案例串口通信屏显示(二)

    文章目录 前言 一.串口通信屏幕 二.DHT11测试效果与说明 三.读入数据 四.串口及中断配置 五.屏幕上显示数据 5.1.屏幕内嵌指令 5.2.静态数据 5.3.动态数据 六.效果 前言 因为st ...

  9. 单片机实验八 RS232串口通信实验(接收与发送)

    实验八 RS232串口通信实验(接收与发送) 一.实验目的 1.熟悉实验软件和硬件,进行正确的接线: 2.通过实验了解串口的基本原理及使用,理解并掌握对串口进行初始化: 3.使用串口调试助手做为上位机 ...

最新文章

  1. 资源 | 机器学习、NLP、Python和Math最好的150余个教程(建议收藏)
  2. 自动驾驶领域大佬在CVPR2020中 关于3D Reconstruction Learning的报告
  3. 01 小程序开发入门
  4. Dockerfile构建PHP镜像
  5. 原创 | OpenAPI 标准规范
  6. DayDayUp之Job:牛客网—算法工程师—剑指offer之66道在线编程(解决思路及其代码)——41~66
  7. 使用logdashboard进行可视化的日志追踪
  8. Java:Speedment 3.2的发布–现在启用轻量级数据库微服务
  9. 查看计算机上隐藏用户,隐藏或显示 InetOrgPerson 对象类 - Windows Server | Microsoft Docs...
  10. Tensorflow的快速安装(张量图例)
  11. sql 查询Africa城市的人口和城市名字
  12. paip.验证码识别----判断汉字还是英文
  13. 数据挖掘十大经典算法——Apriori
  14. Ros平台下:从零开始学习SLAM(序)
  15. 国际贸易结算-信用证流程图
  16. kali 基于虚拟机下载
  17. 无线电波的波段划分和应用
  18. 知名卸载软件Revo Uninstaller Pro挑战Deep Freeze卸载动画视频教程
  19. [Vuforia]二.3D物体识别
  20. 第2次作业:微信案例分析

热门文章

  1. 平面UI设计培训让大学生轻松获得高薪工作
  2. 编译器:GNU工具链GCC编译器的编译方法和编译步骤
  3. Ubuntu18.04禁止conda自动激活base环境
  4. 谁是三鹿奶粉事件的真凶
  5. 4 计算机系统的异步性,操作系统复习资料.doc
  6. ArcMap 打不开
  7. 一文读懂开源日志管理方案 ELK 和 EFK 的区别
  8. 解决苹果(mac)浏览器safari导出excel中文名称乱码问题
  9. uni-app 微信小程序根据角色动态的更改底部tabbar
  10. Spring项目,项目启动执行方法且执行一次。