当前位置:   article > 正文

openmv与stm32串口通信数据传输_stm32f429连接openmv

stm32f429连接openmv

在openmv与stm32数据传输过程中遇到了奇怪的问题。

先说明我遇到的问题,后面又源码。

若发现问题-------或者有什么想法-------还望指教!!!

我的目的:

openmv矩形识别,获取中心点坐标,通过串口发给stm32接受数据

我在main函数中,将存放的数据打印出来,然而并没有。如图

排除:

openmv通过USB->TTL,传输数据为 data = bytearray([0xb3,0xb3,cx,cy,0x0d,0x0a]) ,发现PC端接受的数据为如图:

数据是正确的。

再检查stm32与PC端的自收发,

openmv和stm32单独和PC通信是正常的,现在如何stn32进入中断,接受openmv传来的数据?

下面是我的openmv代码:

  1. import sensor, image, time, math, pyb
  2. from pyb import UART, LED
  3. import json
  4. import ustruct
  5. LED_R = pyb.LED(1)
  6. LED_G = pyb.LED(2)
  7. LED_B = pyb.LED(3)
  8. LED_R.on()
  9. LED_G.on()
  10. LED_B.on()
  11. red_threshold_01 = ((100, 12, -98, 127, -128, 127));
  12. sensor.reset()
  13. sensor.set_pixformat(sensor.RGB565)
  14. sensor.set_framesize(sensor.QVGA)
  15. sensor.skip_frames(time = 2000)
  16. sensor.set_auto_gain(False)
  17. sensor.set_auto_whitebal(False)
  18. clock = time.clock()
  19. clock.tick()
  20. LED_G.off()
  21. uart = UART(4,115200) #设置串口波特率,与stm32一致
  22. uart.init(115200, bits=8, parity=None, stop=1 )
  23. def find_max(blobs):
  24. max_size=0
  25. for blob in blobs:
  26. if blob.pixels() > max_size:
  27. max_blob = blob
  28. max_size = blob.pixels()
  29. return max_blob
  30. def sending_data(cx,cy):
  31. global uart;
  32. data = bytearray([0xb3,0xb3,cx,cy,0x0d,0x0a])
  33. uart.write(data); #传入字节数组
  34. while(True):
  35. clock.tick()
  36. img = sensor.snapshot()
  37. blobs = img.find_blobs([red_threshold_01]);
  38. cx=0;cy=0;
  39. if blobs:
  40. # 如果找到了目标元素
  41. max_b = find_max(blobs);
  42. #
  43. img.draw_rectangle(max_b[0:4])
  44. # 用矩形标记处颜色区域
  45. img.draw_cross(max_b[5], max_b[6])
  46. # 在中心画标记
  47. # 在目标颜色区域的中心画十字形标记
  48. cx=max_b[5];
  49. cy=max_b[6];
  50. sending_data(cx,cy);
  51. print("x=%d y=%d"%(cx,cy));
  52. #time.sleep(500)

 下面是stm32中的代码:

usart.c的:

  1. #include "sys.h"
  2. #include "usart.h"
  3. #include "key.h"
  4. #include "led.h"
  5. #include "openmv.h"
  6. //
  7. //如果使用ucos,则包括下面的头文件即可.
  8. #if SYSTEM_SUPPORT_UCOS
  9. #include "includes.h" //ucos 使用
  10. #endif
  11. //
  12. //串口1初始化
  13. //STM32F4工程-库函数版本
  14. //淘宝店铺:http://mcudev.taobao.com
  15. //********************************************************************************
  16. //
  17. //
  18. //加入以下代码,支持printf函数,而不需要选择use MicroLIB
  19. #if 1
  20. #pragma import(__use_no_semihosting)
  21. //标准库需要的支持函数
  22. struct __FILE
  23. {
  24. int handle;
  25. };
  26. FILE __stdout;
  27. //定义_sys_exit()以避免使用半主机模式
  28. void _sys_exit(int x)
  29. {
  30. x = x;
  31. }
  32. //重定义fputc函数
  33. int fputc(int ch, FILE *f)
  34. {
  35. while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
  36. USART1->DR = (u8) ch;
  37. return ch;
  38. }
  39. #endif
  40. #if EN_USART1_RX //如果使能了接收
  41. //串口1中断服务程序
  42. //注意,读取USARTx->SR能避免莫名其妙的错误
  43. u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
  44. //接收状态
  45. //bit15, 接收完成标志
  46. //bit14, 接收到0x0d
  47. //bit13~0, 接收到的有效字节数目
  48. u16 USART_RX_STA=0; //接收状态标记
  49. //u8 RxBuffer1[14];
  50. //u8 RxCounter1 = 0;
  51. //u8 RxFlag1 = 0;
  52. //static uint8_t rebuf[8]={0};
  53. //初始化IO 串口1
  54. //bound:波特率
  55. void uart_init(uint32_t bound){
  56. //GPIO端口设置
  57. GPIO_InitTypeDef GPIO_InitStructure;
  58. USART_InitTypeDef USART_InitStructure;
  59. NVIC_InitTypeDef NVIC_InitStructure;
  60. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
  61. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
  62. //串口1对应引脚复用映射
  63. GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
  64. GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1
  65. //UART_TX IO配置
  66. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ; //GPIOA9
  67. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  68. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
  69. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
  70. // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
  71. GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9
  72. //UART_RX IO配置
  73. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ; //GPIOA10
  74. // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入功能
  75. // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
  76. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  77. GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA10
  78. //USART1 初始化设置
  79. USART_DeInit(USART1);
  80. USART_InitStructure.USART_BaudRate = bound;//波特率设置
  81. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  82. USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  83. USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  84. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  85. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
  86. USART_Init(USART1, &USART_InitStructure); //初始化串口1
  87. USART_ClearFlag(USART1,USART_FLAG_TXE);//清除发送标志位
  88. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//中断使能
  89. USART_Cmd(USART1, ENABLE); //使能串口1
  90. //Usart1 NVIC 配置
  91. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
  92. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级1
  93. NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; //子优先级0
  94. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
  95. NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、
  96. }
  97. void USART1_IRQHandler(void)//串口1中断服务程序
  98. {
  99. u8 com_data;
  100. //USART_IT_RXNE 替换为? USART_FLAG_ORE
  101. if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  102. {
  103. //与PC测试用
  104. // USART_ClearFlag(USART1,USART_FLAG_RXNE);
  105. // USART_SendData(USART1,USART_ReceiveData(USART1));
  106. printf("point");
  107. USART_ClearFlag(USART1,USART_FLAG_RXNE);
  108. com_data = USART_ReceiveData(USART1);
  109. Openmv_Receive_Data(com_data); //openmv数据处理函数
  110. Openmv_Data(); //openmv数据显示函数
  111. com_data=0;
  112. // USART_ClearITPendingBit(USART1,USART_IT_RXNE);
  113. // while(USART_GetITStatus(USART1,USART_FLAG_TC) == RESET);
  114. }
  115. }
  116. #endif
  117. //openmv的接受函数

openmv.c代码:

  1. #include "openmv.h"
  2. #include "led.h"
  3. #include "stm32f4xx.h"
  4. int openmv[7]; //stm32接收数据数组
  5. int16_t OpenMV_X; //cx
  6. int16_t OpenMV_Y; //cy
  7. int8_t Distance; //距离
  8. //距离是没有接受的
  9. int i = 0;
  10. void Openmv_Receive_Data(int16_t data)
  11. {
  12. static u8 state = 0;
  13. if(state == 0 && data == 0xb3)
  14. {
  15. state = 1;
  16. openmv[0] = data;
  17. }
  18. else if(state == 1 && data == 0xb3)
  19. {
  20. state = 2;
  21. openmv[1] = data;
  22. }
  23. else if(state == 2)
  24. {
  25. state = 3;
  26. openmv[2] = data;
  27. }
  28. else if(state == 3)
  29. {
  30. state = 4;
  31. openmv[3] = data;
  32. }
  33. else if(state == 4)
  34. {
  35. state = 5;
  36. openmv[4] = data;
  37. }
  38. else if(state == 5)
  39. {
  40. state = 6;
  41. openmv[5] = data;
  42. }
  43. else if(state == 6) // 检测是否接收到结束标志
  44. {
  45. if(data == 0x0a)
  46. {
  47. state = 0;
  48. LED1 =~ LED1;
  49. openmv[6] = data;
  50. Openmv_Data();
  51. data = 0;
  52. }
  53. else if(data != 0x0a)
  54. {
  55. state = 0;
  56. for(i = 0;i < 7;i++)
  57. {
  58. openmv[i] = 0x00;
  59. }
  60. }
  61. }
  62. else
  63. {
  64. state = 0;
  65. data = 0;
  66. LED1 = 0;
  67. for(i = 0;i < 7;i++)
  68. {
  69. openmv[i] = 0x00;
  70. }
  71. }
  72. }
  73. void Openmv_Data(void)
  74. {
  75. OpenMV_X = openmv[2];
  76. OpenMV_Y = openmv[3];
  77. Distance = openmv[4];
  78. //这里distance应该是\r
  79. }

这是整个工程的文件包

链接:https://pan.baidu.com/s/1ZMj_XRitgZsoTnB7Q9s9iw 
提取码:5k6t

请指教!!!请指教!!!请指教!!!请指教!!!请指教!!!

如果提供技术支持的话,可以考虑有偿

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

闽ICP备14008679号