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

📄 unit1.cpp

📁 很不错的ADSL串口测试程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
      num = ClientSocket1->Socket->ReceiveBuf(RBuf1,BufSize);
    }


    if (num == -1)
    {
     return;
    }

     //累计接收到数据字节数
     if ((num == -1) || (num == 0))      //如果没有收到则退出
     {
       FStatistics.RecvByteCount = FStatistics.RecvByteCount;
       }
     else
     {
       FStatistics.RecvByteCount = FStatistics.RecvByteCount + num;

     }  

     //显示数据
     str = "";
     for (i= 0 ; i<=num - 1;++i)
     {
       str = str + IntToHex(int(RBuf1[i]),2);
       strtmp = strtmp + IntToHex(int(RBuf1[i]),2) + " ";
     } 
     if(!str.IsEmpty())
     {
       timestr = TimeToStr(LastGetDataTime) + " 接收:";      //显示时间与标题
      // DisplayData("");
       DisplayData(timestr);
       DisplayData(strtmp);
       if (CB_Save->Checked)     //  若需要保存通讯记录
       {
       
         LogFile = fopen(FLogComFileName.c_str(),"a+");
         fputs(timestr.c_str(),LogFile); //写入时间与标题
         fputs(strCmd.c_str(),LogFile);   //写入通讯数据
         fputs("\n",LogFile);
         fclose(LogFile);
        }
       }//end  IsEmpty

       if (RBufNum + num < 2000)     //如果收到的字节数不溢出,则写入接收缓冲区
       {
          for(i = 0 ; i<=num - 1;++i)
            RBuf[RBufNum+i] = RBuf1[i];
          RBufNum = RBufNum + num;
          RBuf[RBufNum] = char(0);
         }
       else
       {
         RBufNum = 0;
         RBuf[0] = char(0);
       }
      //ReceiveOk 并且 接收数据解析与校验正常

       if(!str.IsEmpty())
       {
         FLGRecvOK=ReceiveOk();
       }

        if ((!str.IsEmpty())&&FLGRecvOK&& (!FIsRecvError))
        {
          ++FStatistics.RecvCount;  //累计接收正常次数
          FIsRecvError = false;
          IsTransmit = True;
        }
        //not ReceiveOk 并且 接收数据解析与校验不正常
        else if ((!str.IsEmpty())&&(!FLGRecvOK) && FIsRecvError)
        {
          //累计接收错误次数
          ++FStatistics.RecvCountError;
          ClearShow();    //显示清零

          if (CB_Save->Checked)     //  若需要保存通讯记录
          {

            LogFile = fopen(FLogComFileName.c_str(),"a+");
            fputs(timestr.c_str(),LogFile); //写入时间与标题
            fputs("接收数据校验或解析错误!!!",LogFile);   //写入通讯数据
            fputs("\n",LogFile);
            fclose(LogFile);
           }

          FIsRecvError = false;
          IsTransmit = True;
        }

      //接收数据超时
      else if (TimeOut())
      {
        //日志记录超时时间
        //时间与标题
        timestr = TimeToStr(LastGetDataTime) + " 接收:";
        if (CB_Save->Checked)     //  若需要保存通讯记录
        {
          
          LogFile = fopen(FLogComFileName.c_str(),"a+");
          fputs(timestr.c_str(),LogFile); //写入时间与标题
          fputs("接收超时!!!",LogFile);   //写入通讯数据
          fputs("\n",LogFile);
          fclose(LogFile);
        }

        //累计接收超时次数
        ++FStatistics.RecvCountTimeOut;
        ClearShow();    //显示清零
        DisplayData("======接收超时======");
        IsTransmit = True;
      }

   }

  }
  catch(Exception &E)
  {
    IsTransmit = True;
  }


}

//---------------------------------------------------------------------------

