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

📄 复件 subfun.cpp

📁 Borland c++编写
💻 CPP
📖 第 1 页 / 共 2 页
字号:
   Name+=2;
  SendStream->Add((unsigned char)Str2Hex(Name)+0x33);   //发送数据  数据域加上0X33
  Name -=2;
  Name[2]=0;                      //将数据名付出值
  SendStream->Add((unsigned char)Str2Hex(Name)+0x33);
  SendStream->Addcs();   //存放数据地址
  SendStream->Add(0x16);

   char *Str;
   unsigned char * Buff;
   Buff=(unsigned char *)SendStream->Memory();
   int size=SendStream->Size();
/*****************************************************************/

   for(i=0;i<size;i++)  //for(i=0;i<SendStream->StreamLeng;i++)
   {
     PutAuxByte(Buff[i]);
   }
   //printf("%s","send over\n");

   EnableRx(0);
/****************************************************************/
   unsigned char c;                                //义返回字符
   unsigned char flagchar;                          // 设步
   unsigned char Errflag=0;                         // 将错误标记付0
   unsigned char *AddrBuff=new unsigned char[6];    // 定义地址缓冲区
   unsigned char CtrlCode;                          // 控制码
   unsigned char DataLeng;                          // 数据长度
   unsigned char *DataBuff;                         // 数据缓冲区
   unsigned char RCS;                               // 累加校验码
   unsigned char CS;                                // 校验码
   unsigned char DebugChar;
   char DataFlag[5];                                // 读出的数据标识
   DataBuff=new unsigned char[600];                //定义6000个字节的缓冲区
   int iStation=0;                                  //当前抄到的有效学符数
   flagchar=1;
   DataLeng=0;
   ClrLCDScr();                                      //初始化数据长度为0
   //clrscr;
  // RefreshWin();
  // do
  // {
     i=0;
     RCS=0x68;
     Str[0]=0;
     DataFlag[0]=0;
     while(Errflag==0 && flagchar!=6)            //分步判断字符是否正确,并且存在缓冲区中
     {
/*****************************************************************/
	  // #ifdef DEBUG
	  // if(ReceiveFileChar(c,50)==0)
	  // #else
	   if(ReceiveChar(c,50)==0)  //如果接到了数据(在1秒钟之内)
	  // #endif
/*****************************************************************/
	   {
	     Errflag=1;
	     printf("%s","no recive");
	     break;
	   }else
	   {
	     //printf("%d\n", c);
	     // getch();					   //接收数据从1开始
	     if(flagchar>1 && flagchar<5)
	     {
			  asm mov AL,RCS
			  asm add AL,c
			  asm mov RCS,AL                  // 先取解校验码
	     }
	     i++;
	   }                                       // 第一步握手协OXFE
	  switch(flagchar)
	   {
		  case 1:
		    {
			  if(c!=0xFE)
			  {
			    if(c==0x68)
			    {
				  if(i==1)
				  {
				    printf("%s","001 Error\n");        //错误显示001
				    RCS=0x68;
				    Errflag=2;                   //2表示数据错
				  }
				  else
				  {
				    // 第一步完成 转到第二步
				    i=0;
				    flagchar=2;
				  }
			     }
			    else                       // 如果取的数不为68则为第二步错误
			    {
				  i=0;
				  printf("%s","first is not recive\n");  // 第二步错
				  Errflag=3;                   //  数据校验错
			    }//end if(c==0x68)
			  }
			  else
			  {
			    if(i>4)                     //   是否在大于4位是出现FE
			    {
				    printf("%s","fouth is FE\n");
				    Errflag=4;
			    }
			  }//end if(c!=0xFE)
			  break;
		    }
		  case 2:
		    {
			  if(i==7)
			  {
			    if(c==0x68)                   // 如果C=68第二步完成
			    {
				  i=0;                        //  在第一个数据中
				  flagchar=3;                   // 转到第三步
			    }
			    else
			    {
				    printf("%s","seacon is not 68\n");     //如果不是68错误
				    Errflag=5;
			    }
			  }
			  else
			  {
			    AddrBuff[i-1]=c;     //如果I小于7取出字符并且放在地址中
			  }
			  break;
		    }//IF(I=7)
		  case 3:
		    {
			  if(i==1)
			  {
			    CtrlCode=c;   //  控制码
			    if(CtrlCode!=0x82 && CtrlCode!=0xA2)
			     { Errflag=6;
			      printf("%s"," ctrcode is errror\n");
			     // printf("%d",c);
			      getch();
			      }
			  }
			  if(i==2)               //  长度
			  {
			    DataLeng=c;
			    flagchar=4;                          //转到第4步 case4
			    i=0;
			  }
			  break;
		    }
		  case 4:
		    {
		       if(i<=2)//取出数据标识
		       {
			 unsigned char cTemp=c-0x33;
			 Byte2Hex(cTemp,Str);
			 strcat(Str,DataFlag);
			 strcpy(DataFlag,Str);
			 if(i==2)               //已经取出数据标
			 {
			    if(strcmp(DataFlag,DataN)!=0)
			       Errflag=7;       //数据标识错识
			 }
		       }else
		       {
			  if(i<=DataLeng)    //  如果长度小于总长度
			  {
			    DataBuff[iStation]=c-0x33;     //  有效数据域中减33
			    iStation++;                    //  有效字符数
			    if(i==DataLeng)                //  全部有效字符读取完毕
			    {
				  i=0;
				  flagchar=5;
			    }
			  }
		       }
		       break;
		    }
		  case 5:
		    {
			  if(i==1 && RCS!=c)
			  {
			    Errflag=8;
			  }
			  if(i==2)
			  {
			    if(c==0x16)
			    {
				  flagchar=6;
			    }
			    else
			    {
				    printf("%s","Rsc is error\n");
				    Errflag=9;
			    }
			  }
			  break;
		    }
	    }//end switch
     }//end while
    // flagchar=1;
  // }while(CtrlCode==0xA1 && Errflag==0);
   Getval[0]=0;//初始字符串为空
   address[0]=0;
   int z;
   char *Str1;
   if(Errflag==0)
   {

    for (z=6;z>=0;z--)
    {
	Byte2Hex(AddrBuff[z],Str1);
	strcat(address,Str1);
    }

     for(i=iStation-1;i>=0;i--)
     {
       Byte2Hex(DataBuff[i],Str);
       strcat(Getval,Str);
     }
   democtrl=CtrlCode;
   demolength=DataLeng;
   }
  // delete [] DataN;
   delete [] DataBuff;
   delete [] AddrBuff;
   delete SendStream;  //延时发送
   delete [] TStr1;
   delete TStr;
   delete Name;
   delete [] Buff;
   delete Str;
   delete Str1;

