//crc校驗
u16 crc16(u8 *puchMsg, u16 usDataLen)
{
u8 uchCRCHi = 0xFF ;
u8 uchCRCLo = 0xFF ;
u32 uIndex ;
while (usDataLen--)
{
uIndex = uchCRCHi ^ *puchMsg++ ;
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (uchCRCHi << 8 | uchCRCLo) ;
}
//數據校驗
unsigned short Check_Dat(unsigned char *pp,unsigned char Dat_len)
{
unsigned char Crc_H,Crc_L;
Crc_H = (unsigned char )crc16(pp,Dat_len);
Crc_L = (unsigned char )(crc16(pp,Dat_len)>>8);
if((Crc_H == *(pp+Dat_len))&&(Crc_L == *(pp+Dat_len+1)))
return Crc_Ok;
else
{
return Crc_Err;
}
}
void USART3_IRQHandler(void)//串口接收中斷
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
buf[len] =USART_ReceiveData(USART3);//(USART1->DR);
len++;
if(len>7)//8個字節開始校驗
{
// LEDB=!LEDB;
if( Check_Dat(buf,len)==Crc_Ok)
{
// LEDA=!LEDA;
MRS485_Receive_Data();//接收數據處理
Rec_Buf_clean(buf,len);清空接收數據
len=0;
}
if(len>=30)//接收30個字節還未通過校驗
{
Rec_Buf_clean(buf,len);
len=0;
}
}
USART_ClearFlag(USART3,USART_FLAG_RXNE);
}
}
void Rec_Buf_clean(u8 *point,u8 len ) //清空數組
{
int p;
for (p=0;p<len;p++)
{
point[p]=0;
}
}
|