赞
踩
遇到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;
- }
- }
-
- }
- }

本人小白,欢迎大家指出错误。也希望能和大佬们多交流!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。