⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recframe.c

📁 用于GPRS远程电力抄表系统中采集器端的程序
💻 C
字号:
#include "recframe.h"
#include "recframeown.h"
#include "time.h"


/*********************************************************************
* 函 数 名: StatSwitch
* 功能描述: 判断每一个接收字节,进行状态转移,置标识位
* 函数说明: 帧头68H,帧尾16H
* 调用函数: 无
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:zy
***********************************************************************/
void StatSwitch()
{
	register uchar i,ch;
	static uchar RecCount,RecState,dl,count, DataLen,cs;

	ch=SBUF;
    if(s_end==0) //数据没有发送完,返回
		return;
	RecBuf[RecCount]=ch; //将接收到的字节存入缓冲区
    RecCount++;

	switch(RecState)
		{
			case RS_WAIT:
				if(ch==FRAME_START_CHAR) 
				{
				    RecState++;
				    count=1;
				}
				else
				    RecCount=0;	
					
				break;

			case RS_HEADER:
				count++;
			    if(count==2)
			    {
					if(RecBuf[1]==add[0])
						hcode=1;
					else if(RecBuf[1]==0)
						hcode=0;
					else 
					{
						RecCount=0;
                        RecState=RS_WAIT;
						break;
					}
				}
				if(count==3)
			    {
					if(RecBuf[2]==add[1])
						mcode=1;
					else if(RecBuf[2]==0)
						mcode=0;
					else 
					{
						RecCount=0;
                        RecState=RS_WAIT;
						break;
					}
				}

				if(count==4)
				 {
					if(RecBuf[3]==add[2])
						lcode=1;
					else if(RecBuf[3]==0)
						lcode=0;
					else 
					{
						RecCount=0;
                        RecState=RS_WAIT;
						break;
					}
					if((add_flag!=0)&&(add_flag!=4)&&(add_flag!=6)&&(add_flag!=7))
					{
						RecCount=0;
                        RecState=RS_WAIT;
						break;
					}
				}


				if(count==5)
			    {
					if(RecBuf[4]!=FRAME_START_CHAR)     //若不是帧起始字符,返回到等待状态
					{
						RecCount=0;
                        RecState=RS_WAIT;
						break;
					}
				}  

                if(count==6)
			    {
					fc_flag=0;
					switch(RecBuf[5])
					{
					    case 0:
							sinit=1;
							break;
						case 1:					       
							ctime=1;
							dl=6;							
							break;
						case 2:
							wport=1;
						    dl=4;
							break;
						case 3:
							rport=1;
						    dl=0;
							break;
						case 4:
							rcout=1;
						    dl=1;
							break;
						case 5:
							burst=1;
							dl=1;
							break;	
						case 11:
							fc_flag=0x50;
							dl=1;
							break;
						case 12:
							fc_flag=0x70;
							dl=1;
							break;
						case 13:
							sday=1;
							dl=0;
							break;
						case 14:
							fc_flag=0x60;
							dl=0;
							break;
						case 22:
							stime=1;
							dl=1;
							break;
						case 23:
							fc_flag=0x30;
							dl=1;
							break;
						case 16:     //抄表一次轮询结束命令
							cycend=1;
							dl=1;
							break;
/*						case 18:
						    gburst=1;
							dl=2;
							break;
*/						case 19:
							alarm_ac=1;
							dl=0;
							break;
						default:
							RecCount=0;
                            RecState=RS_WAIT;
							break;
					}

				}

			    if(count==7) //第7个字节为数据域长度字节
			    {
					DataLen=ch;
					if(fc_flag==0x80)
					{
						RecState++;
						count=0;
						break;
					}

					if(DataLen==dl)
					{
						RecState++;
						count=0;
						
			    		if(DataLen==0) //如果数据长度为0,进入接收校验和状态
							RecState++;
					}
					else
					{
						RecCount=0;
                        RecState=RS_WAIT;
						break;
					}
	    		}	
				break;

			case RS_DATA:
				count++;
			    if(count==DataLen) 
					RecState++;
				break;

			case RS_CHECK:
				cs=0;
				for(i=RecCount;i>1;i--)
				    cs+=RecBuf[i-2];
				if(cs!=RecBuf[RecCount-1])                       //校验和不正确,返回到等待状态
			    {
					RecCount=0;
                    RecState=RS_WAIT;
					break;
				}
			    else  
					RecState++;
				break;

			case RS_END:
                RecState=RS_WAIT;
				if(ch==FRAME_END_CHAR) //如果帧结束字符正确,置接收结束标识位
			    {
					r_end=1;
					s_end=0;
					delay_10ms=0;
					RecCount=0;
				}
				else
					RecCount=0;
				break;
		}
		
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -