当前位置:   article > 正文

K210和stm32串口通信_canmv与stm32串口通信

canmv与stm32串口通信

前言:

补上一篇文章的漏洞,这章讲一下k210和stm32串口通信

其实openmv和k210通信代码是一样的

此部分串口通信的意义:

这边是拿k210发送数据到stm32单片机

但是直接拿串口助手去接收得到的都是ascii码,单片机读不到正确的数据

然后使用这种帧头针尾方法确实可以,测试可以使用

后面知道python的

uart.write

只发送字符或者字符串

k210,canmv串口配置:

全部代码都在上一章了:这里只是截取

  1. from machine import UART,Timer
  2. fm.register(6, fm.fpioa.UART1_RX, force=True)
  3. fm.register(7, fm.fpioa.UART1_TX, force=True)
  4. uart = UART(UART.UART1, 115200, read_buf_len=4096)#设置波特率,缓冲区
  5. x = max_blob.cx()
  6. y = max_blob.cy()
  7. data = bytearray([0xb3,0xa3,x,y,0x0d,0x0a]) #要发送的数据 bytearray数据按字节存储据

stm32端代码:

usart2.h:

  1. #ifndef __USART2_H
  2. #define __USART2_H
  3. #include "stdio.h"
  4. #include "sys.h"
  5. #define USART2_REC_LEN 200 //定义最大接收字节数 200
  6. #define EN_USART2_RX 1 //使能(1)/禁止(0)串口1接收
  7. #define MAX_DATA_LENS 10
  8. extern u8 USART2_RX_BUF[USART2_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
  9. extern u16 USART2_RX_STA; //接收状态标记
  10. //如果想串口中断接收,请不要注释以下宏定义
  11. void uart2_init(u32 bound);
  12. #endif

usart2.c:

  1. #include "sys.h"
  2. #include "usart2.h"
  3. #include "openmv.h"
  4. #include "stm32f10x.h"
  5. //如果使用ucos,则包括下面的头文件即可.
  6. #if SYSTEM_SUPPORT_OS
  7. #include "includes.h" //ucos 使用
  8. #endif
  9. //加入以下代码,支持printf函数,而不需要选择use MicroLIB
  10. //#if 1
  11. //#pragma import(__use_no_semihosting)
  12. 标准库需要的支持函数
  13. //struct __FILE
  14. //{
  15. // int handle;
  16. //};
  17. //FILE __stdout;
  18. 定义_sys_exit()以避免使用半主机模式
  19. //void _sys_exit(int x)
  20. //{
  21. // x = x;
  22. //}
  23. 重定义fputc函数
  24. //int fputc(int ch, FILE *f)
  25. //{
  26. // while((USART2->SR&0X40)==0);//循环发送,直到发送完毕
  27. // USART2->DR = (u8) ch;
  28. // return ch;
  29. //}
  30. //#endif
  31. #if EN_USART2_RX //如果使能了接收
  32. //串口1中断服务程序
  33. //注意,读取USARTx->SR能避免莫名其妙的错误
  34. u8 USART2_RX_BUF[USART2_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
  35. //接收状态
  36. //bit15, 接收完成标志
  37. //bit14, 接收到0x0d
  38. //bit13~0, 接收到的有效字节数目
  39. u16 USART2_RX_STA = 0; //接收状态标记
  40. void uart2_init(u32 bound)
  41. {
  42. GPIO_InitTypeDef GPIO_InitStructure;
  43. USART_InitTypeDef USART_InitStructure;
  44. NVIC_InitTypeDef NVIC_InitStructure;
  45. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟
  46. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //使能USART2
  47. USART_DeInit(USART2);
  48. //USART2_TX GPIOA.2
  49. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
  50. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  51. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  52. GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA.2
  53. //USART2_RX GPIOA.3
  54. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA.3
  55. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  56. GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA.3
  57. //Usart2 NVIC 配置
  58. NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  59. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3 ;//抢占优先级3
  60. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
  61. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
  62. NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
  63. //USART 初始化设置
  64. USART_InitStructure.USART_BaudRate = bound;//串口波特率
  65. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  66. USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  67. USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  68. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  69. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
  70. USART_Init(USART2,&USART_InitStructure); //初始化串口2
  71. USART_ITConfig(USART2,USART_IT_RXNE, ENABLE);//开启串口接受中断
  72. USART_Cmd(USART2,ENABLE); //使能串口2
  73. }
  74. void USART2_IRQHandler(void)//串口2中断服务程序
  75. {
  76. u8 com_data;
  77. if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  78. {
  79. USART_ClearFlag(USART2,USART_FLAG_RXNE);
  80. com_data = USART_ReceiveData(USART2);
  81. Openmv_Receive_Data(com_data); //openmv数据处理函数
  82. Openmv_Data(); //openmv数据显示函数
  83. com_data=0;
  84. }
  85. }
  86. #endif

openmv.h:

  1. #ifndef __OPENMV_H
  2. #define __OPENMV_H
  3. #include "sys.h"
  4. void Openmv_Receive_Data(int16_t data);
  5. void Openmv_Data(void);
  6. #endif

openmv.c

  1. #include "openmv.h"
  2. #include "led.h"
  3. #include "stm32f10x.h"
  4. int openmv[13]; // stm32接收数据数组
  5. int16_t OpenMV_X; // cx
  6. int16_t OpenMV_Y; // cy
  7. int8_t Distance; // 距离
  8. int16_t OpenMV_X1, OpenMV_Y1, OpenMV_X2, OpenMV_Y2, OpenMV_X3,OpenMV_Y4, OpenMV_Y3, OpenMV_X4; // cx; //cx
  9. int index1 = 0; // 接收状态标记
  10. void Openmv_Receive_Data(int16_t data)
  11. {
  12. if (index1 == 0 && data == 0xb3)
  13. {
  14. index1 = 1;
  15. }
  16. else if (index1 >= 1 && index1 < 13)
  17. {
  18. openmv[index1 - 1] = data;
  19. index1++;
  20. }
  21. else if (index1 == 13 && data == 0x0a) // 检测是否接收到结束标志
  22. {
  23. index1 = 0;
  24. Openmv_Data();
  25. }
  26. else
  27. {
  28. index1 = 0;
  29. LED0 = 0;
  30. }
  31. }
  32. void Openmv_Data(void)
  33. {
  34. OpenMV_X1 = openmv[1];
  35. OpenMV_Y1 = openmv[2];
  36. OpenMV_X2 = openmv[3];
  37. OpenMV_Y2 = openmv[4];
  38. OpenMV_X3 = openmv[5];
  39. OpenMV_Y3 = openmv[6];
  40. OpenMV_X4 = openmv[7];
  41. OpenMV_Y4 = openmv[8];
  42. }

工程文件:

链接: https://pan.baidu.com/s/1An3OEcOLr6Ii31d2QdQU3Q?pwd=ria4 提取码: ria4 

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

闽ICP备14008679号