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

📄 uart.c.bak

📁 采用CYGNAL F015单片机
💻 BAK
字号:
////WorkState(F:充电,C:放电,E:无操作,N:无电池) 
//将缓冲池中的数据取走,调整缓冲池的数据个数、头指针、尾指针
#include "uart.h"
unsigned char DoWithCommand(void)
{
  unsigned char R_command=0,reply=0,i=0 ;
  Current=0x05DC;  //1.5a
  Voltage=0x41A0;   //16.8v
  TimeRemain=0x0040;  //64min
	R_command=RData[(Head+3)%RBUFSIZE];					//命令代码
	
  switch (R_command)
    { 
   case CONNECT: //A:连接
        SData[0]=14;
	    SData[1]=ADDRESS;
	    SData[2]=R_command;
	    SData[3]=WorkType;
	    SData[4]=Edition;
	    SData[5]=(&RunStep[RStepNo])->action;
	    SData[6]=RStepNo;
        SData[7]=Current%256;
        SData[8]=Current>>8;
        SData[9]=Voltage%256;
        SData[10]=Voltage>>8;
        SData[11]=VolumeRatio;
        SData[12]=TimeRemain%256;
        SData[13]=TimeRemain>>8;
	    SData[14]=OutCheckSum();
        reply=1;
      break;

   case ACONTROL: // 'F'传送动作控制代码
     if (RData[(Head+4)%RBUFSIZE]=='A')
	  {   
	      (&RunStep[0])->action=RData[(Head+6)%RBUFSIZE];
          (&RunStep[0])->ref_exe=RData[(Head+7)%RBUFSIZE]+RData[(Head+8)%RBUFSIZE]*256;
          (&RunStep[0])->ref_stp=RData[(Head+9)%RBUFSIZE]+RData[(Head+10)%RBUFSIZE]*256;
	       TStepNo=1;
      }
	  else if(RData[(Head+4)%RBUFSIZE]=='B')
	  {
	      (&RunStep[TStepNo])->action=RData[(Head+6)%RBUFSIZE];
          (&RunStep[TStepNo])->ref_exe=RData[(Head+7)%RBUFSIZE]+RData[(Head+8)%RBUFSIZE]*256;
          (&RunStep[TStepNo])->ref_stp=RData[(Head+9)%RBUFSIZE]+RData[(Head+10)%RBUFSIZE]*256;
	       TStepNo++;
	   }
      else
	   {
	   //command length + address +command type[F传送动作控制代码]+
	   //command data[命令状态(A:第一条命令;B:后续命令;J:跳转指令)+序号 +
	   //动作代码CONTROL type [E] +跳转到指定的序号+循环的次数] +chechsum
	     if(RData[(Head+4)%RBUFSIZE]=='J')
		 {
	      (&RunStep[TStepNo])->action=RData[(Head+6)%RBUFSIZE];
          (&RunStep[TStepNo])->ref_exe=RData[(Head+7)%RBUFSIZE];
          (&RunStep[TStepNo])->ref_stp=RData[(Head+8)%RBUFSIZE];
	       TStepNo++;
		  } 	     
	   }
        SData[0]=5;
	    SData[1]=ADDRESS;
	    SData[2]=R_command;
	    SData[3]='O';
	    SData[4]='K';
	    SData[5]=OutCheckSum();
        reply=2;
        break;

   case LSAMPLE: //'S':采样数据
        SData[0]=12;
	    SData[1]=ADDRESS;
	    SData[2]=R_command;
	    SData[3]=(&RunStep[RStepNo])->action;
	    SData[4]=RStepNo;
	    SData[5]=Current%256;
	    SData[6]=Current>>8;
        SData[7]=Voltage%256;
        SData[8]=Voltage>>8;
        SData[9]=VolumeRatio;
        SData[10]=TimeRemain%256;
        SData[11]=TimeRemain>>8;
        SData[12]=OutCheckSum();
      reply=3;
      break; 

   //command length +address +command type[G] +command data["on"  or  "off"] (1 B) +chechsum
 
   case LCONTROL: //'L':通道控制
      if(RData[Head+4]==1)
      Action_Control=1;
	  else
      Action_Control=0;
	    SData[0]=5;
	    SData[1]=ADDRESS;
	    SData[2]=R_command;
	    SData[3]='O';
	    SData[4]='K';
	    SData[5]=OutCheckSum();
	   reply=4;
      break;

     //以上情况为同种类型的应答
   case HDATA:  //'H': 历史操作数据
        ReadFlash();//
        SData[0]=13;
	    SData[1]=ADDRESS;
	    SData[2]=R_command;
	    SData[3]=(&RunStep[RStepNo])->action;
	    SData[4]=RStepNo;
	    SData[5]=Current%256;
	    SData[6]=Current>>8;
        SData[7]=Voltage%256;
        SData[8]=Voltage>>8;
        SData[9]=VolumeRatio;
        SData[10]=TimeRemain%256;
        SData[11]=TimeRemain>>8;
        SData[12]= 0x00;//01表示还有后续的数据;00表示无后续数据 及所有数据传送完毕
        SData[13]=OutCheckSum();
        reply=5;
      break; 

   case ROMREAD: //'R':读,
        SM_Receive (0x16, RData[(Head+4)%RBUFSIZE],RData[(Head+5)%RBUFSIZE]+1) ;
        SData[0]=2+RData[(Head+5)%RBUFSIZE];
	    SData[1]=ADDRESS;
   	    SData[2]=R_command; 
         //添加相应的代码,从EEPROM中读出数据,并填写在ReplayMessage从3开始的单元中
        for(i=0;i<RData[(Head+5)%RBUFSIZE];i++)
		  SData[3+i]=RECVCHARS[i];
		SData[3+i]=OutCheckSum();
        reply=6;
      break; 

   case ROMWRITE: //'W':写
       //添加相应的代码,将要写入的数据写入EEPROM中
        SM_Send (0x16, RData[(Head+4)%RBUFSIZE], RData[(Head+5)%RBUFSIZE]+1) ;
	    SData[0]=5;
	    SData[1]=ADDRESS;
	    SData[2]=R_command;
	    SData[3]='O';
	    SData[4]='K';
	    SData[5]=OutCheckSum();
        reply=7;
      break; 

   default: 
      break; 
    } 
 if(reply>=1 &&reply<=7 )
   {

	  //DataSended=0;
	  SBUF=SData[0];
      DataSended=1;//表示当前已传送字节位置

   }
   ES0=0;
   DataNo=DataNo-(RData[(Head+1)%RBUFSIZE]+1);
   Head=(Head+RData[(Head+1)%RBUFSIZE]+2)%RBUFSIZE ;
   //DataNo=0;
   //Head=0;
   //Pos=0;	  	 
   ES0=1;
   return reply;
}



