自己备赛的过程中遇到了一些问题,网上找了很久才总结出来,openmv通过串口发送数据,stm32进行接收并显示在液晶屏上,亲测可用。

使用设备stm32f103zet6,液晶屏为四线

感谢拾牙慧者提供的思路:https://blog.csdn.net/qq_42604176/article/details/108391718?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162883876416780264017661%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=162883876416780264017661&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-2-108391718.pc_v2_rank_blog_default&utm_term=openmv&spm=1018.2226.3001.4450

OpenMv主要代码:

import json  #加载json
uart = UART(3,115200)   #定义串口3变量    P4 TX<-->PA10  P5 RX<-->PA9
uart.init(115200, bits=8, parity=None, stop=1) # init with given parametersdata = bytearray([0xb3,0xb3,max_blob.cx(),max_blob.cy(),length,0x5b])  #打包要发送的数据
uart.write(data)  #串口发送

openmv打包发送数据,stm32接收端再进行解析

stm32主要代码:这里设置接收了三个变量,在代码中有注释,先接收然后再进行解析,第一个是解析的函数,第二个是接收函数

void Openmv_Data(void)//处理Openmv接收的数据
{OpenMV_X=openmv[2];OpenMV_Y=openmv[3];length =openmv[4];
}void Openmv_Receive_Data(int16_t data)//接收Openmv传过来的数据
{static u8 state = 0;if(state==0&&data==0xb3)//第一个帧头{state=1;openmv[0]=data;}else if(state==1&&data==0xb3)//第二个帧头{state=2;openmv[1]=data;}else if(state==2)//第一个有效数据{state=3;openmv[2]=data;}else if(state==3)//第二个有效数据{state = 4;openmv[3]=data;}else if(state==4)//第三个有效数据{state = 5;openmv[4]=data;} else if(state==5)        //检测是否接受到结束标志,检测接收帧尾{if(data == 0x5B){state = 0;openmv[5]=data;Openmv_Data();}else if(data != 0x5B){state = 0;for(i=0;i<6;i++){openmv[i]=0x00;}           }}    else{state = 0;for(i=0;i<6;i++){openmv[i]=0x00;}}
}

定义的三个变量,注意定义的位置,在使用之前要定义:

int openmv[6];//stm32接收数据数组
int16_t OpenMV_X;          /*OPENMV X 轴反馈坐标*/
int16_t OpenMV_Y;          /*OPENMV X 轴反馈坐标*/
int16_t length;
int i;

那么什么时候开始接收呢,这里我使用了中断,所以中断函数修改成了这样

void USART1_IRQHandler(void)                 //串口1中断服务程序{u8 com_data;
#if SYSTEM_SUPPORT_OS       //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.OSIntEnter();
#endifif(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){USART_ClearFlag(USART1,USART_FLAG_RXNE);com_data = USART1->DR;Openmv_Receive_Data(com_data);     //openmv数据处理函数Openmv_Data();                         //openmv数据处理函数     }
#if SYSTEM_SUPPORT_OS   //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.OSIntExit();
#endif
} 

这样接收就配置好了,为了更直观的显示,我加入了oled屏进行显示,主要的配置如下:

