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;
}
}
}
}
}
|