当前位置:   article > 正文

关于openmv与stm32通信数据传输遇到的问题_stm32单片机openmv

stm32单片机openmv

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


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

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

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

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


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

  1. uart = UART(1,115200) #定义串口1变量
  2. uart.init(115200, bits=8, parity=None, stop=1)
  3. def sending_data(cx,cy,cw,ch):
  4. global uart;
  5. data = bytearray([0x2c,0x12,cx,cy,cw,ch,0x5b])
  6. uart.write(data);
  7. while(True):
  8. if detect_circle(): #识别圆
  9. sending_data(YUAN_X,YUAN_Y,YUAN_R,YUAN_R) #发送数据
  10. print(YUAN_X,YUAN_Y,YUAN_R,YUAN_R) #打印数据
  11. if(uart.any()):
  12. r=uart.read()
  13. print("%c4",r) #打印stm32发来的数据

stm32端的代码

  1. //USART1 中断服务函数
  2. void USART1_IRQHandler(void)
  3. {
  4. u8 com_data;
  5. u8 i;
  6. static u8 RxCounter1=0;
  7. static u16 RxBuffer1[10]={0};
  8. static u8 RxState = 0;
  9. if( USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) //接收中断
  10. {
  11. USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志位
  12. com_data = USART_ReceiveData(USART1);
  13. LED1=0; //打开LED灯
  14. if(RxState==0&&com_data==0x2C) //判断帧头是否为0x2c
  15. {
  16. RxState=1;
  17. RxBuffer1[RxCounter1++]=com_data;
  18. LED1=1;
  19. }
  20. else if(RxState==1&&com_data==0x12) //判断帧头是否为0x12
  21. {
  22. LED1=0;
  23. RxState=2;
  24. RxBuffer1[RxCounter1++]=com_data;
  25. }
  26. else if(RxState==2)
  27. {
  28. RxBuffer1[RxCounter1++]=com_data;
  29. if(RxCounter1>=10||com_data == 0x5B) //RxBuffer1接收满了,或者检测到帧尾0x5B
  30. {
  31. RxState=3;
  32. Cx=RxBuffer1[RxCounter1-5];
  33. Cy=RxBuffer1[RxCounter1-4];
  34. Cw=RxBuffer1[RxCounter1-3];
  35. Ch=RxBuffer1[RxCounter1-2];
  36. LED1=1;
  37. //printf("%d,%d,%d,%d\n",Cx,Cy,Ch,Cw);
  38. }
  39. }
  40. else if(RxState==3) //检查是否接收到结束标志位
  41. {
  42. if(RxBuffer1[RxCounter1-1] == 0x5B)
  43. {
  44. USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);//关闭中断
  45. RxCounter1 = 0;
  46. RxState = 0;
  47. //LED1=0;
  48. printf("%d,%d,%d,%d\n",Cx,Cy,Cw,Ch);
  49. USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  50. //printf("%d,%d,%d,%d\n",Cx,Cy,Cw,Ch);
  51. }
  52. else //接收错误
  53. {
  54. RxState = 0;
  55. RxCounter1=0;
  56. for(i=0;i<10;i++)
  57. {
  58. RxBuffer1[i]=0x00; //将接收数组清空
  59. LED1=0;
  60. }
  61. }
  62. }
  63. else //接收异常
  64. {
  65. RxState = 0;
  66. RxCounter1=0;
  67. for(i=0;i<10;i++)
  68. {
  69. RxBuffer1[i]=0x00; //将接收数组清空
  70. //LED1=0;
  71. }
  72. }
  73. }
  74. }

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/457325
推荐阅读
相关标签
  

闽ICP备14008679号