|
程序大部分是借鑒的網(wǎng)上或STC的例程,想實(shí)現(xiàn)從串口接收的數(shù)據(jù)包中,解析出一幀完整的命令。請(qǐng)教各位大神幫看一下程序,我用的STC單片機(jī),串口4接收數(shù)據(jù),接收的數(shù)據(jù)存在ucRX4_Buffer【】中,最大存UART4_BUF_LENGTH個(gè)數(shù)據(jù)。中斷部分程序如下:
unsigned char ucRX4_index=0;
void Uart4_isr() interrupt 18 //UART4 中斷服務(wù)程序
{
UART4_INT_DISABLE(); //禁止串口4中斷
if(RI4) //串口4接收到數(shù)據(jù)
{
CLR_RI4(); //清除中斷4的接收標(biāo)志
ucRX4_Buffer[ucRX4_index] = S4BUF; //將串口4接收到的數(shù)據(jù)放入ucRX4_Buffer[]
ucRX4_index++;
if(ucRX4_index>UART4_BUF_LENGTH) ucRX4_index=0;
}
if (TI4)
{
CLR_TI4(); //清除中斷4的發(fā)送標(biāo)志
bTX4_Busy = 0; //設(shè)置串口4發(fā)送為空閑
}
UART4_INT_ENABLE(); //允許串口4中斷
}
數(shù)據(jù)接收后,從接收的數(shù)據(jù)包中查找以FD,FD,FD開(kāi)頭的數(shù)據(jù)幀,不同的命令對(duì)應(yīng)不同的數(shù)據(jù)長(zhǎng)度,將查找出的數(shù)據(jù)存在ucRX4_CMD_Data_Buffer【】中,程序如下:
void Uart4_Read_Cmd_Data(void) //讀串口4接收的不同命令的數(shù)據(jù)
{
unsigned char i;
ucRX4_Read_Cnt = 0;
switch(ucRX4_Read_State)
{
case 0: //判斷頭文件
{
//從接收緩存中查找?guī)^
if(ucRX4_Buffer[ucRX4_Read_Cnt] == 0xFD) //幀頭0xFD 0xFD 0xFD
{
ucRX4_Read_Cnt++; //讀下一個(gè)數(shù)
if(++ucRX4_Head_Cnt >= 3) //頭0xFD 0xFD 0xFD
{
ucRX4_Read_State=1;
}
}
else
{
ucRX4_Read_Cnt++; //讀下一個(gè)數(shù)
ucRX4_Head_Cnt = 0;
ucRX4_Read_State = 0;
}
}
break;
case 1: //判斷命令長(zhǎng)度,不同命令長(zhǎng)度不同;
{
if(ucRX4_Buffer[ucRX4_Read_Cnt] == 0x06) //06命令,06后4個(gè)字節(jié),加上命令,共計(jì)5個(gè)字節(jié)
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: //接收數(shù)據(jù)
{
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; //一幀數(shù)據(jù)接收完成
ucRX4_Read_State=0;
ucRX4_Head_Cnt = 0;
}break;
default:break;
}
}
在其它程序中,需要讀數(shù)據(jù)時(shí),就調(diào)用 void Uart4_Read_Cmd_Data(void)函數(shù)。
以上程序,現(xiàn)在的問(wèn)題是,總是查找出的數(shù)據(jù)總是不對(duì),用串口助手驗(yàn)證,比如發(fā)的數(shù)據(jù)包中包含了一幀數(shù)據(jù),F(xiàn)D FD FD 06 01 02 03 06,但解析出的數(shù)據(jù)卻不是這個(gè),求大神幫看一下是哪里的問(wèn)題,先謝。 |
|