stm32与OPENMV通信
openmv通过将采集的图像进行二值化,将数据通过串口的形式与stm32单片机的串口之间进行通信
这里给出STM32接受的代码
// 串口中断服务函数
void DEBUG_USART_IRQHandler(void)
{
uint8_t com_data;
uint8_t i;
static u8 RxCounter1=0;
static u16 RxBuffer1[10]={0};
static u8 RxState = 0;
static u8 RxFlag1 = 0;
if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
{
com_data = USART_ReceiveData(DEBUG_USARTx);
if(RxState==0&&com_data==0x2C) //0x2c帧头
{
RxState=1;
RxBuffer1[RxCounter1++]=com_data;
}
else if(RxState==1&&com_data==0x12) //0x12帧头
{
RxState=2;
RxBuffer1[RxCounter1++]=com_data;
}
else if(RxState==2)
{
RxBuffer1[RxCounter1++]=com_data;
if(RxCounter1>=10||com_data == 0x5B) //RxBuffer1接受满了,接收数据结束
{
RxState=3;
RxFlag1=1;
Cx=RxBuffer1[RxCounter1-5];
Cy=RxBuffer1[RxCounter1-4];
Cw=RxBuffer1[RxCounter1-3];
Ch=RxBuffer1[RxCounter1-2];
}
}
else if(RxState==3) //检测是否接受到结束标志
{
if(RxBuffer1[RxCounter1-1] == 0x5B)
{
USART_ITConfig(DEBUG_USARTx,USART_IT_RXNE,DISABLE);//关闭DTSABLE中断
if(RxFlag1==1)//接受完全数据,进行数据处理
{
// TFT_ShowNumber_SignedInteger_16x16(0,0,Cx,3,Red,Black);
// OLED_Refresh();
// OLED_ShowNum(0, 0,Cx,3,16,1);
// OLED_ShowNum(0,17,Cy,3,16,1);
// OLED_ShowNum(0,33,Cw,3,16,1);
// OLED_ShowNum(0,49,Ch,3,16,1);
Delay(0x0FFFFF);
Delay(0x0FFFFF);
Delay(0x0FFFFF);
Delay(0x0FFFFF);
Delay(0x0FFFFF);
}
RxFlag1 = 0;
RxCounter1 = 0;
RxState = 0;
USART_ITConfig(DEBUG_USARTx,USART_IT_RXNE,ENABLE);
}
else //接收错误
{
TFT_ShowString_16x16(40,40,"error",Red,Black);
RxState = 0;
RxCounter1=0;
for(i=0;i<10;i++)
{
RxBuffer1[i]=0x00; //将存放数据数组清零
}
}
}
else //接收异常
{
TFT_ShowString_16x16(40,40,"error2",Red,Black);
RxState = 0;
RxCounter1=0;
for(i=0;i<10;i++)
{
RxBuffer1[i]=0x00; //将存放数据数组清零
}
}
}
}
发送的数据结构是 [数据] ,通过检测 "["开头,检测“]”为结束。