通过PC机串口发送hex数据 5A 02 01 02 5F。返回给PC的数据不稳定,有时是5A 02, 有时是5A 01, 并且每次都返回四次。请大家帮忙分析一下原因。抛砖引玉。谢谢。
unsigned char tempsbuf;
typedef enum{
WAIT_HEADER,
WAIT_LEN,
WAIT_DATA,
WAIT_CHECKSUM
} ParserState;
typedef struct Parser{
ParserState state; //当前状态
unsigned char len; //数据长度
unsigned char buf_data[3]; //数据缓冲区
unsigned char index; //数据接收计数
unsigned char checksum; //检验和
} Parser;
void parser_init(Parser *p){
p->state=WAIT_HEADER;
p->len=0;
p->index=0;
p->checksum=0;
}
int parser_input_byte(Parser *p,unsigned char byte){
switch(p->state){
//1、等待帧头0x5a
case WAIT_HEADER:
if(byte==0x5A){
p->checksum=byte; //累加校验
p->state=WAIT_LEN;
}
break;
//2、等待长度
case WAIT_LEN:
p->len=byte;
p->checksum+=byte;
p->index=0;
p->state=WAIT_DATA;
break;
//3、等待数据
case WAIT_DATA:
p->buf_data[p->index++]=byte;
//p->index++;
p->checksum+=byte;
if(p->index>=p->len){p->state=WAIT_CHECKSUM;}
break;
//4、等待校验
case WAIT_CHECKSUM:
p->state=WAIT_HEADER; //解析完成回到初始状态
if(byte==p->checksum){
return 1;
}
break;
}
return 0;
}
void Uart() interrupt 4 //串行中断函数
{
if(TI)
{
TI=0; //清楚TI传送完成标记
}
if(RI){
RI=0;
tempsbuf=SBUF;
}
Parser p;
parser_init(&p);
void main(){
while(1)
{
if(parser_input_byte(&p,tempsbuf)){
SendByte(p.buf_data[0]);
SendByte(p.buf_data[1]);
}
}
}
|