char __fastcall TFrmADSLmain::BCDToChar(AnsiString StrBCD ,int Count)         //BCD转换函数
{
  Byte tmp1,tmp2;
  Byte tmp = 0;
  int  i;
  char * CmdStr;

  CmdStr =  StrBCD.c_str();
  if (Count*2-2>StrBCD.Length())
  {
   return char(0);
  }
  for (i=Count*2-2;i<Count*2-1;++i)
  {

    tmp1 = CmdStr[i]-'0';

    if(i+2 > StrBCD.Length())
    {
     tmp2 =0;
    }
    else
    tmp2 = CmdStr[++i]-'0';
    tmp  = tmp1*16+tmp2;
  }

  return char(tmp);

}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain:: DataRefresh(char * Buf)         //数据解析
{
  float      D[16];   //采集模拟量存储
  int        DS[8];   //采集数字量存储
  int        tmpSign;
  int        Index;
  FILE       *LogFile;
  AnsiString  strdata;
  switch (CurrentCommand.CommandCode)
  {
   case 0:             //返回全部数据采集
   try
   {
     D[0]  = (Byte(Buf[6])*256+Byte(Buf[7]))/100.0;      //48V直流电压
     DS[0] = Byte(Buf[8]);                //220V交流电压数字量
   }
   catch (Exception & E)
   {
     D[0]  = 0;
     DS[0] = 0;
     DisplayData("=====全部数据采集异常=====");
   }

   //----------------------------界面显示数据-----------------------------//

   LMDLEDLab48V->Caption = FormatFloat("00.00",D[0]);   // 48V直流电压

   if(LMDLEDLab48V->Caption != "00.00")
   {
     if((FAuto48VSet == false)&&(SpeedButton1->Enabled == false))
     {
       FAuto48VSet = true;   //设置自动调整电压系数标志
       SB48VOrderXH();//登陆命令设置
     }
   } 

   if (DS[0]==1)    //220v数字量为1
   {
     Shape220VXH->Brush->Color = clRed ;
     Label220VXH->Caption = "有电";
   }
   else
   {
     Shape220VXH->Brush->Color = clSilver ;
     Label220VXH->Caption = "无电";
   }

   //-------------------------数据存储------------------------------------//
    if (CB_Save->Checked)     //  若需要保存通讯记录
       {
        
         LogFile = fopen(FLogComFileName.c_str(),"a+");
         strdata = "";
         strdata = TimeToStr(Now())+"解析:";
         strdata += "48V直流电压="+FormatFloat("0.00",D[0])+"V";
         strdata +="  ";
         strdata += "220V交流电压模拟量="+IntToStr(DS[0]);
         fputs(strdata.c_str(),LogFile);   //写入通讯数据
         fputs("\n",LogFile);
         fclose(LogFile);
        }

     if(FAuto48VSet)       //如果需要自动调试
     {
       A48VCollect();   //48V电压系数查询命令
     }

    break;

   case 3:    //48V直流电压系数采集命令
   try
   {
     DS[0]  = Byte(Buf[6])*256+Byte(Buf[7]);      //48V直流电压系数
     D[0]   = DS[0]/100.0;
   }
   catch (Exception & E)
   {
     D[0]  = 0;
     DS[0]  = 0;
     DisplayData("=====直流电压系数采集异常=====");
   }

   //----------------------------------界面显示数据--------------------//

    LB48VShow->Caption = IntToStr(DS[0]);   // 48V直流电压系数


   //-------------------------数据存储------------------------------------//
    if (CB_Save->Checked)     //  若需要保存通讯记录
       {
        
         LogFile = fopen(FLogComFileName.c_str(),"a+");
         strdata = "";
         strdata = TimeToStr(Now())+"解析:";
         strdata += "48V直流电压系数="+FormatFloat("0.00",D[0]);
         fputs(strdata.c_str(),LogFile);   //写入通讯数据
         fputs("\n",LogFile);
         fclose(LogFile);
        }

   if(FAuto48VSet)       //如果需要自动调试
     {
       SB48VOrderXH();//登陆命令设置
     }

   break;
   case 2:
   if(Byte(Buf[6])==1)
   {
     DisplayData("=====电压系数设置成功=====");
     if(FAuto48VSet)       //如果需要自动调试
     {

       AllCollect();   //全部采集命令
     }
   }
   else if(Byte(Buf[6])==0)
   {
     DisplayData("=====电压系数设置失败=====");
   }
   break;

   case 4:
   if(Byte(Buf[6])==1)
   {
     DisplayData("=====登陆命令成功=====");
     SB48VPSetOrder();        //登陆成功,则开始设置电压系数命令

   }
   else if(Byte(Buf[6])==0) //不会调用此分支条件,登陆不成功,则不返回数据包,接收超时
   {
     DisplayData("=====登陆命令失败=====");

     SpeedButton2->Click();//结束自动调试按钮


   }
   break;

   case 5:
   if(Byte(Buf[6])==1)
   {
     DisplayData("=====撤消登陆命令成功=====");
   }
   else if(Byte(Buf[6])==0)
   {
     DisplayData("=====撤消登陆命令失败=====");
   }
   break;

   case 6:
   if(Byte(Buf[6])==1)
   {
     DisplayData("=====硬件地址设置成功=====");
   }
   else if(Byte(Buf[6])==0)
   {
     DisplayData("=====硬件地址设置失败=====");
   }
   break;

} //end switch
}
//---------------------------------------------------------------------------