//由于不在同一个文件下,需要引用一下之前定义的变量
extern int16_t OpenMV_X;          /*OPENMV X 轴反馈坐标*/
extern int16_t OpenMV_Y;          /*OPENMV X 轴反馈坐标*/
extern int16_t length;//主函数的相关配置
int main(void)
{OLED_Init();OLED_Clear();OLED_ShowString(2,0,"Openmv Test",16);uart_init(115200);
while(1){//sprintf((char *)string,"X_coords:%d",OpenMV_X);//OLED_ShowString(2,2,string,16);OLED_ShowString(0,2,"X_c:",16);OLED_ShowNum(32,2,OpenMV_X,8,16);//sprintf((char *)string,"Y_coords:%d",OpenMV_Y);//OLED_ShowString(2,4,string,16);OLED_ShowString(0,4,"Y_c:",16);OLED_ShowNum(32,4,OpenMV_Y,8,16);//sprintf((char *)string,"L_coords:%d",length);//OLED_ShowString(2,6,string,16);OLED_ShowString(0,6,"L_c:",16);OLED_ShowNum(32,6,length,8,16);}
}

最终效果:

最终效果还是很完美的

就是有一个疑问,在显示的时候使用sprintf数据会显示不正常,不知道是什么原因,感觉是格式化转换太占用时间了,希望知道的大佬可以指导一下。

stm32接收OpenMv发送的数据,并用oled屏显示相关推荐

  1. Android客户端通过TCP接收服务器端发送的数据

    引言 因为我确实不懂TCP通信这一块儿,最近项目中要实现客户端接收服务器端发送过来的数据(这个数据是int型的,范围是0~360,而且服务器端用C语言写的,每一秒发送一次,客户端只需要不断接收就好了) ...

  2. stm32+HTU21D温湿度传感器通过usart1发送温湿度数据在串口助手显示

    stm32+HTU21D温湿度传感器 这里就不拍实物图了,我用的是下面这款HTU21D ic是stm32f103vet6 工程代码是io口模拟i2c和传感器通讯 PB6-SCL,PB7-SDA usa ...

  3. Java:PC端作为客户端连接蓝牙设备并接收蓝牙发送的数据

    感谢:(1)PC端蓝牙开发  https://www.cnblogs.com/zeussbook/p/12827479.html https://blog.csdn.net/svizzera/arti ...

  4. 实验 STM32 基于SPI的OLED屏显示

    STM32 基于SPI的OLED屏显示 一.任务要求 二.显示自己的学号和姓名 1.例子程序的改写 (1)下载资料 (2)解压后找到文件,并用KEIL打开. (3)改写程序 2.连接硬件 3.运行结果 ...

  5. 【嵌入式】STM32基于SPI通信协议OLED屏显示

    STM32基于SPI通信协议OLED屏显示 一.SPI协议和OLED介绍 1.SPI协议介绍 物理层 协议层 2.OLED显示屏介绍 二.显示个人学号姓名实验 1.题目要求 2.代码部分 1.完整代码 ...

  6. esp32 spi 驱动 oled 屏显示来自 PC 的画面

    esp32 spi 驱动 oled 屏显示来自 PC 的画面 实验代码 gayhub 实验源码 设备及运行环境 装有python的电脑 Python 3.8.2 (tags/v3.8.2:7b3ab5 ...

  7. 用STM32F103达成基于I2C协议的AHT20温湿度传感器和OLED屏显示汉字

    目录 一 I2C协议简介 硬件I2C与软件I2C 二 代码和ATH20芯片实现温湿度的串口显示 三 用stm32f103芯片的SPI和IIC接口接上OLED屏显示中文姓名温湿度 1 先用文字字模生成器 ...

  8. 0.96寸OLED屏显示(IIC通信)Ⅰ

    0.96寸OLED屏显示(IIC通信) 一.0.96寸OLED简介   0.96寸OLED屏内部驱动IC为SSD1306:兼容6800.8080两种并行接口方式,3线或 4线的串行SPI接口方式和 I ...

  9. msp430f5529——OLED屏显示文字与图片

    目录 前言 一.效果展示 二.步骤 1.OLED.C文件 2.OLED.h文件 3.OLEDFONT.h文件 4.type.h文件 5.bmp.h文件 6.main.c 7.关于文字和图片的取模 总结 ...

最新文章

  1. oracle分页的方法,Oracle数据库分页的集中方法(三种方法)
  2. 英伟达新卡皇3090Ti:功耗飙至450W换来性能涨11%
  3. 修改echarts环形图的牵引线及文字位置
  4. 2018年4月13日_Java的最新发展– 2018年4月下旬
  5. Spring安全–幕后
  6. python刷题_11.学习Python,刷题才能让你感受到快(差)乐(距)!
  7. Spring Boot 打成war包的方法
  8. 今日恐慌与贪婪指数为92 贪婪程度有所上升
  9. 解决 sublime text3 运行python文件无法input的问题
  10. Python 进阶 —— 迭代器与生成器
  11. java垃圾收集算法、标记-清除算法、复制算法、标记-整理清除、分代收集算法
  12. 一文吃透strcmp函数
  13. 判断conime.exe是不是病毒!
  14. 面试反问环节“你有什么问题想问的”踩雷一记
  15. 安科瑞预付费系统在电力系统中的应用
  16. mysql复制不了的文字怎么办_网页上的文字不能复制怎么办?
  17. 昆明半程马拉松:1名选手死亡5名选手昏迷(图)
  18. 数据分析——用户流失分析
  19. matlab中画圆圈,如何在Matlab中绘制圆圈?
  20. Pandas工具包实战(16)apply函数操作:numpy, pandas,

热门文章

  1. 用Python进行训练/测试集分割和交叉验证
  2. 如何查看自己电脑的型号
  3. 计算机科学与技术考研报名属于哪一类,计算机在考研中属于什么类别
  4. thor修改html,f4thor修改工具[thor规则解包打包] | 贝贝吧
  5. 三极管的简单应用实验【Multisim仿真】
  6. python进行 t 检验
  7. 如何开发自动生产爆款抖音视频机器人
  8. linux sh : 由未实现函数引起bash读取2进制附加数据引起的报错
  9. “能找到工作,全靠我简历造假”
  10. Automation Anywhere A360 Certified Master RPA Professional Prep + Exam (A2019)认证真题和详细攻略