/*******************************************************************/
 DisableRx();
 SetCommMode(workmode, commport, baudrate);
 TurnOffR232;
/******************************************************************/

   return Errflag ;             //返回错误标识 如果为0为成功
 }
//读窃电数据+++++++++++++++++++++++++++++++++++++++++++++++++++++++
int ReadData1(char * DataN ,char *Getval,char * sz)//读窃电数据;
{
  unsigned char workmode,commport;       //定义工作模试  通讯口
  unsigned int  baudrate;                 //定义波特率

  if (!ComPlsInstalled())                 //测试通讯内核是否安装
  {     //clrscr;
  ClrLCDScr();
  //RefreshWin();
   // ClrGraph;
   RefreshWin();
    printf("Complus must be installed first!!!  \n");  //首先必须安置通讯
   getch();
  return (1);
}
  TurnOnR232;

  GetCommMode(&workmode, &commport, &baudrate);
  SetCommMode(_AUX_MODE+_mod_8D1P+_par_EVEN , 0, 1200);

  CStream * SendStream;        //字符流发送
  SendStream=new CStream;

  int i;
  char * TStr="00000000";      //发送前数据
  char * TStr1=new char [50];             //发送后读取的数据
  char * Name="0000";
  TStr1[0]=0;
  for(i=0;i<=3;i++) SendStream->Add(0xFE);    // 发送四个FE
  SendStream->Add(0x68);
  SendStream->Add(0x99) ;
  SendStream->Add(0x99);
  SendStream->Add(0x99);
  SendStream->Add(0x99);
  SendStream->Add(0x99);
  SendStream->Add(0x99);
  SendStream->Add(0x68);
  SendStream->Add(0x01);
  SendStream->Add(0x02);
   strcpy(Name,DataN);//
   Name+=2;
  SendStream->Add((unsigned char)Str2Hex(Name)+0x33);   //发送数据  数据域加上0X33
  Name -=2;
  Name[2]=0;                      //将数据名付出值
  SendStream->Add((unsigned char)Str2Hex(Name)+0x33);
  SendStream->Addcs();   //存放数据地址
  SendStream->Add(0x16);

   char *Str;
   unsigned char * Buff;
   Buff=(unsigned char *)SendStream->Memory();
   int size=SendStream->Size();
/*****************************************************************/

   for(i=0;i<size;i++)  //for(i=0;i<SendStream->StreamLeng;i++)
   {
     PutAuxByte(Buff[i]);
   }
  // printf("%s","send over\n");

   EnableRx(0);
/****************************************************************/
   unsigned char c;                                //义返回字符
   unsigned char flagchar;                          // 设步
   unsigned char Errflag=0;                         // 将错误标记付0
   unsigned char *AddrBuff=new unsigned char[6];    // 定义地址缓冲区
   unsigned char CtrlCode;                          // 控制码
   unsigned char DataLeng;                          // 数据长度
   unsigned char *DataBuff;                         // 数据缓冲区
   unsigned char RCS;                               // 累加校验码
   unsigned char CS;                                // 校验码
   unsigned char DebugChar;
   char DataFlag[5];                                // 读出的数据标识
   DataBuff=new unsigned char[600];                //定义6000个字节的缓冲区
   int iStation=0;                                  //当前抄到的有效学符数
   flagchar=1;
   DataLeng=0;                                      //初始化数据长度为0
   //clrscr;
   ClrLCDScr();
 //RefreshWin();
   // do
   // {
     i=0;
     RCS=0x68;
     Str[0]=0;
     DataFlag[0]=0;
     while(Errflag==0 && flagchar!=6)            //分步判断字符是否正确,并且存在缓冲区中
     {
/*****************************************************************/

	   if(ReceiveChar(c,50)==0)  //如果接到了数据(在1秒钟之内)
/*****************************************************************/
	   {
	     Errflag=1;
	     printf("%s","no recive");
	     break;
	   }else
	   {
	     //printf(" %d", c);
	     // getch();					   //接收数据从1开始
	     if(flagchar>1 && flagchar<5)
	     {
			  asm mov AL,RCS
			  asm add AL,c
			  asm mov RCS,AL                  // 先取解校验码
	     }
	     i++;
	   }                                       // 第一步握手协OXFE
	  switch(flagchar)
	   {
		  case 1:
		    {
			  if(c!=0xFE)
			  {
			    if(c==0x68)
			    {
				  if(i==1)
				  {
				    printf("%s","001 Error\n");        //错误显示001
				    RCS=0x68;
				    Errflag=2;                   //2表示数据错
				  }
				  else
				  {
				    // 第一步完成 转到第二步
				    i=0;
				    flagchar=2;
				  }
			     }
			    else                       // 如果取的数不为68则为第二步错误
			    {
				  i=0;
				  printf("%s","first is not recive\n");  // 第二步错
				  Errflag=3;                   //  数据校验错
			    }//end if(c==0x68)
			  }
			  else
			  {
			    if(i>4)                     //   是否在大于4位是出现FE
			    {
				    printf("%s","fouth is FE\n");
				    Errflag=4;
			    }
			  }//end if(c!=0xFE)
			  break;
		    }
		  case 2:
		    {
			  if(i==7)
			  {
			    if(c==0x68)                   // 如果C=68第二步完成
			    {
				  i=0;                        //  在第一个数据中
				  flagchar=3;                   // 转到第三步
			    }
			    else
			    {
				    printf("%s","seacon is not 68\n");     //如果不是68错误
				    Errflag=5;
			    }
			  }
			  else
			  {
			    AddrBuff[i-1]=c;     //如果I小于7取出字符并且放在地址中
			  }
			  break;
		    }//IF(I=7)
		  case 3:
		    {
			  if(i==1)
			  {
			    CtrlCode=c;   //  控制码
			    if(CtrlCode!=0x81 && CtrlCode!=0xA1)
			     { Errflag=6;
			      printf("%s"," ctrcode is errror\n");
			     // printf("%d",c);
			      getch();
			      }
			  }
			  if(i==2)               //  长度

			  {
			    DataLeng=c;
			    flagchar=4;                          //转到第4步 case4
			    i=0;
			  }
			  break;
		    }
		  case 4:
		    {
		       if(i<=2)//取出数据标识
		       {
			 unsigned char cTemp=c-0x33;
			 Byte2Hex(cTemp,Str);
			 strcat(Str,DataFlag);
			 strcpy(DataFlag,Str);
			 if(i==2)               //已经取出数据标
			 {
			    if(strcmp(DataFlag,DataN)!=0)
			       Errflag=7;       //数据标识错识
			 }
		       }else
		       {
			  if(i<=DataLeng)    //  如果长度小于总长度
			  {
			    DataBuff[iStation]=c-0x33;     //  有效数据域中减33
			    iStation++;                    //  有效字符数
			    if(i==DataLeng)                //  全部有效字符读取完毕
			    {
				  i=0;
				  flagchar=5;
			    }
			  }
		       }
		       break;
		    }
		  case 5:
		    {
			  if(i==1 && RCS!=c)
			  {
			    Errflag=8;
			  }
			  if(i==2)
			  {
			    if(c==0x16)
			    {
				  flagchar=6;
			    }
			    else
			    {
				    printf("%s","Rsc is error\n");
				    Errflag=9;
			    }
			  }
			  break;
		    }
	    }//end switch
     }//end while
 //    flagchar=1;
 //  }while(CtrlCode==0xA1 && Errflag==0);
   Getval[0]=0;//初始字符串为空
   int z;
   char *Str1;
   if(Errflag==0)
   {

    for (z=6;z>=0;z--)
    {
	Byte2Hex(AddrBuff[z],Str1);
	strcat(sz,Str1);
    }

     for(i=iStation-1;i>=0;i--)
     {
       Byte2Hex(DataBuff[i],Str);
       strcat(Getval,Str);
     }
   democtrl=CtrlCode;
   demolength=DataLeng;
   }
  // printf ("%s","success");
   delete [] DataBuff;
   delete [] AddrBuff;
   delete SendStream;  //延时发送
   delete [] TStr1;
   delete TStr;
   delete Name;
   delete [] Buff;
   delete Str;
 // delete DataN;
   delete Str1;

/*******************************************************************/
 DisableRx();
 SetCommMode(workmode, commport, baudrate);
 TurnOffR232;
/******************************************************************/

   return Errflag ;             //返回错误标识 如果为0为成功
 }

⌨️ 快捷键说明

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