此串口處理程序是基于以下的協(xié)議寫成的:
幀內(nèi)容FRAME=幀頭FA+幀長度len(不包括幀頭幀尾)+數(shù)據(jù)流data+幀尾FB。
串口中斷子程序里對整個數(shù)據(jù)流進(jìn)行處理,而不是一個字節(jié)一個字節(jié)地處理,在中斷中等待處理完所有的字節(jié)。
void Uart_Int(void) interrupt 4 //串口要加幀頭與FA幀尾FB
{
unsignedchar len, i;
unsignedint j=0;
unsignedchar serialStart;
if(RI) //收到數(shù)據(jù)
{
serialStart=SBUF;
RI=0;
if(serialStart==0xFA)
{
while(RI==0);
len=SBUF; //第一個字節(jié)是數(shù)據(jù)包的長度
RI=0; //清零RI以便接收下一個
for(i=0;i
while(!RI)
{
j++;
if(j>1000)
{
break;//break跳出循環(huán)語句
}
}
if(j<1000)
{
serialBuffer[i]=SBUF;
RI=0;
j=0;
}
else
{
break;
}
}
if((i==len+1)&&(serialBuffer[i-1]==0xFB)) //最后一位是0xFB。
{
REN=0; // 清零接收位
serialCmd=TRUE; //接收完畢,收到命令有效,置位1 又說明pc發(fā)送的數(shù)據(jù)單片機(jī)接收成功
}
else
return;
}
else
return;
}
else if(!RI && TI) //發(fā)送-RI=0,TI=1
{
TI=0;//TI是為了進(jìn)入中斷而故意軟件設(shè)置的,所以先清0
SBUF=0xFA;
while(!TI);
TI=0;
len=serialBuffer[0]; //發(fā)送的第一個字節(jié)是包的長度
for(i=0;i
SBUF=serialBuffer[i];
while(!TI); //等待發(fā)送完畢
TI=0;
}
SBUF=0xFB;
while(!TI);
TI=0;
REN=1;
//ren=receive enable
}
}