前言:
补上一篇文章的漏洞,这章讲一下k210和stm32串口通信
其实openmv和k210通信代码是一样的
此部分串口通信的意义:
这边是拿k210发送数据到stm32单片机
但是直接拿串口助手去接收得到的都是ascii码,单片机读不到正确的数据
然后使用这种帧头针尾方法确实可以,测试可以使用
后面知道python的
uart.write
只发送字符或者字符串
k210,canmv串口配置:
全部代码都在上一章了:这里只是截取
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数据按字节存储据
stm32端代码:
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