中断代码
u8 rec,crc_flag;
u16 receivecount=0,num = 0,len = 0;
static u8 recv_state = 0;
void USART1_IRQHandler(void) //串口1中断服务程序
{
// u8 Res;
volatile u8 a=0;
if (USART_GetFlagStatus(USART1, USART_FLAG_PE) != RESET)//奇偶校验位
{
USART_ReceiveData(USART1);
USART_ClearFlag(USART1, USART_FLAG_PE);
}
if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)//溢出错误位
{
USART_ReceiveData(USART1);
USART_ClearFlag(USART1, USART_FLAG_ORE);//
}
if (USART_GetFlagStatus(USART1, USART_FLAG_FE) != RESET)//帧错误位
{
USART_ReceiveData(USART1);
USART_ClearFlag(USART1, USART_FLAG_FE);
}
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收数据寄存器非空位
{
/*
初始状态,判断帧头,判断到了22,第0个开始 ,切换状态进入数据状态
数据状态,接收数据到第2位,字节长度,接收字节长度为x-5的数据,切换状态进入结尾状态
结尾状态,读第一位和第二位,记录起来,将前面的字节全部计算校验对不对数据,然后置零重新开始接收下一包
*/
rec = USART_ReceiveData(USART1);
switch(recv_state)
{
case 0:
{
if(rec == 0x22)
{
recv_state = 1;
recbuffer[receivecount] = rec;
receivecount =1;
}
}break;
case 1:
{
recbuffer[receivecount] = rec;
if(receivecount == 2)//是长度
{
len = rec;
}
receivecount++;
if(receivecount >= len - 1 && len != 0)
{
recv_state = 2;
}
}break;
case 2:
{//需要第二次发数据才会进来
recbuffer[receivecount] = rec;
receivecount++;
crc_flag = CheckCRC16(recbuffer ,len);
// crc_flag = 0;
if(crc_flag == 0)
{
//确认帧头:
if(recbuffer[0] == 0x22 && recbuffer[1] == 0x11 && rec_flag == 0)
{
a = recbuffer[2];
//校验CRC
for(int j = 0; j < recbuffer[2] ; j ++)
{
user_buffer[j] = recbuffer[j];
}
crc_1 = user_buffer[a-2];
crc_2 = user_buffer[a-1];
}
rec_flag = 1;
recv_state = 0;
len = 0;
receivecount = 0;
}
else
{
receivecount = 0;
recv_state = 0;
len = 0;
}
}break;
}
USART_ClearFlag(USART1, USART_FLAG_RXNE);
}
}
CRC校验
/*********************************************************
* 函数功能:CRC校验
* 输入:data--待检验数据;len待检验数据长度
* 输出:无
* 函数返回值:0--代表检验通过;1--代表检验不通过
*********************************************************/
u8 CheckCRC16(u16 *data ,u16 len)
{
u8 tansbyte;
u16 i;
hibyte=0xff;
lobyte=0xff;
for(i=0;i<(len-2);i++)
{
tansbyte=hibyte^*data++;
hibyte=lobyte^crch[tansbyte];
lobyte=crcl[tansbyte];
}
if((lobyte == data [len - 1]) && ((hibyte == data [len - 2])))
{
return 0;
}
else
{
return 1;
}
}