IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> stm32接收OpenMv发送的数据,并用oled屏显示 -> 正文阅读

[嵌入式]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 parameters

data = 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();    
#endif
	if(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数据会显示不正常,不知道是什么原因,感觉是格式化转换太占用时间了,希望知道的大佬可以指导一下。

?

?

?

?

?

?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-14 14:14:35  更:2021-08-14 14:16:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/11 5:20:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码