当前位置:   article > 正文

【学习笔记】stm32+openmv串口通信实现颜色识别_bytearray openmv

bytearray openmv

个人笔记。这是之前的一个实验,现在把它整理出来。

本实验用的是stm32h743和openmv作为硬件,实现用openmv识别出我们想要的颜色,将获取的颜色坐标和目标区域的宽、高 通过串口发送给 stm32,最后在串口助手中显示。

硬件连接:

stm32                openmv

rx                           p4

tx                         p5

GND                   GND

openmv程序:

 

img_data=bytearray([0x2C,7,1,2,3,4,0X5B])用到了bytearry(),所以在openmv程序开头要import math,第0位为开始标志,最后一位为结束标志,第1位为总位数7,其他为要传输的数据。 

stm32程序:

openmv

  1. void Openmv_Receive_Data(int16_t data)//接收Openmv传过来的数据
  2. {
  3. static uint8_t state = 0; //state判断openmv代码中bytearry()的第几位
  4. if(state==0&&data==0x2C) //开始位
  5. {
  6. state=1;
  7. openmv[0]=data;
  8. }
  9. else if(state==1&&data==7)
  10. {
  11. state=2;
  12. openmv[1]=data;
  13. }
  14. else if(state==2) //第一有效位
  15. {
  16. state=3;
  17. openmv[2]=data;
  18. }
  19. else if(state==3)
  20. {
  21. state = 4;
  22. openmv[3]=data;
  23. }
  24. else if(state==4)
  25. {
  26. state = 5;
  27. openmv[4]=data;
  28. }
  29. else if(state==5) //第四有效位
  30. {
  31. state = 6;
  32. openmv[5]=data;
  33. }
  34. else if(state==6) //检测是否接受到结束标志
  35. {
  36. if(data == 0x5B)
  37. {
  38. state = 0;
  39. openmv[6]=data;
  40. Openmv_Data();
  41. }
  42. else if(data != 0x5B)
  43. {
  44. state = 0;
  45. for(i=0;i<7;i++)
  46. {
  47. openmv[i]=0x00;
  48. }
  49. }
  50. }
  51. else
  52. {
  53. state = 0;
  54. for(i=0;i<7;i++)
  55. {
  56. openmv[i]=0x00;
  57. }
  58. }
  59. }
  60. void Openmv_Data(void)
  61. {
  62. data1=openmv[2]; //第一个有效位
  63. data2=openmv[3];
  64. data3=openmv[4];
  65. data4=openmv[5];
  66. }

usart

  1. uint8_t ucaRxBuf[256];
  2. uint16_t usRxCount=0;
  3. extern uint8_t Rxflag;
  4. extern int ucTemp;
  5. void DEBUG_USART_IRQHandler(void)
  6. {
  7. if(__HAL_UART_GET_IT( &UartHandle, UART_IT_RXNE ) != RESET)
  8. {
  9. Rxflag=1;
  10. HAL_UART_Receive(&UartHandle, (uint8_t *)&ucTemp, 1, 1000); // (uint8_t *)
  11. Openmv_Receive_Data(ucTemp);
  12. Openmv_Data();
  13. if((Rxflag&0x8000)==0)//接收未完成
  14. {
  15. if(Rxflag&0x4000)//接收到了0x0d
  16. {
  17. if(ucTemp!=0x0a)Rxflag=0;//接收错误,重新开始
  18. else Rxflag|=0x8000; //接收完成了
  19. }
  20. else //还没收到0X0D
  21. {
  22. if(ucTemp==0x0d)Rxflag|=0x4000;
  23. else
  24. {
  25. ucaRxBuf[Rxflag&0X3FFF]=ucTemp ;
  26. Rxflag++;
  27. if(Rxflag>(usRxCount-1))Rxflag=0;//接收数据错误,重新开始接收
  28. }
  29. }
  30. }
  31. }
  32. // HAL_UART_IRQHandler(&UartHandle);
  33. }
  34. void GET_USART1DATE(void) //接收到USART数据
  35. {
  36. if(Rxflag)
  37. {
  38. if (usRxCount < sizeof(ucaRxBuf))
  39. {
  40. ucaRxBuf[usRxCount] = ucTemp; //把数据放在缓冲区里
  41. // Openmv_Receive_Data(ucaRxBuf[usRxCount++]);
  42. // Openmv_Data();
  43. }
  44. else
  45. {
  46. usRxCount = 0;
  47. }
  48. /* 简单的通信协议,遇到回车换行符认为1个命令帧,可自行加其它判断实现自定义命令 */
  49. /* 遇到换行字符,认为接收到一个命令 */
  50. if (ucTemp == 0x0A) /* 换行字符 */
  51. {
  52. /*检测到有回车字符就把数据返回给上位机*/
  53. HAL_UART_Transmit( &UartHandle, (uint8_t *)ucaRxBuf,usRxCount,1000 );
  54. usRxCount = 0;
  55. }
  56. Rxflag=0;
  57. }
  58. }

这是串口中断部分。串口配置部分直接用CubeMX生成就可以,也可到野火或原子找串口例程。

main

  1. volatile uint8_t Rxflag=0; //接收完成标志:0表示未完成,1表示接收完成
  2. uint8_t ucTemp; //数据变量
  3. int main(void)
  4. {
  5. uint8_t ucaRxBuf[256]; //接收缓冲,定义最大接收字节数 256
  6. uint16_t usRxCount=0;
  7. SystemClock_Config();
  8. /* 配置串口1为:115200 8-N-1 */
  9. USART_Config();
  10. while(1)
  11. {
  12. printf("%.d %.d %.d %.d\r\n",data1,data2,data3,data4);
  13. }
  14. }

实验现象:

 以最后一组数据为例:

openmv数据为167   95  6   7

stm32接收的16进制数据为2C   07   A7  5F   06  07  5B

数据匹配。

注意:

1、硬件连接别连错

2、使用其他型号的stm32也可以,只不过串口引脚可能不一样,其他的都可通用。

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

闽ICP备14008679号