程序大部分是借鉴的网上或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,但解析出的数据却不是这个,求大神帮看一下是哪里的问题,先谢。 |