/********************************************************************************/



//在缓冲池中检验,是否有自己的数据。如果检查到别人的数据要清除。如果事自己的数据且正确就返回一个为1的值
//若校验错误返回2;

unsigned char RBufJudge()
{
	unsigned char my_message=0;
	int Rcurrentp=0,temp_no,check_sum,tempacc=0;
	unsigned char temp_pos=0;

	temp_no =DataNo;//缓冲数据个数
    temp_pos=Head;

	if (temp_no >0)
	{    
    	if(!(RData[(temp_pos)%RBUFSIZE]==0xff && RData[(temp_pos+1)%RBUFSIZE]!=0xff))
     	{  
	      temp_no--;
	      temp_pos=(++temp_pos)%RBUFSIZE ;
        }
       else
       {

       	if(RData[(temp_pos+2)%RBUFSIZE]==ADDRESS)
		    {
		   	  TestVar=RData[(temp_pos)%RBUFSIZE];
	          TestVar1=RData[(temp_pos+1)%RBUFSIZE];
              TestVar2=DataNo;
	       if ((Pos+RBUFSIZE-temp_pos)%RBUFSIZE<RData[(temp_pos+1)%RBUFSIZE]+2) //若当前数据‘个数小于指定长度
		      {
		       //if(TR2==0) TR2 =1;	  //开定时器2,启动超时检测
              goto jend;
			    }
           else 
		      {
			   TR2=0;
               TH2     =0xf9;                   //等待10个字节时须在16位模式下设置为0xf933
               TL2     =0x33; 
               for (check_sum=0,Rcurrentp=1;+Rcurrentp <(RData[(temp_pos+1)%RBUFSIZE]);Rcurrentp ++)		//求校验和
	              {
	            	check_sum =(check_sum+RData[(temp_pos+Rcurrentp+1)%RBUFSIZE])%256;
	               }
	             if (check_sum !=RData[((temp_pos+Rcurrentp+1)%RBUFSIZE)])
	               {
                    my_message=RData[(temp_pos+3)%RBUFSIZE];
	                    //校验错误
		             SData[0]=4;
	                 SData[1]=ADDRESS;
	                 SData[2]=my_message;
	                 SData[3]='E';
	                 SData[4]= SData[1]+SData[2]+SData[3];
			          SBUF=SData[0];
                      DataSended=1;//表示当前已传送字节位置	
                     ES0=0;
				     Pos=0;
					 ES0=1;
	                 temp_no=0;
	                 temp_pos=0;	   
             	     goto jend;
	               }
			         else
			          {
				           //temp_no=temp_no-RData[temp_pos];
	                  //temp_pos=(temp_pos+RData[temp_pos])%RBUFSIZE ;
				           my_message=1; 
					         goto jend;
				         }	   		   			   			 
			      }
           }
       }
  }
jend:
    Head=temp_pos;
	ES0 =0;
	DataNo =temp_no;//缓冲数据个数
	ES0 =1;
	return my_message;
}

unsigned char OutCheckSum(void)  //生成校验
{
  unsigned char i;
  unsigned int sum;
  for(i=1,sum=0;i<SData[0]-1;i++)   
   sum=(sum+SData[i])%256;
  return sum;
}

⌨️ 快捷键说明

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