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

📄 testwrite.cpp

📁 Borland c++编写
💻 CPP
字号:
/*int xbh(void)//向电表中写表号;
{
      clrscr();
      
      char *time=new char[8];
      char *Mc=new char[2];
      char *Addr=new char[8];
      char *writeName1=new char[4];
      
      int num,count;
      unsigned tmp;
      char fhead[12];


      writeName1[0]=0;
      time[0]=0;
      Mc[0]=0;
      Addr[0]=0;
      

      strcat(writeName1, "C032");
      strcat(Addr, "99999999");

       do
	{
	 if (writedata1(writeName1,Mc,Addr)==0)
	  {
	   clrscr();
	   printf ("%s","success");
	   getch();
	   count=18;
	   num++;
	  }
	 else
	  {
	   count++;
	  }
	}while(count<3);//enddo
     }//endfor
     dbfclose();
     delete [] writeName1;
     delete [] Mc;
     delete [] Addr;
     clrscr();
     return 0;
}*/
//---------------------------------------------------
 int LwriteData(char *Addr,char * address) 
{
 //addr 为数据项,address 为返回的数据项
  unsigned char workmode,commport;       //定义工作模试  通讯口
  unsigned int  baudrate;                 //定义波特率

 if (!ComPlsInstalled())                 //测试通讯内核是否安装
  {
    clrscr();
    printf("Complus must be installed first!!!  \n");  //首先必须安置通讯
    getch ();
    return(1);
  }
  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];             //发送后读取的数据
  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(0x04);
  SendStream->Add(0x08);//数据长度
  SendStream->Add(0x32+0x33);//两位标识码
  SendStream->Add(0xC0+0x33);
  SendStream->Add(0x00+0x33);
  SendStream->Add(0x00+0x33);
 
 // strncat(TStr1,TStr,8-strlen(Addr));
 // strcat(Addr,TStr1);          //把数据放在的址
  Addr+=7;//数据长度,此时为4个字节
  while(strlen(Addr)>0)
  {
   TStr1[0]=0;
   strncat(TStr1,Addr,2);    //将字符串2个地址加到TStr1中
   SendStream->Add((unsigned char)Str2Hex(TStr1)+0x33);
   Addr-=2;
  }
  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++)  
   {
     PutAuxByte(Buff[i]);
   }
   clrscr();
   printf("%s","send over\n");
   EnableRx(0);
/****************************************************************/
   unsigned char c;                                //义返回字符
   unsigned char flagchar;                          // 设步
   unsigned char Errflag=0;                         // 将错误标记付0
   unsigned char *AddrBuff=new unsigned char[5];    // 定义地址缓冲区
   unsigned char CtrlCode;                          // 控制码
   unsigned char DataLeng;                          // 数据长度
   unsigned char *DataBuff;                         // 数据缓冲区
   unsigned char RCS;
   unsigned char CS;                                // 校验码
   unsigned char DebugChar;
   flagchar=1;
   DataLeng=0;                                      //初始化数据长度为0
   clrscr();
   i=0;
   RCS=0x68;
   while(Errflag==0 && flagchar!=6)            //分步判断字符是否正确,并且存在缓冲区中
   {
	 if(ReceiveChar(c,50)==0)                   //如果接到了数据(在1秒钟之内)
	 {
	   Errflag=1;
	   break;
	 }
	 else
	 {                                         //接收数据从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","002\n");  // 第二步错
				Errflag=2;                   //  数据校验错
			  }//end if(c==0x68)
			}
			else
			{
			  if(i>4)                     //   是否在大于4位是出现FE
			  {
				  printf("%s","003\n");
				  Errflag=2;
			  }
			}//end if(c!=0xFE)
			break;
		  }
		case 2:
		  {
			if(i==7)
			{
			  if(c==0x68)                   // 如果C=68第二步完成
			  {
				i=0;                        //  在第一个数据中
				flagchar=3;                   // 转到第三步
			  }
			  else
			  {
				  printf("%s","004\n");     //如果不是68错误
				  Errflag=2;
			  }
			}
			else
			{
			  AddrBuff[i-1]=c;     //如果I小于7取出字符并且放在地址中
			}
			break;
		  }//IF(I=7)
		case 3:
		  {
			if(i==1)
			{
			  CtrlCode=c;   //  控制码
			  if(CtrlCode!=0x84) Errflag=2;
			}
			/*if(CtrlCode==0xc4) 
			{
			 	
			}*/
			  if(i==2)
			   {
			     DataLeng=c;
			     flagchar=4;                          //转到第4步 case4
			     i=0;
			   }

			break;
		  }
		case 4:
		  {
		    if(DataLeng==0)         //
			  {
				i=0;
				flagchar=5;
				//printf("%s" ,"Success\n");
			  }
			    else
			  {
				  printf("%s","005\n");     //如果数据长度不为0
				  Errflag=2;
			  }

			break;
		  }
		case 5:
		  {
		    	if(i==1 && RCS!=c)
			{
			 printf("%d",RCS);
			  Errflag=3;
			}
			if(i==2)
			{
			  if(c==0x16)
			  {
			       printf("%s" ,"Success\n");
			       flagchar=6;
			  }
			  else
			  {
				  printf("%s","005\n");
				  Errflag=2;
			  }
			}
			int z;
                        char *Str1;
                        address[0]=0; 
                        for (z=0;z<12;z++)
                         {
	                   Byte2Hex(AddrBuff[z],Str1);
	                   strcat(address,Str1);
                         }
                        flagchar=6; 
			break;
		  }
	  }//end switch
   }
    
   delete SendStream;  //延时发送
   delete TStr1;
   delete AddrBuff;
   SetCommMode(workmode, commport, baudrate);  /*  设置工作模式 通讯口  波特率resume comm setting */
   DisableRx();
   
  return Errflag;
 }
//---------------------------------------------------
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;
}

⌨️ 快捷键说明

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