精华内容
下载资源
问答
  • Openmv与STM32通信.zip

    2020-05-09 10:28:53
    该文件包括三部分,一个是openmv的官方云台三维模型,可直接打印,一个是openmv的程序,该程序可同时识别三个颜色,本程序中同时识别了红绿蓝,识别后返回颜色顺序,通过串口通信stm32主控,并在LCD屏幕上显示识别...
  • OPENMV与STM32串口通信

    千次阅读 2021-03-26 10:07:01
    OPENMV与STM32串口通信 openmv串口配置: uart = UART(1, 115200) #串口1,波特率115200 uart.init(115200, bits=8, parity=None, stop=1) #8位数据位,无校验位,1位停止位 openmv数据发送: uart.write(bytearray...

    OPENMV与STM32串口通信
    openmv串口配置:
    uart = UART(1, 115200) #串口1,波特率115200
    uart.init(115200, bits=8, parity=None, stop=1) #8位数据位,无校验位,1位停止位
    openmv数据发送:
    uart.write(bytearray(frame))
    openmv数据接收:
    if uart.any(): #用于接收串口数据
    recvData = uart.readline()

    展开全文
  • 使用openMV3与stm32进行通讯,想用openMV与stm32通讯,在网上找了一大圈,最后决定使用串口,参照这篇文章https://blog.csdn.net/qq_43243338/article/details/89441756
  • 刚开始学openmv与32串口通信,我是用的stm32f103的板子。开始想简单发送字符或者16位数试验一下,然后就遇到了个小问题,即openmv和单片机可以分别和电脑通信,但是让他俩通信的话就不行,随后解决在此记录下来。 ...

    前言

        刚开始学openmv与32串口通信,我是用的stm32f103的板子。开始想简单发送字符或者16位数试验一下,然后就遇到了个小问题,即openmv和单片机可以分别和电脑通信,但是让他俩通信的话就不行,随后解决,在此记录。

    我的思路是用openmv给单片机每秒发送五个bit的数据,然后单片机每接受一次led灯就翻转一次。

    1 发送字符

        这是单片机主程序: 用的正点原子的串口实验例程,只是主程序加了个led灯的翻转。

     int main(void)
     {	
    	u8 t;
    	u8 len;	
    	u16 times=0; 
     
    	delay_init();	    	 //延时函数初始化	
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
    	uart_init(9600);	 //串口初始化为9600
    	LED_Init();		  	 //初始化与LED连接的硬件接口 
     
    	while(1)
    	{
    		if(USART_RX_STA&0x8000)
    		{					   
    			len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
    			if(len==5)LED0=!LED0;
    			printf("\r\n您发送的消息为:\r\n");
    			for(t=0;t<len;t++)
    			{
    				USART1->DR=USART_RX_BUF[t];
    				while((USART1->SR&0X40)==0);//等待发送结束
    			}
    			printf("\r\n\r\n");//插入换行
    			USART_RX_STA=0;
    		}
    
    	}	 
    }

    由于单片机接收到的数据需要以0x0d,0xad结尾作为接受完成判断的,如果是字符的话就是回车换行。而用电脑与单片机实验,给单片机发数据时,电脑发的数据是在后面自动加回车和换行的,也就是说我用电脑发 hello=用openmv发 hello\r\n。

     这是openmv的程序:

    import time
    from pyb import UART
    
    # Always pass UART 3 for the UART number for your OpenMV Cam.
    # The second argument is the UART baud rate. For a more advanced UART control
    # example see the BLE-Shield driver.
    uart = UART(3, 9600)
    while(True):
        uart.write("Hello\r\n")
        #data=bytearray([0x80,0x06,0x02,0x78,0x23,0x0d,0x0a])
        #uart.write(data)
        time.sleep_ms(1000)
        

    现在上面openmv程序发送的是正确的,为5个字符。

    2 发送十六位数据

        单片机程序不用变,只需改动openmv程序即可。

    import time
    from pyb import UART
    
    # Always pass UART 3 for the UART number for your OpenMV Cam.
    # The second argument is the UART baud rate. For a more advanced UART control
    # example see the BLE-Shield driver.
    uart = UART(3, 9600)
    while(True):
        #uart.write("Hello\r\n")
        data=bytearray([0x80,0x06,0x02,0x78,0x23,0x0d,0x0a])
        uart.write(data)
        time.sleep_ms(1000)

    同理,发送16位数据需要在后面加上0x0d,0xad即可。

     参考博主文章:openmv 发送16进制数_zzzzjh的博客-CSDN博客

    展开全文
  • 基于stm32f103的于openmv通信程序。
  • 利用OpenMV与STM32进行串口通信 OpenMV端的程序 # Untitled - By: dell - 周一 7月 19 2021 # Blob Detection and uart transport import sensor, image, time,pyb import ustruct from pyb import UART #import ...

    利用OpenMV与STM32进行串口通信

    OpenMV端的程序

    # Untitled - By: dell - 周一 7月 19 2021
    
    # Blob Detection and uart transport
    import sensor, image, time,pyb
    import ustruct
    from pyb import UART
    #import json
    # For color tracking to work really well you should ideally be in a very, very,
    # very, controlled enviroment where the lighting is constant...
    yellow_threshold   = (25, 79, 2, 39, 26, 69)
    # You may need to tweak the above settings for tracking green things...
    # Select an area in the Framebuffer to copy the color settings.
    led3 = pyb.LED(3) # Red LED = 1, Green LED = 2, Blue LED = 3, IR LEDs = 4.
    led1 = pyb.LED(1) # Red LED = 1, Green LED = 2, Blue LED = 3, IR LEDs = 4.
    sensor.reset() # Initialize the camera sensor.
    sensor.set_pixformat(sensor.RGB565) # use RGB565.
    sensor.set_framesize(sensor.QVGA) # use QQVGA for speed.
    sensor.skip_frames(10) # Let new settings take affect.
    sensor.set_auto_whitebal(False) # turn this off.
    clock = time.clock() # Tracks FPS.
    
    uart = UART(3, 115200)#初始化串口号及其波特率
    #**************************传输数据的函数************************************
    def sending_data(cx,cy):
        global uart;
        #frame=[0x2C,18,cx%0xff,int(cx/0xff),cy%0xff,int(cy/0xff),0x5B];
        #data = bytearray(frame)
        data = ustruct.pack("<bbhhb",      #格式为俩个字符俩个短整型(2字节)
                       0x2C,                      #帧头1
                       0x12,                      #帧头2
                       int(cx), # up sample by 4   #数据1
                       int(cy), # up sample by 4    #数据2
                       0x5B)
        uart.write(data);   #必须要传入一字节的数组,这个函数似乎不能发送单个字节,必须得一次发送多个字节
    #**************************************************************************
    while(True):
        img = sensor.snapshot() # Take a picture and return the image.
        led1.on()
        led3.on()#LED指示openmv正在工作
        blobs = img.find_blobs([yellow_threshold])#寻找符合条件的色块
        if len(blobs) == 1:#如果只找到一个符合条件的色块
    
            #print('sum :', len(blobs))
            img.draw_rectangle(blobs[0].rect())
            img.draw_cross(blobs[0].cx(), blobs[0].cy())
    
            output_str="[%d,%d]" % (blobs[0].cx(),blobs[0].cy())
    
            print('you send:',output_str)
            sending_data(blobs[0].cx(),blobs[0].cy())#发送色块框的中心点坐标
            #FH = bytearray([0x2C,0x12,blobs[0].cx(),blobs[0].cy(),0x5B])
    
            #uart.write(FH)
        else:
            print('not found!')
            sending_data(567,789)#如果没有找到符合条件的色块,那么发送一个不可能出现的坐标
            #FH = bytearray([0x2C,0x12,0x77,0x55,0x5B])
    
            #uart.write(FH)
    
    

    由于我们图像大小设置成了QVGA,所以所有可能出现的坐标最大是(320,240),所以x或y最多只需要16bit,也就是两个Bit就可以完全发送出去。
    在这里插入图片描述
    由上图可知,格式为h,就可以表示2Bit,于是我们把数据的打包格式为h。

    ""bbhhb"就是要发送数据的声明,bbhhb共5个,代表发送5个数据。虽然只有5个数据,却需要发送7个字节,因为1个h就占用两个字节,openmv的发送顺序为:帧头1>帧头2>数据1的低八位>数据1的高八位>数据2的低八位>数据2的高八位。0x2c为数据帧的帧头,即检测到数据流的开始,但是一个帧头可能会出现偶然性,因此设置两个帧头0x2c与0x12以便在中断中检测是否检测到了帧头以便存放有用数据。0x5b为帧尾,即数据帧结束的标志。

    下面,先让openmv与电脑通讯,通过串口调试助手看一下数据是否成功发送。
    这里注意:openmv需要通过一个USB to TTL模块才能与电脑进行串口通信,openmv的RXD要连接模块的TXD,openmv的TXD要连接模块的RXD,然后再把模块与openmv共地即可。
    通讯结果:
    在这里插入图片描述
    可以看到,由于摄像头没有检测到符合条件的色块,所以sending_data(567,789),通过串口助手明显发现数据传输成功,共有7个字节。

    这样,我已经保证了openmv的串口发送程序是完全没有问题的,于是将程序烧录进openmv。
    接下来,写一下stm32的接受程序

    以下代码引用 乌拉~~~~ 博主的 超详细OpenMV与STM32单片机通信 (有完整版源码) 这一篇文章里的源码。感谢此博主的文章!!!!

    // 串口中断服务函数//USART2 全局中断服务函数
    void DEBUG_USART_IRQHandler(void)
    {
      
    
    		uint8_t com_data; //接收一个字节数据的临时变量
    		uint8_t i;
    	  static uint8_t RxCounter1=0;//数据缓冲区的索引
        static uint8_t RxBuffer1[10]={0};//存放数据的接收缓存区
        static uint8_t RxState = 0;	//接收标志位
    		
    //		static uint8_t RxFlag1 = 0;
    
    		if( USART_GetITStatus(DEBUG_USARTx ,USART_IT_RXNE)!=RESET)  	   //接收中断  
    		{
    				USART_ClearITPendingBit(DEBUG_USARTx ,USART_IT_RXNE);   //清除中断标志
    				com_data = USART_ReceiveData(DEBUG_USARTx );
    			
    				if(RxState==0&&com_data==0x2C)  //0x2c帧头
    				{
    					RxState=1;
    					RxBuffer1[RxCounter1++]=com_data;//RxBuffer1[0]==0x2c RxCounter1==1
    				}
    		
    				else if(RxState==1&&com_data==0x12)  //0x12帧头
    				{
    					RxState=2;
    					RxBuffer1[RxCounter1++]=com_data;RxBuffer1[0]==0x12 RxCounter1==2
    				}
    		
    				else if(RxState==2)//开始接收有效数据
    				{
    					RxBuffer1[RxCounter1++]=com_data;//全部接收完,RxCounter1==7
    
    					if(RxCounter1>=10||com_data == 0x5B)       //RxBuffer1接受满了,接收数据结束
    					{
    						  RxState=3;
    //						RxFlag1=1;
    						Cx=(RxBuffer1[RxCounter1-4]<<8)+(RxBuffer1[RxCounter1-5]);//RxBuffer1[2]是openmv发送的第一个数据的低八位,RxBuffer1[3]是openmv发送的第一个数据的高八位
    						Cy=(RxBuffer1[RxCounter1-2]<<8)+(RxBuffer1[RxCounter1-3]);RxBuffer1[4]是openmv发送的第二个数据的低八位,RxBuffer1[5]是openmv发送的第二个数据的高八位
    						
    					}
    				}
    		
    				else if(RxState==3)		//检测是否接受到结束标志
    				{
    						if(RxBuffer1[RxCounter1-1] == 0x5B)
    						{
    									USART_ITConfig(DEBUG_USARTx,USART_IT_RXNE,DISABLE);//关闭DTSABLE中断
    //									if(RxFlag1)
    //									{
    //									
    									OLED_ShowNum(0,0,Cx,3,1,2);
    									OLED_ShowNum(0,2,Cy,3,1,2);
    									
    //									}
    //									RxFlag1 = 0;
    									RxCounter1 = 0;
    									RxState = 0;
    									USART_ITConfig(DEBUG_USARTx,USART_IT_RXNE,ENABLE);
    						}
    						else   //接收错误
    						{
    									RxState = 0;
    									RxCounter1=0;
    									for(i=0;i<10;i++)
    									{
    											RxBuffer1[i]=0xff;      //将存放数据数组清零
    									}
    						}
    				} 
    	
    				else   //接收异常
    				{
    						RxState = 0;
    						RxCounter1=0;
    						for(i=0;i<10;i++)
    						{
    								RxBuffer1[i]=0xff;      //将存放数据数组清零
    						}
    				}
    
    		}
    		
    
    
    }
    

    将openmv的TXD、RXD分别和单片机的RXD、和TXD相连,然后两者共地,再在单片机上连接oled显示一下收到的数据,再把openmv连接电脑,通过IDE观测其发送的数据和oled接收的是否一致。
    结果:
    在这里插入图片描述
    在这里插入图片描述
    可以看到,我成功了。
    将OLED显示的两行代码改进一下:

                            OLED_ShowChar(0,0,'(',2);
    						OLED_ShowNum(8,0,Cx,3,1,2);
    					    OLED_ShowChar(56,0,',',2);
    						OLED_ShowNum(64,0,Cy,3,1,2);
    					    OLED_ShowChar(112,0,')',2);
    

    就成了这个效果:在这里插入图片描述
    在这里插入图片描述

    这里有个疑问

    openmv一共发送了7个数据,所以我就把RxBuffer1[10]={0};//存放数据的接收缓存区改为了RxBuffer1[7]={0};改完之后,oled就不能正常显示数据。(下标最小得是9)
    想不出来这到底是因为什么??????????????????
    解决(最新代码)

    // 串口中断服务函数//USART1 全局中断服务函数
    void DEBUG_USART_IRQHandler(void)
    {
      
    
    		uint8_t com_data; //接收一个字节数据的临时变量
    		uint8_t i;
    	  static uint8_t RxCounter1=0;//数据缓冲区的索引
        static uint8_t RxBuffer1[7]={0};//存放数据的接收缓存区
        static uint8_t RxState = 0;	//接收标志位
    		
    //		static uint8_t RxFlag1 = 0;
    
    		if( USART_GetITStatus(DEBUG_USARTx ,USART_IT_RXNE)!=RESET)  	   //接收中断  
    		{
    				USART_ClearITPendingBit(DEBUG_USARTx ,USART_IT_RXNE);   //清除中断标志
    				com_data = USART_ReceiveData(DEBUG_USARTx );
    			
    				if(RxState==0&&com_data==0x2C)  //0x2c帧头
    				{
    					RxState=1;
    					RxBuffer1[RxCounter1++]=com_data;//RxBuffer1[0]==0x2c RxCounter1==1
    				}
    		
    				else if(RxState==1&&com_data==0x12)  //0x12帧头
    				{
    					RxState=2;
    					RxBuffer1[RxCounter1++]=com_data;RxBuffer1[0]==0x12 RxCounter1==2
    				}
    		
    				else if(RxState==2)//开始接收有效数据
    				{
    					RxBuffer1[RxCounter1++]=com_data;//全部接收完,RxCounter1==7
    
    					if(RxCounter1>=7||com_data == 0x5B)       //RxBuffer1接受满了,接收数据结束
    					{
    						  RxState=3;
    //						RxFlag1=1;
    						Cx=(RxBuffer1[RxCounter1-4]<<8)+(RxBuffer1[RxCounter1-5]);//RxBuffer1[2]是openmv发送的第一个数据的低八位,RxBuffer1[3]是openmv发送的第一个数据的高八位
    						Cy=(RxBuffer1[RxCounter1-2]<<8)+(RxBuffer1[RxCounter1-3]);RxBuffer1[4]是openmv发送的第二个数据的低八位,RxBuffer1[5]是openmv发送的第二个数据的高八位
    						
    					}
    				}
    		
    				else if(RxState==3)		//检测是否接受到结束标志
    				{
    						if(RxBuffer1[RxCounter1-1] == 0x5B)
    						{
    									USART_ITConfig(DEBUG_USARTx,USART_IT_RXNE,DISABLE);//关闭DTSABLE中断
    //									if(RxFlag1)
    //									{
    								  OLED_ShowChar(0,0,'(',2);
    									OLED_ShowNum(8,0,Cx,3,1,2);
    							    OLED_ShowChar(56,0,',',2);
    									OLED_ShowNum(64,0,Cy,3,1,2);
    							    OLED_ShowChar(112,0,')',2);
    									
    //									}
    //									RxFlag1 = 0;
    									RxCounter1 = 0;
    									RxState = 0;
    									USART_ITConfig(DEBUG_USARTx,USART_IT_RXNE,ENABLE);
    						}
    						else   //接收错误
    						{
    									RxState = 0;
    									RxCounter1=0;
    									for(i=0;i<7;i++)
    									{
    											RxBuffer1[i]=0x00;      //将存放数据数组清零
    									}
    						}
    				} 
    	
    				else   //接收异常
    				{
    						RxState = 0;
    						RxCounter1=0;
    						for(i=0;i<7;i++)
    						{
    								RxBuffer1[i]=0x00;      //将存放数据数组清零
    						}
    				}
    
    		}
    		
    
    
    }
    
    

    疑惑存在是因为我只改了RxBuffer1的角标,而没有改动接收异常(else)里面for循环的i<10,这是要改成i<7的。
    openmv脱机运行
    将openmv脱机,用单片机的5v给他供电,其余连线保持不变:
    在这里插入图片描述

    同样可以把openmv的结果通过串口打印到电脑

    只需要在while循环里加上:

    while(1)
    	{	
    		printf("(%d,%d)",Cx,Cy);
    	}	
    

    注意
    1.想要单片机与电脑通信,要另外设置特定的串口,我的开发板上单片机通过USART1和电脑通信,所以要另外设置USART1。
    2.同一个串口的RXD不可以连接多个设备的TXD。比如,我的开发板的USART1如果连接到openmv的TXD,那么可能就造成程序下载不到单片机,因为电脑的TXD也连接的是USART1的RXD。

    ///重定向c库函数printf到串口,重定向后可使用printf函数
    int fputc(int ch, FILE *f)
    {
    		/* 发送一个字节数据到串口 */
    		USART_SendData(DEBUG_USARTx, (uint8_t) ch);
    		
    		/* 等待发送完毕 */
    		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);		
    	
    		return (ch);
    }
    
    

    我这个代码的重定向是写的USART1(DEBUG_USARTx),是不是就说明,我只要使用printf函数就是向USART1的TXR端发送数据???

    展开全文
  • Openmv与stm32串口通信 前言 假期准备参加电赛,学习了openmvopenmv识别到的数据传到STM32,然后进行下一步的处理,为了实现来着之间的通信,花了很长时间,终于实现了,现在想想好像也挺简单的,哈哈哈哈,...

    Openmv与stm32 的串口通信

    前言

    假期准备参加电赛,学习了openmv,openmv识别到的数据传到STM32,然后进行下一步的处理,为了实现来着之间的通信,花了很长时间,终于实现了,现在想想好像也挺简单的,哈哈哈哈,但是对于我这种小白还是有点难,大佬就不用看啦!!
    防止以后忘记,来CSDN做一个笔记吧!!

    openmv端

    在openmv端主要的工作是对目标物体进行识别,然后将需要的数据通过打包,再使用串口发送个单片机。这里有几个关键的地方:

    数据打包的格式:

    data = ustruct.pack("<bbhhhhb", #格式为俩个字符俩个短整型(2字节) 0x2C, #帧头1 0x12, #帧头2 int(cx), # up sample by 4 #数据1 int(cy), # up sample by 4 #数据2 int(cw), # up sample by 4 #数据1 int(ch), # up sample by 4 #数据2 0x5B) uart.write(data); #必须要传入一个字节数组
    打包的方式如上图所示,为了防止数据错误,需要加入两个数据帧头和一个 数据帧尾。

    openmv传输的数据的形式

    openmv只能传输十六进制的数据给STM32,否则STM32将收不到数据,结果就是单片机和openmv都能正常和电脑通信,但是两者结合就不能正常通信
    十六进制数据的实现主要通过 bytearray ()这个函数,具体的格式如下:OUT_DATA =bytearray([0x2C,0x12,cx,cy,cw,ch,0x5B])
    在openmv段主要的问题就是这两个地方,区域的串口的配置,以及数据发送数都是常规的,openmv还有一种数据格式,就是json字符串,都是我还没试过,以后再补上。

    openmv端完整的源代码

    from pyb import UART,LED
    import json,ustruct,sensor,time
    
    red_threshold  = (2, 12, -56, 2, -75, 14)#测试所用,白色,懒得该名称
    sensor.reset() # Initialize the camera sensor.
    sensor.set_pixformat(sensor.RGB565) # use RGB565.
    sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
    sensor.skip_frames(10) # Let new settings take affect.
    sensor.set_auto_whitebal(False) # turn this off.
    clock = time.clock() # Tracks FPS.
    
    uart = UART(3,115200)   #定义串口3变量
    uart.init(115200, bits=8, parity=None, stop=1) # init with given parameters
    
    '''寻找最大色块'''
    def find_max(blobs):
        max_size=0
        for blob in blobs:
            if blob[2]*blob[3] > max_size:
                max_blob=blob
                max_size = blob[2]*blob[3]
        return max_blob
    '''数据发送函数'''
    def sending_data(cx,cy,cw,ch):
        global uart;
        #frame=[0x2C,18,cx%0xff,int(cx/0xff),cy%0xff,int(cy/0xff),0x5B];
        #data = bytearray(frame)
        data = ustruct.pack("<bbhhhhb",      #格式为俩个字符俩个短整型(2字节)
                       0x2C,                      #帧头1
                       0x12,                      #帧头2
                       int(cx), # up sample by 4   #数据1
                       int(cy), # up sample by 4    #数据2
                       int(cw), # up sample by 4    #数据1
                       int(ch), # up sample by 4    #数据2
                       0x5B)
        uart.write(data);   #必须要传入一个字节数组
    
    while(True):
        clock.tick() # Track elapsed milliseconds between snapshots().
        img = sensor.snapshot() # Take a picture and return the image.
    
        blobs = img.find_blobs([red_threshold])
        if blobs:
            max_blob = find_max(blobs)
            img.draw_rectangle(max_blob.rect()) # rect
            img.draw_cross(max_blob.cx(), max_blob.cy()) # cx, cy
            cx=max_blob[5]
            cy=max_blob[6]
            cw=max_blob[2]
            ch=max_blob[3]
            OUT_DATA =bytearray([0x2C,0x12,cx,cy,cw,ch,0x5B])
            uart.write(OUT_DATA)
            print(OUT_DATA)
    
    

    STM32 端

    说到STM32 端真的是让我走了很多的弯路,就因为printf()重定向,刚开始用的方式有点问题,让我花了很多很多时间,导致串口调试助手一直收不到消息,还以为是板子坏了,最后发现是重定向的问题,这是两种方式:

    经过验证后的正确方式:

    # include "stdio.h"
    int fputc(int ch ,FILE *f)
    {
    	//轮询方式发送一个字节数据
    	HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch , 1,HAL_MAX_DELAY );
    	return ch ;
    }
    

    关键点:

    串口接收中断 回调函数:

    /*串口接收中断回调函数*/
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
      uint16_t tempt  /*定义临时变量存放接受的数据*/;
      if(huart->Instance==USART2)
      {
        tempt=USART2_RXbuff;
        Openmv_Receive_Data(tempt);
    		/*调运数据接收处理函数,每次进入中断都对数据进行理处
    		,由于需要接收器个数据,因此要进入七次断理*/
      }	
    HAL_UART_Receive_IT(&huart2,(void *)&USART2_RXbuff,1);/*再次开启接收中断*/
    }
    

    最后的重新开启中断接收一定不能忘记;

    数据读取的函数

    openmv.c

    #include "OpenMV.h"
    #include "stdio.h"
    #include "usart.h"
    /*四个变量用于存放目标物体的中心坐标以及宽度,高度*/
    static uint8_t  Cx=0,Cy=0,Cw=0,Ch=0;
    /*数据接收函数*/
    void Openmv_Receive_Data(int16_t Com_Data)
    {
      /*循环体变量*/
      uint8_t i;
    	/*计数变量*/
    	static uint8_t RxCounter1=0;//计数
    	/*数据接收数组*/
    	static uint16_t RxBuffer1[10]={0};
    	/*数据传输状态位*/
    	static uint8_t RxState = 0;	
    	/*对数据进行校准,判断是否为有效数据*/
      if(RxState==0&&Com_Data==0x2C)  //0x2c帧头
    		{
              
    			RxState=1;
    			RxBuffer1[RxCounter1++]=Com_Data;
          HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
    		}
    
    	else if(RxState==1&&Com_Data==0x12)  //0x12帧头
    		{
          HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
    			RxState=2;
    			RxBuffer1[RxCounter1++]=Com_Data;
    		}
    	else if(RxState==2)
    		{
               
    			RxBuffer1[RxCounter1++]=Com_Data;
    			if(RxCounter1>=10||Com_Data == 0x5B)       //RxBuffer1接受满了,接收数据结束
    				{
    					RxState=3;
    					Cx=RxBuffer1[RxCounter1-5];
    					Cy=RxBuffer1[RxCounter1-4];
    					Cw=RxBuffer1[RxCounter1-3];
    					Ch=RxBuffer1[RxCounter1-2];
              printf("%d\r   ",Cx);
              printf("%d\r   ",Cy);
              printf("%d\r   ",Cw);
              printf("%d\r\n",Ch); 
    					}
    			}
    		
    				else if(RxState==3)//检测是否接受到结束标志
    				{
    						if(RxBuffer1[RxCounter1-1] == 0x5B)
    						{
    									//RxFlag1 = 0;
    									RxCounter1 = 0;
    									RxState = 0;
    						}
    						else   //接收错误
    						{
    									RxState = 0;
    									RxCounter1=0;
    									for(i=0;i<10;i++)
    									{
    											RxBuffer1[i]=0x00;      //将存放数据数组清零
    									}
    						}
    				} 
    	
    				else   //接收异常
    				{
    						RxState = 0;
    						RxCounter1=0;
    						for(i=0;i<10;i++)
    						{
    								RxBuffer1[i]=0x00;      //将存放数据数组清零
    						}
    				}
          }
    

    openmv.h

    #ifndef __OpenMV_H
    #define	__OpenMV_H
    
    #include "stm32f1xx.h"
    
    void  Openmv_Receive_Data(int16_t data);
     
     
     
    #endif
    
    

    主函数里面没什么太多的内容,主要是开启中断接收,以及一些变量的定义

      /* USER CODE BEGIN 2 */
    HAL_UART_Receive_IT(&huart2,(void *)&USART2_RXbuff,1);
    HAL_UART_Receive_IT(&huart1,(void *)&USART1_RXbuff,1);
      /* USER CODE END 2 */
    
    /* USER CODE BEGIN PV */
    uint8_t USART1_RXbuff;  // 接收缓冲区;
    uint8_t USART2_RXbuff;
    		uint8_t ch = 0;
    

    cubemx 配置很简单
    在这里插入图片描述

    最后就是接线的问题啦!!
    在这里插入图片描述
    完成,收工,有问题就私聊吧!!!

    展开全文
  • 超详细OpenMV与STM32单片机通信 (有完整版源码)

    万次阅读 多人点赞 2021-05-04 01:56:49
    最近在做电磁炮,发现题目需要用到颜色跟踪,于是花了一点时间学了一下OpenMV,只学习OpenMV是远远不够的,还需要实现单片机的通信,本以为很简单,在CSDN上找了一些代码,直接拿来修改粘贴,把代码看明白了,这些...
  • 基于OpenMV与STM32的寻球小车 实现的小功能有: ①设别颜色小球,并自动追寻小球 ②简单测试颜色小球的粗略距离,并且在小球10cm处停车 ③按键调节PID参数以及调节识别的颜色
  • 首先,我使用STM 32单片机有2 年左右的时间了,但是openmv却不足一个月的时间,由于近几天问我关于两者之间如何进行通讯问题的人比较多,所以特地写这样一篇文章进行讲解。如果有什么讲的不对的地方,还请各位读者...
  • OpenMVSTM32串口通讯

    2021-07-26 22:15:43
    利用串口进行OpenMV与STM32(其他单片机同理)进行通讯 OpenMV程序: from pyb import UART import struct def sending_data(x1,y1): data =struct.pack("<bbhhb", #格式为四个字符俩个短整型(2字节) 0x2C, #...
  • Openmv Stm32f407通信

    千次阅读 多人点赞 2020-12-20 12:28:48
    Openmv Stm32f407通信入门学习记录大概思路代码 入门学习记录 学习中接触到了openmv ,发现视觉也挺好玩的,openmv视觉处理的数据经常要传到另一个单片机,这里openmv用的是stm32h7,用的串口串口3。控制板是stm...
  • openmvstm32串口通信完成二维码识别

    千次阅读 多人点赞 2021-03-21 22:28:25
    openmvstm32串口通信完成二维码...openmv4通过串口通信加json与stm32f103完成通信,结果由stm32所连的lcd屏显示 一、所用的硬件: openmv4、正点原子的mini板(stm32f103rct6)、正点原子配套的lcd屏。 示例:panda
  • OPENMV-STM32串口通信

    千次阅读 2021-10-08 11:27:50
    OPENMV-STM32串口通信 目录标题OPENMV-STM32串口通信前言硬件选择硬件的通信连接OPENMV软件分析效果展示图 前言 最近要准备工巡赛,突然要发现需要进行视觉传动,所以我最近几天又温顾了一下Openmv,以前学习Openmv都...
  • OpenMvSTM32通信

    千次阅读 多人点赞 2021-06-07 11:33:33
    最近一段时间都在捣鼓OpenMVStm32通信问题,刚开始不知道哪里出了问题,一直通信失败,明明使用TTL串口接收OpenMv发送的数据是可以在串口调试助手上显示的,但就是无法发给Stm32的USART串口。经过了差不多一周的...
  • 学习笔记:openmv与STM32串口传输数据的解析程序

    千次阅读 多人点赞 2019-10-19 21:37:08
    学习笔记:openmv与STM32串口传输数据的解析程序 学习初衷 大四毕业设计需要用到openmv与STM32之间的数据传输 由于之前没有学过Python,所以在openmvide编写程序时遇到很多问题。但是不得不说Python是真的好用...
  • STM32单片机与Openmv串口通信

    万次阅读 多人点赞 2019-03-24 21:43:31
    openmv与stm32串口通信简谈闲话Openmv主要代码STM32单片机的配置运行效果图片如下 简谈闲话 这两天本人利用周末时间粗略的学习一下openmv的使用,目的是用openmv图像处理数据并通过串口发送数据给STM32F103的...
  • OpenMV&&stm32通信

    千次阅读 多人点赞 2020-02-19 01:53:17
    stm32通信 目录: 1.开篇之言 2.简单介绍 3.主要代码 4.结篇之语 ------------------------------------------------------------------------------------------- 1.开篇之言 (不用看这,都是废话) ……由于新型...
  • stm32与openmv串口通信
  • 之前用openmv进行颜色识别然后与STM32通过串口通信,但是STM32接收到的图像中心坐标与openmv中的实际坐标有时候会不同。所以想尝试一下openmv与STM32之间到其他通信方式,
  • 我用openmv串口3发送一帧数据,像这样B3 B3 d 1a 1c d1 5d 85 ,前两个b3是帧头,后六个是数据,使用串口助手,可以在电脑上接收到。同样使用串口助手将从openmv接收到的数据原封不动发送到单片机上,发现能完美...
  • OpenMV识别色块并且与STM32串口通信

    千次阅读 多人点赞 2019-10-01 23:11:32
    OpenMV与STM32通信的方式是串口通信,使用openmv简单的串口配置。 因为视觉部分有两个任务,所以用单片机给STM32发送“1”,开始颜色识别,发送“2”,开始特征点识别。不发送则不识别。 识别色块 代码使用了OpenMV...
  • stm32与open mv通信并配有PID算法控制小车车速,基于uart通信,PID控速。 stm32与open mv通信并配有PID算法控制小车车速,基于uart通信,PID控速。 stm32与open mv通信并配有PID算法控制小车车速,基于uart通信,PID...
  • OPENMVSTM32通信

    千次阅读 多人点赞 2019-12-28 19:05:50
    OPENMV端 import sensor, image, time, math from pyb import UART uart = UART(3,38400) sensor.reset() sensor.set_pixformat(sensor.GRAYSCALE) sensor.set_framesize(sensor.VGA) sensor.set_windowing((640, 50...
  • 前提:软件安装学习视频讲解 在我们使用openmv中的神经网络时,在新的版本里是没有nn的库给你调用的,需要在老版本里才有,百度云链接:https://pan.baidu.com/s/1bgLiLMxyqqL9X3h5dN8cZA提取码:behn (光这个能...
  • OPENMVSTM32的识别追踪小车(详细版)之STM32

    万次阅读 多人点赞 2020-02-24 21:41:07
    OPENMVSTM32的识别追踪小车(详细版)之STM32端 二:STM32的介绍以及程序 2.1(STM32F407介绍) STM32F407提供了工作频率为168 MHz的Cortex...串口1:PA9/10复用为串口1用于和OPENMV通信。 PWM:PA6/7复用为定时器3...
  • STM32与OpenMV通信的几点注意【小白级】

    万次阅读 多人点赞 2019-04-17 09:25:50
    STM32F10x与OpenMV串口通信的几点注意 状况描述:STM32OpenMV都能PC通信,但STM32OpenMV两者之间无法实现,甚至STM32未进入串口中断函数。 1.接线 STM32 OpenMV RXD TXD TXD RXD GND GND 注意:...
  • OPENMV识别色块与STM32F4通过串口通信
  • STM32openmv识别追踪小车源码,个别代码可能需要微调,整体功能比如串口通信,接收处理、PID、语音识别等,有比较没这么灵敏的PID,但是也可以使用!整体功能可以使用!
  • 使用的是正点原子的stm32mini板,将openmv3识别到的颜色通过code值传回给STM32.

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 263
精华内容 105
关键字:

openmv与stm32串口通信