程序大部分是借鑒的網上或STC的例程,想實現從串口接收的數據包中,解析出一幀完整的命令。請教各位大神幫看一下程序,我用的STC單片機,串口4接收數據,接收的數據存在ucRX4_Buffer【】中,最大存UART4_BUF_LENGTH個數據。中斷部分程序如下:
unsigned char ucRX4_index=0;
void Uart4_isr() interrupt 18 //UART4 中斷服務程序
{
UART4_INT_DISABLE(); //禁止串口4中斷
if(RI4) //串口4接收到數據
{
CLR_RI4(); //清除中斷4的接收標志
ucRX4_Buffer[ucRX4_index] = S4BUF; //將串口4接收到的數據放入ucRX4_Buffer[]
ucRX4_index++;
if(ucRX4_index>UART4_BUF_LENGTH) ucRX4_index=0;
}
if (TI4)
{
CLR_TI4(); //清除中斷4的發送標志
bTX4_Busy = 0; //設置串口4發送為空閑
}
UART4_INT_ENABLE(); //允許串口4中斷
}
數據接收后,從接收的數據包中查找以FD,FD,FD開頭的數據幀,不同的命令對應不同的數據長度,將查找出的數據存在ucRX4_CMD_Data_Buffer【】中,程序如下:
void Uart4_Read_Cmd_Data(void) //讀串口4接收的不同命令的數據
{
unsigned char i;
ucRX4_Read_Cnt = 0;
switch(ucRX4_Read_State)
{
case 0: //判斷頭文件
{
//從接收緩存中查找幀頭
if(ucRX4_Buffer[ucRX4_Read_Cnt] == 0xFD) //幀頭0xFD 0xFD 0xFD
{
ucRX4_Read_Cnt++; //讀下一個數
if(++ucRX4_Head_Cnt >= 3) //頭0xFD 0xFD 0xFD
{
ucRX4_Read_State=1;
}
}
else
{
ucRX4_Read_Cnt++; //讀下一個數
ucRX4_Head_Cnt = 0;
ucRX4_Read_State = 0;
}
}
break;
case 1: //判斷命令長度,不同命令長度不同;
{
if(ucRX4_Buffer[ucRX4_Read_Cnt] == 0x06) //06命令,06后4個字節,加上命令,共計5個字節
ucRX4_Recv_Data_Length=5;
else if(ucRX4_Buffer[ucRX4_Read_Cnt] == 0x07) //07命令
ucRX4_Recv_Data_Length=15;
else if(ucRX4_Buffer[ucRX4_Read_Cnt] == 0x08) //08命令
ucRX4_Recv_Data_Length=10;
else if(ucRX4_Buffer[ucRX4_Read_Cnt] == 0x09) //09命令
ucRX4_Recv_Data_Length=11;
else ucRX4_Recv_Data_Length=0;
ucRX4_Read_State=2;
}
break;
case 2: //接收數據
{
for(i=0;i<ucRX4_Recv_Data_Length;i++)
{
ucRX4_CMD_Data_Buffer[ i]=ucRX4_Buffer[ucRX4_Read_Cnt];
ucRX4_Read_Cnt++;
}
bRX4_Flag=1; //一幀數據接收完成
ucRX4_Read_State=0;
ucRX4_Head_Cnt = 0;
}break;
default:break;
}
}
在其它程序中,需要讀數據時,就調用 void Uart4_Read_Cmd_Data(void)函數。
以上程序,現在的問題是,總是查找出的數據總是不對,用串口助手驗證,比如發的數據包中包含了一幀數據,FD FD FD 06 01 02 03 06,但解析出的數據卻不是這個,求大神幫看一下是哪里的問題,先謝。 |