int __fastcall TFrmADSLmain::FindFrame(char *FrameStr, int FrameLen, char HeadChr)//寻找特征字符
{
  int  i;
  for( i= 0 ;i<=FrameLen-1;++i)
  {
  if (FrameStr[i] == HeadChr)
   {
      return i;
    }
  }
   return -1;
}
//---------------------------------------------------------------------------

bool __fastcall TFrmADSLmain::ReceiveOk(void)       //接收确认
{

  int  i,Head;
  char *CmdStr;
  unsigned char tmp1,tmp3;
  AnsiString cmd1,cmd2;

  Head = FindFrame(RBuf, RBufNum, char(0x7C));     //寻找包头
  if (Head == -1)
  {         //未找到包头
     RBufNum = 0;
     RBuf[0] = char(0);
     FIsRecvError = true;
     DisplayData("======采集命令校验异常======");
     return false;
  }
  else if ((RBufNum - Head ) < CurrentCommand.AnswerLen)  //返回数据不完整
  //如果找到头,把缓冲区前移
  {
    for (i = 0 ;i<= RBufNum - Head - 1;++i)
    {
     RBuf[i] = RBuf[i + Head];
    }
    RBuf[RBufNum - Head] = char(0);
    RBufNum = RBufNum - Head;
    FIsRecvError = true;
    DisplayData("======采集命令校验异常======");
    return false;
  }
  else      //检查数据返回包的是否正常
 {
    //检查数据返回包的是否正常
    tmp1 = Char(RBuf[Head+CurrentCommand.AnswerLen-2]);
    tmp3 = Char(CheckSum(&RBuf[Head],CurrentCommand.AnswerLen-2));

    cmd1 = IntToHex(RBuf[Head+4],2)+ IntToHex(RBuf[Head+5],2);
    cmd2 = ArrayCMD[CurrentCommand.CommandCode];

   if ((tmp1 == tmp3) && (cmd1 == cmd2))
   {
       try
       {

        DataRefresh(&RBuf[Head]);
       }catch(Exception &E)
        {
          FIsRecvError = true;
          DisplayData("=====数据解析异常======");
          return false;
        }
     }
      else
      {
        FIsRecvError = true;
        DisplayData("======采集命令校验异常======");
        return false;
      }

  }

 return true;
}
//---------------------------------------------------------------------------
bool __fastcall TFrmADSLmain::TimeOut(void)//超时处理
{
   if ((double(Now()-LastGetDataTime)) > (5 / 24 / 60 /60))
   {
    return true;
    }
   else
   {
    return false;
   }
}
//---------------------------------------------------------------------------

AnsiString __fastcall TFrmADSLmain:: ShowDetail(void)         //显示统计信息
{

  AnsiString  strDetail =""
    + Format("累计发送命令次数 = %d",ARRAYOFCONST((FStatistics.SendCount)))+"\n"
    //+ Format("累计发送数据字节 = %d",ARRAYOFCONST((FStatistics.SendByteCount)))+"\n"
    + Format("累计接收正常次数 = %d",ARRAYOFCONST((FStatistics.RecvCount)))+"\n"
    //+ Format("累计接收数据字节 = %d",ARRAYOFCONST((FStatistics.RecvByteCount)))+"\n"
    + Format("累计接收超时次数 = %d",ARRAYOFCONST((FStatistics.RecvCountTimeOut)))+"\n"
    + Format("累计接收错误次数 = %d",ARRAYOFCONST((FStatistics.RecvCountError)));

   if (CB_Save->Checked)     //  若需要保存通讯记录
       {
         FILE *LogFile = fopen(FLogComFileName.c_str(),"a+");
         AnsiString  strdata = "****************累计信息统计********************\n";
         fputs(strdata.c_str(),LogFile);   //写入通讯数据
         fputs(strDetail.c_str(),LogFile);   //写入通讯数据
         fclose(LogFile);
        }

    //统计信息清零
    FStatistics.SendCount        = 0;
    FStatistics.RecvCount        = 0;
    FStatistics.SendByteCount    = 0;
    FStatistics.RecvByteCount    = 0;
    FStatistics.RecvCountTimeOut = 0;
    FStatistics.RecvCountError   = 0;
        

⌨️ 快捷键说明

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