本文最后更新于335 天前,其中的信息可能已经过时,如有错误请发送邮件到273925452@qq.com
通信协议
1个数据
u8 Usart_RX_Buf;
u8 code;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
uint8_t i;
static uint8_t RxCounter1=0;//数据缓冲区的索引
static uint8_t RxBuffer1[5]={0};//存放数据的接收缓存区
static uint8_t RxState = 0; //接收标志位
if(RxState==0&&Usart_RX_Buf==0x2C) //0x2c帧头
{
RxState=1;
RxBuffer1[RxCounter1++]=Usart_RX_Buf;//RxBuffer1[0]==0x2c RxCounter1==1
}
else if(RxState==1&&Usart_RX_Buf==0x12) //0x12帧头
{
RxState=2;
RxBuffer1[RxCounter1++]=Usart_RX_Buf;
}
else if(RxState==2)//开始接收有效数据
{
RxBuffer1[RxCounter1++]=Usart_RX_Buf;//全部接收完,RxCounter1==5
if(RxCounter1>=5||Usart_RX_Buf == 0x5B) //RxBuffer1接受满了,接收数据结束
{
RxState=3;
//RxBuffer1[2]是openmv发送的第一个数据的低八位,RxBuffer1[3]是openmv发送的第一个数据的高八位
code=(RxBuffer1[RxCounter1-2]<<8)+(RxBuffer1[RxCounter1-3]);//分为低八位和高八位,先发低后发高
}
}
else if(RxState==3) //检测是否接受到结束标志
{
if(RxBuffer1[RxCounter1-1] == 0x5B)
{
//
// RxFlag1 = 0;
RxCounter1 = 0;
RxState = 0;
HAL_UART_Receive_IT(&huart1,(uint8_t *)&Usart_RX_Buf,1);
}
else //接收错误
{
RxState = 0;
RxCounter1=0;
for(i=0;i<5;i++)
{
RxBuffer1[i]=0x00; //将存放数据数组清零
}
}
}
else //接收异常
{
RxState = 0;
RxCounter1=0;
for(i=0;i<5;i++)
{
RxBuffer1[i]=0x00; //将存放数据数组清零
}
}
HAL_UART_Receive_IT(&huart1,(uint8_t *)&Usart_RX_Buf,1);
}
}
2个数据
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
uint8_t i;
static uint8_t RxCounter1=0;//数据缓冲区的索引
static uint8_t RxBuffer1[7]={0};//存放数据的接收缓存区
static uint8_t RxState = 0; //接收标志位
if(RxState==0&&Usart_RX_Buf==0x2C) //0x2c帧头
{
RxState=1;
RxBuffer1[RxCounter1++]=Usart_RX_Buf;//RxBuffer1[0]==0x2c RxCounter1==1
}
else if(RxState==1&&Usart_RX_Buf==0x12) //0x12帧头
{
RxState=2;
RxBuffer1[RxCounter1++]=Usart_RX_Buf;
}
else if(RxState==2)//开始接收有效数据
{
RxBuffer1[RxCounter1++]=Usart_RX_Buf;//全部接收完,RxCounter1==5
if(RxCounter1>=7||Usart_RX_Buf == 0x5B) //RxBuffer1接受满了,接收数据结束
{
RxState=3;
//RxBuffer1[2]是openmv发送的第一个数据的低八位,RxBuffer1[3]是openmv发送的第一个数据的高八位
cx=(RxBuffer1[RxCounter1-4]<<8)+(RxBuffer1[RxCounter1-5]);//分为低八位和高八位,先发低后发高
cy=(RxBuffer1[RxCounter1-2]<<8)+(RxBuffer1[RxCounter1-3]);//分为低八位和高八位,先发低后发高
}
}
else if(RxState==3) //检测是否接受到结束标志
{
if(RxBuffer1[RxCounter1-1] == 0x5B)
{
//
// RxFlag1 = 0;
RxCounter1 = 0;
RxState = 0;
HAL_UART_Receive_IT(&huart1,(uint8_t *)&Usart_RX_Buf,1);
}
else //接收错误
{
RxState = 0;
RxCounter1=0;
for(i=0;i<7;i++)
{
RxBuffer1[i]=0x00; //将存放数据数组清零
}
}
}
else //接收异常
{
RxState = 0;
RxCounter1=0;
for(i=0;i<7;i++)
{
RxBuffer1[i]=0x00; //将存放数据数组清零
}
}
HAL_UART_Receive_IT(&huart1,(uint8_t *)&Usart_RX_Buf,1);
}
}
控制RGB彩灯部分
void ROG_Contrl(uint8_t code)
{
switch(code)
{
case 1://蓝色
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,254);//R
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,0);//G
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,0);//B
break;
case 2://绿色
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,180);//R
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,254);//G
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,0);//B
break;
case 4://黄色
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,0);//R
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,0);//G
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,254);//B
break;
}
}
void LCD_Proc()
{
if((uwTick - LCD) <100) return;
LCD = uwTick;
// sprintf((char *)str," code:");
switch(code)
{
case 1:
sprintf((char *)str," code:%d,Blue ",code);
break;
case 2:
sprintf((char *)str," code:%d,Green ",code);
break;
case 4:
sprintf((char *)str," code:%d,Yellow ",code);
break;
}
// sprintf((char *)str," code:%d",code);
LCD_DisplayStringLine(Line2,str);
ROG_Contrl(code);
}