赞
踩
补上一篇文章的漏洞,这章讲一下k210和stm32串口通信
其实openmv和k210通信代码是一样的
这边是拿k210发送数据到stm32单片机
但是直接拿串口助手去接收得到的都是ascii码,单片机读不到正确的数据
然后使用这种帧头针尾方法确实可以,测试可以使用
后面知道python的
uart.write
只发送字符或者字符串
全部代码都在上一章了:这里只是截取
- from machine import UART,Timer
- fm.register(6, fm.fpioa.UART1_RX, force=True)
- fm.register(7, fm.fpioa.UART1_TX, force=True)
- uart = UART(UART.UART1, 115200, read_buf_len=4096)#设置波特率,缓冲区
-
-
- x = max_blob.cx()
- y = max_blob.cy()
- data = bytearray([0xb3,0xa3,x,y,0x0d,0x0a]) #要发送的数据 bytearray数据按字节存储据
usart2.h:
- #ifndef __USART2_H
- #define __USART2_H
-
- #include "stdio.h"
- #include "sys.h"
-
- #define USART2_REC_LEN 200 //定义最大接收字节数 200
- #define EN_USART2_RX 1 //使能(1)/禁止(0)串口1接收
- #define MAX_DATA_LENS 10
-
- extern u8 USART2_RX_BUF[USART2_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
- extern u16 USART2_RX_STA; //接收状态标记
- //如果想串口中断接收,请不要注释以下宏定义
- void uart2_init(u32 bound);
- #endif
usart2.c:
- #include "sys.h"
- #include "usart2.h"
- #include "openmv.h"
- #include "stm32f10x.h"
-
-
- //如果使用ucos,则包括下面的头文件即可.
- #if SYSTEM_SUPPORT_OS
- #include "includes.h" //ucos 使用
- #endif
-
- //加入以下代码,支持printf函数,而不需要选择use MicroLIB
- //#if 1
- //#pragma import(__use_no_semihosting)
- 标准库需要的支持函数
- //struct __FILE
- //{
- // int handle;
-
- //};
-
- //FILE __stdout;
- 定义_sys_exit()以避免使用半主机模式
- //void _sys_exit(int x)
- //{
- // x = x;
- //}
- 重定义fputc函数
- //int fputc(int ch, FILE *f)
- //{
- // while((USART2->SR&0X40)==0);//循环发送,直到发送完毕
- // USART2->DR = (u8) ch;
- // return ch;
- //}
- //#endif
-
- #if EN_USART2_RX //如果使能了接收
- //串口1中断服务程序
- //注意,读取USARTx->SR能避免莫名其妙的错误
- u8 USART2_RX_BUF[USART2_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
- //接收状态
- //bit15, 接收完成标志
- //bit14, 接收到0x0d
- //bit13~0, 接收到的有效字节数目
- u16 USART2_RX_STA = 0; //接收状态标记
-
- void uart2_init(u32 bound)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //使能USART2
-
- USART_DeInit(USART2);
-
- //USART2_TX GPIOA.2
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA.2
-
- //USART2_RX GPIOA.3
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA.3
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
- GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA.3
-
- //Usart2 NVIC 配置
- NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3 ;//抢占优先级3
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
- NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
-
- //USART 初始化设置
- USART_InitStructure.USART_BaudRate = bound;//串口波特率
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
- USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
- USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
-
- USART_Init(USART2,&USART_InitStructure); //初始化串口2
- USART_ITConfig(USART2,USART_IT_RXNE, ENABLE);//开启串口接受中断
- USART_Cmd(USART2,ENABLE); //使能串口2
- }
-
- void USART2_IRQHandler(void)//串口2中断服务程序
- {
- u8 com_data;
- if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
- {
- USART_ClearFlag(USART2,USART_FLAG_RXNE);
- com_data = USART_ReceiveData(USART2);
- Openmv_Receive_Data(com_data); //openmv数据处理函数
- Openmv_Data(); //openmv数据显示函数
- com_data=0;
- }
- }
- #endif
-
openmv.h:
- #ifndef __OPENMV_H
- #define __OPENMV_H
-
- #include "sys.h"
-
- void Openmv_Receive_Data(int16_t data);
- void Openmv_Data(void);
-
- #endif
openmv.c
- #include "openmv.h"
- #include "led.h"
- #include "stm32f10x.h"
-
- int openmv[13]; // stm32接收数据数组
- int16_t OpenMV_X; // cx
- int16_t OpenMV_Y; // cy
- int8_t Distance; // 距离
-
- int16_t OpenMV_X1, OpenMV_Y1, OpenMV_X2, OpenMV_Y2, OpenMV_X3,OpenMV_Y4, OpenMV_Y3, OpenMV_X4; // cx; //cx
-
- int index1 = 0; // 接收状态标记
-
- void Openmv_Receive_Data(int16_t data)
- {
- if (index1 == 0 && data == 0xb3)
- {
- index1 = 1;
- }
- else if (index1 >= 1 && index1 < 13)
- {
- openmv[index1 - 1] = data;
- index1++;
- }
- else if (index1 == 13 && data == 0x0a) // 检测是否接收到结束标志
- {
- index1 = 0;
- Openmv_Data();
- }
- else
- {
- index1 = 0;
- LED0 = 0;
- }
- }
-
- void Openmv_Data(void)
- {
- OpenMV_X1 = openmv[1];
- OpenMV_Y1 = openmv[2];
- OpenMV_X2 = openmv[3];
- OpenMV_Y2 = openmv[4];
- OpenMV_X3 = openmv[5];
- OpenMV_Y3 = openmv[6];
- OpenMV_X4 = openmv[7];
- OpenMV_Y4 = openmv[8];
- }
链接: https://pan.baidu.com/s/1An3OEcOLr6Ii31d2QdQU3Q?pwd=ria4 提取码: ria4
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。