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

📄 复件 subfun.cpp

📁 Borland c++编写
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "SubFun.h"
#include "Infrared.h"
#include "CommPlus.h"
#include <String.h>
#include <math.h>
#include <stdio.h>
#include <conio.h>
#include <process.h>
#include "CStream.h"
#include "dos.h"
#include "htlcd.h"
//#define DEBUG
//extern int num90;
extern int ReceiveFileChar(unsigned char &C,int delay);

long GetSec(void)
{
  long Secs;
  time *t;
  gettime(t);
  Secs=t->ti_hour*360000;
  Secs+=t->ti_min*6000;
  Secs+=t->ti_sec*100;
  Secs+=t->ti_hund;
  return (Secs);
}
long GetSec(void *timestruct)
{
  long Secs;
  time *t;
  t=(time *)timestruct;
  Secs=t->ti_hour*360000;
  Secs+=t->ti_min*6000;
  Secs+=t->ti_sec*100;
  Secs+=t->ti_hund;
  return (Secs);
}
//--------------------------------------------------------------------------
int ReceiveChar(unsigned char &c,long delay)   //在接收数据时延时   C表示接收到的数据  DELAY表示延时
{
  long t;
  unsigned char far * AuxByte;              //接收字0符
  unsigned char far *Status;                //  状态

  t=GetSec()+delay;                //  t目标时间   G当前时间   D延时时间
  while(GetSec()<t)
  {
	if(AuxByteExist(AuxByte,Status))   //取字符接收状态
	{
	   GetAuxByte(&c,Status);        //  读取字符及其接收状态
	   return 1;
	}
  }
  return 0;
}
int Byte2Hex(unsigned char num,char * HexStr)//转换为十六进制字符串
{
  int num1,num2;                      //定义字符串个数
  char c1,c2;
  num1=num/16;                   //将第一串字符转换成十六进制整数
  num2=num%16;                   //将第二串字符转换成十六进制小数
  if(num1<10)
  {
	c1=48+num1;// 相当于十以下的数
  }
  else
  {
	c1=64+num1-9;// 相当于A B C等
  }
  if(num2<10)
  {
	c2=48+num2;
  }
  else
  {
	c2=64+num2-9;
  }
  HexStr[0]=c1;
  HexStr[1]=c2;
  HexStr[2]=0;
  return 1;
}
//------------------------------------------------------------

long Str2Hex(char * Str)         //将字符串转换成十六进制数
{
  int i;
  long Sum=0;
  int Len=strlen(Str);// LEN 表示长度
  for(i=0;i<Len;i++)
  {
	switch (Str[i])     //存放取得的字符串
	{
	  case '0':
	  case '1':
	  case '2':
	  case '3':
	  case '4':
	  case '5':
	  case '6':
	  case '7':
	  case '8':
	  case '9':
		{ //0-9
		  Sum+=(Str[i]-48)*(long)pow(16,(Len-1-i));
		//  printf("%s\n",Sum);
		  break;
		}
	  case 'A':
	  case 'B':
	  case 'C':
	  case 'D':
	  case 'E':
	  case 'F':
		{
		   Sum+=(Str[i]-55)*(long)pow(16,(Len-1-i));

		//   printf("%s\n",Sum);
		   break;
		}
	}//end switch
  }//end for
  return Sum;
}
//--------------------------------------------------
unsigned char Byte2BCD(unsigned char byte)
{
  return (int)byte/10*16 + byte%10;
}
//---------------------------------------------------
int ReadData(char * DataName,char *Getval,char * sz)//,char * Addr) //读数据DataName读到的数据名称 Getval读到的据内容 Addr读到的数据地址
{
  unsigned char workmode,commport;       //定义工作模试  通讯口
  unsigned int  baudrate;                 //定义波特率

  if (!ComPlsInstalled())                 //测试通讯内核是否安装
  {     ClrLCDScr();
	//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,DataName);//
   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]);
   }
    ClrLCDScr();
     //RefreshWin();   //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[100];                //定义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)            //分步判断字符是否正确,并且存在缓冲区中
     {
/*****************************************************************/
	  // #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!=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,DataName)!=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);

     }

   }
  // delete [] DataName;
   delete [] DataBuff;
   delete [] AddrBuff;
   delete SendStream;  //延时发送
   delete [] TStr1;
   delete TStr;
   delete Name;
   delete [] Buff;
   delete Str;
   delete Str1;

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

  //IRPowerCtrl(_IRPowOFF);
   /*  设置工作模式 通讯口  波特率resume comm setting */
 //SetIRMFreq(0);
 //IRPowerCtrl(_IRPowOFF);
 DisableRx();
 SetCommMode(workmode, commport, baudrate);
 TurnOffR232;
