//********************************通信*************************************************************
void comsend(unsigned char * sendbuff,unsigned char comsendlen)
{
int i,CRC;
CRC=0;
ES=0;
SBUF=0x55;
while (TI == 0)
;
TI=0; //置0
SBUF=0xaa;
while (TI == 0)
;
TI=0; //置0
SBUF=comsendlen; //长度
CRC+=comsendlen;
while (TI == 0)
;
TI=0; //置0
for (i=0; i<comsendlen; i++) //正文
{
SBUF=sendbuff[i];
while (TI == 0)
;
TI=0; //置0
CRC+=sendbuff[i];
}
SBUF=CRC; //校验
while (TI == 0)
;
TI=0; //置0
ES=1;
}
void comrev (void) interrupt 4
{
if (RI==1)
{
RI=0;
switch (RevState)
{
//等待接收第一个同步头0x55
case revhead1:
if (SBUF==0x55)
{
RevState=revhead2;
}
break;
//等待接收第二个同步头0xAA
case revhead2:
if (SBUF==0xAA)
{
RevState=revpakagelen;
}
else
{
if (SBUF!=0x55)
{
RevState=revhead1;//状态机复位
}
}
break;
//等待接收数据包长度
case revpakagelen:
revlen=SBUF;
if (revlen>revbufflen)
{
RevState=revhead1;//状态机复位
ComErr=Com_revOflow; //准备接收数据
}
else
{
checkSum=0;
checkSum+=SBUF;
RevPtr=0; //接收指针复位
RevState=revpakage;
}
break;
//等待接收数据内容
case revpakage:
revbuff[RevPtr++]=SBUF;
checkSum+=SBUF;
if (RevPtr==revlen)
{
RevState=revcrc;
}
break;
//等待接收校验和
case revcrc:
if (checkSum==SBUF)
{
ComErr=Com_revOK;//接收正确
}
else
{
ComErr=Com_revCRCErr;//接收不正确
}
RevState=revhead1;//状态机复位
}
}
}
//********************************通信************************************************************* |