K210和stm32串口通信

前言:

补上一篇文章的漏洞,这章讲一下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 

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式学不会不改名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值