简明记录以防忘记
openmv端定义函数
def Sending_Data(Num):
global uart;
OutData = bytearray([0xFE,0xBC,Num,0xEF]) #构建发送数据的数据包
uart.write(OutData);
在主函数中需要加入
#include "OpenMV.h"
uint8_t USART1_RXbuff;
HAL_UART_Receive_IT(&huart1,(void *)&USART1_RXbuff,1);;
在usart.c中加入
#include "OpenMV.h"
extern int USART1_RXbuff;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
uint16_t tempt;
if(huart->Instance==USART1)
{
tempt=USART1_RXbuff;
OpenMV_Data_Receive(tempt);
}
HAL_UART_Receive_IT(&huart1,(void *)&USART1_RXbuff,1); //再次开启中断接收
}
在建立openmv.h 和.c
#ifndef __OPENMV_H
#define __OPENMV_H
#include "stm32f4xx.h"
void OpenMV_Data_Receive(int16_t OpenMV_Data); /* STM32接收端处理OpenMV传输的数据 */
#endif
/********************************* (C) COPYRIGHT **********************************
* File Name : openmv.c
* Author : 混分巨兽龙某某
* Version : V1.0.0
* Data : 2023/11/03
* Contact : QQ:1178305328
* Description : OpenMV and STM32 Communication Files
***********************************************************************************/
#include "OpenMV.h"
#include "usart.h"
#include "stdio.h"
#include "OLED.h"
static uint8_t Number = 0;
/* STM32接收端处理OpenMV传输的数据 */
void OpenMV_Data_Receive(int16_t OpenMV_Data)
{
/* 计数变量 */
static uint8_t RxCounter=0; //计数变量
/* 数据接收数组 */
static uint16_t RxBuffer[4]={0};
/* 数据传输状态位 */
static uint8_t RxState = 0;
/* 判断数据是否为有效数据,解码 */
if(RxState == 0 && OpenMV_Data == 0xFE) //0xFE帧头
{
RxState = 1; //状态位改变
RxBuffer[RxCounter++] = OpenMV_Data; //将数据放入接收数组
}
else if(RxState == 1 && OpenMV_Data == 0xBC) //0xBC帧头
{
RxState = 2; //状态位改变
RxBuffer[RxCounter++] = OpenMV_Data; //将数据放入接收数组
}
else if(RxState == 2) //读取目标数据(根据实际情况处理)
{
RxBuffer[RxCounter++] = OpenMV_Data; //将数据放入接收数组
if(RxCounter>=3||OpenMV_Data == 0xEF)
{
RxState = 3; //状态位改变
Number = RxBuffer[RxCounter-1];
/* OLED显示目标数字 */
OLED_ShowNum(0,4,Number,3,16,0);
}
}
else if(RxState == 3) //检测是否接收到标志位
{
if(RxBuffer[RxCounter-1] == 0xEF)
{
/* 计数和状态位归零 */
RxCounter = 0;
RxState = 0;
}
else //接收错误
{
/* 计数和状态位归零 */
RxCounter = 0;
RxState = 0;
/* 清空存放数据的数组 */
for(int i = 0;i < 4; i++)
{
RxBuffer[i] = 0x00;
}
}
}
else //整体的接收异常
{
/* 计数和状态位归零 */
RxCounter = 0;
RxState = 0;
/* 清空存放数据的数组 */
for(int i = 0;i < 4; i++)
{
RxBuffer[i] = 0x00;
}
}
}