从帧头开始判断帧头 只接受有用的数据
void USART2_IRQHandler(void) //数据接收中断
{
u8 res;static u8 m;
if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)
{
res =USART_ReceiveData(USART2); //获得数据
if(res==0xAA){ //帧头第一个字节判断
m=1;
}if(m==1&&res==0xFF) // 帧头第二个字节判断
{m=2;USART_RX_CNT=1;
}
if(m==2)
{
USART_RX_BUF[USART_RX_CNT]=res; //符合帧头 存储数据
USART_RX_CNT++; //位置偏移加1
if(USART_RX_CNT>=8){ // 存储数据包含有用数据 处理 丢弃其它数据 &或者只偏移不存储 到指定偏移量再存储也可以
lx=(USART_RX_BUF[4]+USART_RX_BUF[5]*256); //数据处理
ly=(USART_RX_BUF[6]+USART_RX_BUF[7]*256);
lx=(USART_RX_BUF[5]&0x80)?lx-32768:-lx;
ly=(USART_RX_BUF[7]&0x80)?ly-32768:-ly;
USART_RX_FLAG=1;
m=0;
}
}
接收完整帧,判断帧尾,字符串处理数据 (AT指令接收)
void USART1_IRQHandler(void)
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Res =USART_ReceiveData(USART1);//(USART2->DR);
USART_SendData(USART3, (uint8_t) Res);
while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
// 0x0D 0x0A 是/r/n
if((USART1_RX_STA&0x8000)==0)
{
if(USART1_RX_STA&0x4000)
{
if(Res==0x0a) //判断倒数第一个字节 0x0A
USART1_RX_STA|=0x8000; //写入标志位
else USART1_RX_STA&=~0x8000;
}
else
{
if(Res==0x0d)USART1_RX_STA|=0x4000; //判断倒数第二个字节 0x0D 写入标志位
else
{
USART1_RX_BUF[USART1_RX_STA&0XFFF]=Res ; //接收数据
USART1_RX_STA++;
if((USART1_RX_STA&0XFFF)>(127)) USART1_RX_STA&=0xf000; //接收满 清除计数
}
}
}
}
if(USART1_RX_STA&0x8000) //接收完成 0x0D 0x0A
{
char len=USART1_RX_STA&0xfff;
USART1_RX_STA=0;
USART1_RX_BUF[len]=0;
if(strcmp(USART1_RX_BUF,"OK")==0) //判断接收字符串
{
OK_FLAG=1; //接收到指定字符串对应的操作
}
}
}