stm32接收OpenMv发送的数据,并用oled屏显示
自己备赛的过程中遇到了一些问题,网上找了很久才总结出来,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屏显示相关推荐
- Android客户端通过TCP接收服务器端发送的数据
引言 因为我确实不懂TCP通信这一块儿,最近项目中要实现客户端接收服务器端发送过来的数据(这个数据是int型的,范围是0~360,而且服务器端用C语言写的,每一秒发送一次,客户端只需要不断接收就好了) ...
- stm32+HTU21D温湿度传感器通过usart1发送温湿度数据在串口助手显示
stm32+HTU21D温湿度传感器 这里就不拍实物图了,我用的是下面这款HTU21D ic是stm32f103vet6 工程代码是io口模拟i2c和传感器通讯 PB6-SCL,PB7-SDA usa ...
- Java:PC端作为客户端连接蓝牙设备并接收蓝牙发送的数据
感谢:(1)PC端蓝牙开发 https://www.cnblogs.com/zeussbook/p/12827479.html https://blog.csdn.net/svizzera/arti ...
- 实验 STM32 基于SPI的OLED屏显示
STM32 基于SPI的OLED屏显示 一.任务要求 二.显示自己的学号和姓名 1.例子程序的改写 (1)下载资料 (2)解压后找到文件,并用KEIL打开. (3)改写程序 2.连接硬件 3.运行结果 ...
- 【嵌入式】STM32基于SPI通信协议OLED屏显示
STM32基于SPI通信协议OLED屏显示 一.SPI协议和OLED介绍 1.SPI协议介绍 物理层 协议层 2.OLED显示屏介绍 二.显示个人学号姓名实验 1.题目要求 2.代码部分 1.完整代码 ...
- esp32 spi 驱动 oled 屏显示来自 PC 的画面
esp32 spi 驱动 oled 屏显示来自 PC 的画面 实验代码 gayhub 实验源码 设备及运行环境 装有python的电脑 Python 3.8.2 (tags/v3.8.2:7b3ab5 ...
- 用STM32F103达成基于I2C协议的AHT20温湿度传感器和OLED屏显示汉字
目录 一 I2C协议简介 硬件I2C与软件I2C 二 代码和ATH20芯片实现温湿度的串口显示 三 用stm32f103芯片的SPI和IIC接口接上OLED屏显示中文姓名温湿度 1 先用文字字模生成器 ...
- 0.96寸OLED屏显示(IIC通信)Ⅰ
0.96寸OLED屏显示(IIC通信) 一.0.96寸OLED简介 0.96寸OLED屏内部驱动IC为SSD1306:兼容6800.8080两种并行接口方式,3线或 4线的串行SPI接口方式和 I ...
- msp430f5529——OLED屏显示文字与图片
目录 前言 一.效果展示 二.步骤 1.OLED.C文件 2.OLED.h文件 3.OLEDFONT.h文件 4.type.h文件 5.bmp.h文件 6.main.c 7.关于文字和图片的取模 总结 ...
最新文章
- oracle分页的方法,Oracle数据库分页的集中方法(三种方法)
- 英伟达新卡皇3090Ti:功耗飙至450W换来性能涨11%
- 修改echarts环形图的牵引线及文字位置
- 2018年4月13日_Java的最新发展– 2018年4月下旬
- Spring安全–幕后
- python刷题_11.学习Python,刷题才能让你感受到快(差)乐(距)!
- Spring Boot 打成war包的方法
- 今日恐慌与贪婪指数为92 贪婪程度有所上升
- 解决 sublime text3 运行python文件无法input的问题
- Python 进阶 —— 迭代器与生成器
- java垃圾收集算法、标记-清除算法、复制算法、标记-整理清除、分代收集算法
- 一文吃透strcmp函数
- 判断conime.exe是不是病毒!
- 面试反问环节“你有什么问题想问的”踩雷一记
- 安科瑞预付费系统在电力系统中的应用
- mysql复制不了的文字怎么办_网页上的文字不能复制怎么办?
- 昆明半程马拉松:1名选手死亡5名选手昏迷(图)
- 数据分析——用户流失分析
- matlab中画圆圈,如何在Matlab中绘制圆圈?
- Pandas工具包实战(16)apply函数操作:numpy, pandas,
热门文章
- 用Python进行训练/测试集分割和交叉验证
- 如何查看自己电脑的型号
- 计算机科学与技术考研报名属于哪一类,计算机在考研中属于什么类别
- thor修改html,f4thor修改工具[thor规则解包打包] | 贝贝吧
- 三极管的简单应用实验【Multisim仿真】
- python进行 t 检验
- 如何开发自动生产爆款抖音视频机器人
- linux sh : 由未实现函数引起bash读取2进制附加数据引起的报错
- “能找到工作,全靠我简历造假”
- Automation Anywhere A360 Certified Master RPA Professional Prep + Exam (A2019)认证真题和详细攻略