/******************************************************************/

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

 //广播校时------------------------------------------------------
 int LwriteData(struct time t,struct date d, char *Addr) //读数据DataName读到的数据名称 Getval读到的据内容 Addr读到的数据地址
{

  unsigned char workmode,commport;       //定义工作模试  通讯口
  unsigned int  baudrate;                 //定义波特率

 if (!ComPlsInstalled())                 //测试通讯内核是否安装
  {
  // clrscr;
  ClrLCDScr();
  // RefreshWin();
    printf("Complus must be installed first!!!  \n");  //首先必须安置通讯
    getch ();
    return(1);
  }
  GetCommMode(&workmode, &commport, &baudrate);
  SetCommMode(_AUX_MODE+_mod_8D1P+_par_EVEN , 0, 1200);
  EnableRx(0);
  CStream * SendStream;        //字符流发送
  SendStream=new CStream;
  int i;
  char * TStr="00000000";      //发送前数据
  char * TStr1=new char [50];             //发送后读取的数据
  TStr1[0]=0;
 for(i=0;i<=3;i++) SendStream->Add(0xFE);    // 发送四个FE
  SendStream->Add(0x68);
  SendStream->Add(0x99) ;
  SendStream->Add(0x99);
  strncat(TStr1,TStr,8-strlen(Addr));
  strcat(Addr,TStr1);          //把数据放在的址
  while(strlen(Addr)>0)
  {
   TStr1[0]=0;
   strncat(TStr1,Addr,2);    //将字符串2个地址加到TStr1中
   SendStream->Add((unsigned char)Str2Hex(TStr1));
   Addr+=2;
  }
  SendStream->Add(0x68);
  SendStream->Add(0x08);
  SendStream->Add(0x06);
  SendStream->Add(Byte2BCD(t.ti_sec)+0x33);   //发送数据  数据域加上0X33
  SendStream->Add(Byte2BCD(t.ti_min)+0x33);
  SendStream->Add(Byte2BCD(t.ti_hour)+0x33);
  SendStream->Add(Byte2BCD(d.da_day)+0x33);
  SendStream->Add(Byte2BCD(d.da_mon)+0x33);
  SendStream->Add(Byte2BCD(d.da_year%100)+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]);
   //  delay(100);                                                                                0
     //itemp=i+1;
     //printf("%d\n",i+1);
     // getch();
   }
   ClrLCDScr();
   
  // RefreshWin();
   printf("%s","send over\n");
   getch();
 //  EnableRx(0);
   SetCommMode(workmode, commport, baudrate);  /*  设置工作模式 通讯口  波特率resume comm setting */
   DisableRx();
   delete []Buff;
   return 0;
}

//请求读后续帧**********************************************************
int Supervene(char * DataN,char *Getval,char * address) //读后续数据DataName读到的数据名称 Getval读到的据内容 Addr读到的数据地址
{

 unsigned char workmode,commport;       //定义工作模试  通讯口
  unsigned int  baudrate;                 //定义波特率

  if (!ComPlsInstalled())                 //测试通讯内核是否安装
  {     //clrscr;
  ClrLCDScr();
  // 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);
  // EnableRx(0);
  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(0x02);
  SendStream->Add(0x02);
   strcpy(Name,DataN);//

⌨️ 快捷键说明

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