void ser() interrupt 4 //串行中斷服務程序
{
unsigned char i,j,Check,tmp;
if(RI==1) //接收標志位為1時,接收
{
RI=0;
tmp=SBUF;
}
while(!RTUOverFlag) //結束標志位為0時
{
if(RTUStartFlag==0) //開始標志位為0時
{
if(tmp!='@') //判斷數據幀的起始位,不是@時不接收
{
RTUOverFlag=0;
RTUStartFlag=0;
return;
}
if(tmp=='@') //開始接收
{
UART_R_RTU[RTUPst]=tmp; // 接收起始位
RTUPst++;
RTUOverFlag=0;
RTUStartFlag=1;//已接收起始位
return;
}
}
else //接收剩余數據
{
if(tmp!='#') //接收結束位#之前的數據
{
UART_R_RTU[RTUPst]=tmp;
RTUPst++;
return;
}
else //接收結束位#
{
UART_R_RTU[RTUPst]=tmp;
RTUOverFlag=1; //完成接收,置標志位
ES=0; //關串口中斷
REN=0; //不允許接收
if(UART_R_RTU[1]!=ExtsAddr) //判斷數據第二位是否與本機地址相同,如果不相同
{
for(j=0;j<10;j++) //數據清零,標志位清零,允許接收,開串口中斷
UART_R_RTU[j]=0;
RTUPst=0;
RTUOverFlag=0;
RTUStartFlag=0;
REN=1;
ES=1;
return;
}
Check=0; //初始化校驗位
RTUDataLen=UART_R_RTU[3]; //讀數據長度
for(i=0;i<3+RTUDataLen;i++) //校驗位
{
Check=Check+UART_R_RTU[i+1];
}
if(Check!=UART_R_RTU[RTUPst-1]) //判斷校驗位是否與接收到的數據中的校驗位相同,如果不相同
{
for(j=0;j<10;j++) //清零數據,清標志位,允許接收,開串口中斷
UART_R_RTU[j]=0;
RTUPst=0;
RTUOverFlag=0;
RTUStartFlag=0;
REN=1;
ES=1;
return;
}
else //接收到完整數據情況下,置接收完成標志,清接收標志為下次接收做準備
{
UARTRTUDataCheckedFlag=1;
RTUFunc=UART_R_RTU[2];
RTUPst=0;
RTUOverFlag=0;
RTUStartFlag=0;
REN=1;
ES=1;
return;
}
}
}
}
}
|