通讯协议格式为协议: 包标识(0xaa) 设备号(1BYET) 包长度(命令字+命令项的字节数) 命令字(1byte) 命令项 校验和(2byte,累加和) ReceivePack[]存储的是接收的数据。
/***************************************/ /* 串口中断 */ /***************************************/ void COMint() interrupt 4 using 0 { unsigned char TrCount=0,ReCount=0x08; ES=0; if(!TI) { if(SBUF==0xAA) TR0=1; while(ReCount--) { if(RI) {ReceivePack[TrCount++]=SBUF; TH0=0x0; /*超时*/ TL0=0x0; RI=0;} if(TF0) { timeout=1; //超时 break; } } if(ReceivePack[1]==0x01) //本机数据 RXbit=1; //接收数据处理标志 else RXbit=0; } RI=0; TR0=0; TF0=0; TH0=0; TL0=0; ES=1; } /***********************************/ /*-------接收处理程序--------------*/ /***********************************/ void COM_Process(void) {unsigned char i,j; EA=0; i=ReceivePack[2]; j=ReceivePack[i+3]*0x100+ReceivePack[i+4]; for(sum=0;i>0;i--) { sum+=ReceivePack[2+i];}
if(sum==j) { switch(ReceivePack[3]) {case 0x01: TX[3]=0x03; State(); /*上传门状态*/ break; case 0x02: /*开门*/ P2=ReceivePack[4]; P1=ReceivePack[5]; TX[3]=0xCC; /*确认接收*/ Transmit(); P2=P1=0xff; break; case 0xCC: /*收到确认*/
break; case 0xEE:
Transmit(); /*重传数据*/ break; default: TX[3]=0xEE; /*接收出错报警*/ Transmit(); break; } } else {TX[3]=0xEE; /*接收出错报警*/ Transmit();} EA=1; }
现在的问题是用串口调试助手调试时,单片机主动上传的状态数据是正确的。但给单片机发送一个命令时,返回的数据就没有正确过。
|