HAL库下串口接收中断接收OPENMV发送的信息
最小系统:STM32F103RCT6开发环境:STM32CUBEIDE实现功能:OPENMV作为上位机发送识别物体后获取的坐标信息,加上帧头帧尾表示信息结构举个例子,如果你需要发送两个坐标(x,y),发送的坐标信息之间没有间隔。那数据流应该是这个样子:xyxyxyxyxyxy单片机在接受时很容易分不清本次接收的值是x坐标还是y坐标。所以直接发送直接接收是不可行的。我们可以定义自己的数据包,定义帧头
·
最小系统: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);
更多推荐
所有评论(0)