解决openmv与stm32通信数据传输问题的方法

 遇到smt32与openmv无法通信,或者数据对不上。


上面的是openmv端发给stm32端的数据
%c4 b‘  ’:是stm32打印接收到的数据

 逐个排查:openmv与pc端串口助手正常发收。stm32与pc端也可以正常发,但是接收数据的时候不能正常接收。
利用LED灯debug。
 确定问题出在stm32端的中断服务函数里反复看中断服务函数,并没有明显的逻辑错误。

经过查找资料发现,因为数据打印用的是串口一,使用时会产生中断。同时单片机接受OpenMV发送的数据使用的是串口一,也会有中断,这时就会产生中断嵌套,导致接受数据错乱。
解决方案:直接不打印数据,等接受完数据之后再打印。
但是发现还是不能正常接收数据。
纯小白,搞了一整天,没错整整是一天,没整出个所以然来。

但是就在今天下午,莫名的就整出来了。通信问题终于是解决问题了。在此记录一下
但是为什么还没弄懂为什么。希望大佬指出!!!


解决后的,可以正常接收数据,数据也是正确的


uart = UART(1,115200)   #定义串口1变量
uart.init(115200, bits=8, parity=None, stop=1) 
def sending_data(cx,cy,cw,ch):
    global uart;

    data = bytearray([0x2c,0x12,cx,cy,cw,ch,0x5b]) 
    uart.write(data);

while(True):
    if detect_circle():           #识别圆
        sending_data(YUAN_X,YUAN_Y,YUAN_R,YUAN_R)  #发送数据
        print(YUAN_X,YUAN_Y,YUAN_R,YUAN_R)        #打印数据
        if(uart.any()):                    
            r=uart.read()
            print("%c4",r)                    #打印stm32发来的数据

stm32端的代码

//USART1 中断服务函数
void USART1_IRQHandler(void)			 
{
		u8 com_data; 
		u8 i;
		static u8 RxCounter1=0;
		static u16 RxBuffer1[10]={0};
		static u8 RxState = 0;	


		if( USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)  	   //接收中断
		{
				USART_ClearITPendingBit(USART1,USART_IT_RXNE);   //清除中断标志位
				com_data = USART_ReceiveData(USART1);
				LED1=0;                                   //打开LED灯
				if(RxState==0&&com_data==0x2C)  //判断帧头是否为0x2c
				{
					RxState=1;
					RxBuffer1[RxCounter1++]=com_data;
					LED1=1;
				}
		
				else if(RxState==1&&com_data==0x12)  //判断帧头是否为0x12
				{
					LED1=0;
					RxState=2;
					RxBuffer1[RxCounter1++]=com_data;
				}
		
				else if(RxState==2)
				{
					RxBuffer1[RxCounter1++]=com_data;

					if(RxCounter1>=10||com_data == 0x5B)     //RxBuffer1接收满了,或者检测到帧尾0x5B
					{
						RxState=3;
						Cx=RxBuffer1[RxCounter1-5];
						Cy=RxBuffer1[RxCounter1-4];
						Cw=RxBuffer1[RxCounter1-3];
						Ch=RxBuffer1[RxCounter1-2];
						LED1=1;
						//printf("%d,%d,%d,%d\n",Cx,Cy,Ch,Cw);
					}
				}
		
				else if(RxState==3)		//检查是否接收到结束标志位
				{
						if(RxBuffer1[RxCounter1-1] == 0x5B)
						{
									USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);//关闭中断
									RxCounter1 = 0;
									RxState = 0;
							//LED1=0;
									printf("%d,%d,%d,%d\n",Cx,Cy,Cw,Ch);
									USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
									//printf("%d,%d,%d,%d\n",Cx,Cy,Cw,Ch);
						}
						else   //接收错误
						{
									RxState = 0;
									RxCounter1=0;
									for(i=0;i<10;i++)
									{
											RxBuffer1[i]=0x00;      //将接收数组清空
										LED1=0;
									}
						}
				} 
	
				else   //接收异常
				{
						RxState = 0;
						RxCounter1=0;
						for(i=0;i<10;i++)
						{
								RxBuffer1[i]=0x00;      //将接收数组清空
							//LED1=0;
						}
				}

		}
}

本人小白,欢迎大家指出错误。也希望能和大佬们多交流!!!
                    

物联沃分享整理
物联沃-IOTWORD物联网 » 解决openmv与stm32通信数据传输问题的方法

发表评论