最小系统:STM32F103RCT6
开发环境:STM32CUBEIDE
实现功能:OPENMV作为上位机发送识别物体后获取的坐标信息,加上帧头帧尾表示信息结构

举个例子,如果你需要发送两个坐标(x,y),发送的坐标信息之间没有间隔。那数据流应该是这个样子:xyxyxyxyxyxy
单片机在接受时很容易分不清本次接收的值是x坐标还是y坐标。所以直接发送直接接收是不可行的。
我们可以定义自己的数据包,定义帧头帧尾 将自定义规则的数据放在中间(不追求严谨可不考虑校验位)。

代码:

/*
 * protol.h
 *
 *  Created on: 2020年9月27日
 *      Author: kindresy
 */

#ifndef INC_PROTOL_H_
#define INC_PROTOL_H_



#include "usart.h"
#include "string.h"
#include "stdio.h"
#include "stdbool.h"

#define  DataLength 24

typedef struct __Protol_HandleTypedef
{
	uint8_t  FrameHead;
	uint8_t  FrameTail;
	uint8_t  Rxpacker[DataLength];
	uint8_t  rec;
	uint8_t  count;
	uint8_t  data;
	bool  packflag;

}ProtolHandleTypedef;

void Protol_Init(uint8_t  FrameHead,uint8_t  FrameTail,ProtolHandleTypedef * protol);
bool Usart_DataGet(ProtolHandleTypedef * protol);

#endif /* INC_PROTOL_H_ */

/*
 * protol.c
 *
 *  Created on: 2020年9月27日
 *      Author: kindresy
 */
#include "protol.h"

void Protol_Init( uint8_t  FrameHead,
				   uint8_t  FrameTail,
				   ProtolHandleTypedef * protol)
{
	protol->FrameTail=FrameTail;
	protol->FrameHead=FrameHead;
	memset(protol->Rxpacker,0,DataLength);
	protol->packflag=false;
	protol->rec     =0;
	protol->count   =0;
	protol->data    =0;
}

bool Usart_DataGet(ProtolHandleTypedef * protol)
{

	if(protol->data == protol->FrameHead)
	{

		memset(protol->Rxpacker,0,DataLength);
		protol->rec=1;
		protol->count=0;
		protol->packflag=false;
		return protol->packflag;

	}

	else if(protol->data == protol->FrameTail)
	{

		protol->rec=0;
		protol->packflag=true;

	}

	if(protol->rec)
	{

		protol->Rxpacker[protol->count++]=protol->data;
		protol->packflag=false;

	}
	return protol->packflag;

}

ProtolHandleTypedef ov_usart;
ProtolHandleTypedef * ov_usarthandler=&ov_usart;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart == &huart1)
	{
		if(Usart_DataGet(ov_usarthandler))
		{
			HAL_UART_Transmit(&huart2,&(ov_usarthandler->data),1,100);

		}
	}
	HAL_UART_AbortReceive_IT(&huart1);
	HAL_UART_Receive_IT(&huart1,&(ov_usarthandler->data),1);
}

int main()
{
	//..........
	Protol_Init(0xff,0xfe,ov_usarthandler);
	HAL_UART_Transmit_IT(&huart1,&ov_usarthandler->data,1);

}

需要注意的事:
HAL库的串口接收中断每次接收完毕都需要重新开启
HAL_UART_Transmit_IT(&huartx,&protol->data,1);

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