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

📄 unit1.cpp

📁 网吧电量采集、温湿度采集串口通信实例程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:

  int  i,Head;
  char *CmdStr;
  unsigned char tmp1,tmp2,tmp3;
  AnsiString cmd1,cmd2;
  if(CurrentCommand.CommandCode == 0 || CurrentCommand.CommandCode == 1)
  {
    Head = FindFrame(RBuf, RBufNum, char(0x7B));     //寻找包头
  }
  else
  {                                                 //电量
  Head = FindFrame(RBuf, RBufNum, char(0x68));     //寻找包头
  }
  if (Head == -1)
  {         //未找到包头
     RBufNum = 0;
     RBuf[0] = char(0);
     FIsRecvError = true;
     DisplayData("======采集命令校验异常1======");
     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("======采集命令校验异常2======");
    return false;
  }
  else      //检查数据返回包的是否正常
 {
    //检查数据返回包的是否正常
    tmp1 = Char(RBuf[Head+CurrentCommand.AnswerLen-2]);
    tmp2 = Char(CheckSum1(&RBuf[Head],CurrentCommand.AnswerLen-2));
    tmp3 = Char(CheckSum(&RBuf[Head],CurrentCommand.AnswerLen-2));
    if(CurrentCommand.CommandCode == 0||CurrentCommand.CommandCode == 1)
    {
      cmd1 = IntToHex(RBuf[Head+4],2)+ IntToHex(RBuf[Head+5],2);
    }
    else if(CurrentCommand.CommandCode ==15)
    {
      cmd1 = ArrayCMD[CurrentCommand.CommandCode];
    }
    else
    {
      cmd1 = IntToHex(RBuf[Head+10],2)+ IntToHex(RBuf[Head+11],2);
    }

    cmd2 = ArrayCMD[CurrentCommand.CommandCode];

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

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

        FIsRecvError = true;
        DisplayData("======采集命令校验异常4======");
        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;

  return  strDetail;

}

//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::SBAddressSet(void)      //地址设置命令
{
  PADSLCommand CommandNode;
  int          Index;
try
{
  for (Index = 0 ; Index<=PCommandList->Count - 1 ;++Index)
  {
    delete(PCommandList->Items[Index]);
  }
  PCommandList->Clear();

  CommandNode = new TADSLCommand;
  CommandNode->CommandCode =15;   //命令代号
  CommandNode->AnswerLen   = 12;                   //命令返回字节数

  //增加命令
  PCommandList->Add(CommandNode);

  IsTransmit = true;
  FIsClearBuf = true;

  //ShowMessage("操作命令提交!");
}
catch(Exception & E)
{
 //ShowMessage("请输入整数!!!");
}
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::YbCommDevice1CommNotify(TObject *Sender,
      int NotifyType)
{
   ShowPortSetInfo();         //显示端口配置信息

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

void __fastcall TFrmADSLmain::ShowPortSetInfo(void)
{
   StatusBar1->Panels->Items[1]->Text = "当前连接方式:串口"
                                          +IntToStr(YbCommDevice1->PortNo)+"COM"
                                          +"  波特率:"+ArrayBound[YbCommDevice1->Baud];

}

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

void __fastcall TFrmADSLmain::N2Click(TObject *Sender)
{
  Memo1->Lines->Clear();
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::N4Click(TObject *Sender)
{

 SBStartTask->Click();
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::CB_SaveClick(TObject *Sender)
{
    if (CB_Save->Checked)     //  若需要保存通讯记录
       {
         FLogComFileName = FLogPath + "\\Com" +FormatDateTime("yyyymmddhhnnss",Now()) + ".txt";
         FILE *LogFile = fopen(FLogComFileName.c_str(),"a+");
         AnsiString strdata = "****************START LOGING********************\n";
         fputs(strdata.c_str(),LogFile);   //写入通讯数据
         fclose(LogFile);
        }
    else
    {
         FILE *LogFile = fopen(FLogComFileName.c_str(),"a+");
         AnsiString strdata = "****************END LOGING********************\n";
         fputs(strdata.c_str(),LogFile);   //写入通讯数据
         fclose(LogFile);
    }

}

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

void __fastcall TFrmADSLmain::L1Click(TObject *Sender) //打开日志文件
{
 if (!FLogComFileName.IsEmpty())
 {
   WinExec(AnsiString("explorer "+FLogComFileName).c_str(),SW_SHOWNORMAL);
 }
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::P2Click(TObject *Sender)
{
  SBStopTask->Click();        
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::CreateLogDir(void)  //创建log目录
{
  if(!DirectoryExists(FLogPath))
 {
   if(!CreateDir(FLogPath))
   {
     ShowMessage("创建日志log目录失败!!!");
   }
 }

}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::FormClose(TObject *Sender,
      TCloseAction &Action)
{
 if (PortIsOpen)
 {
  YbCommDevice1->Free();
 }
  if (ClientSocket1->Active)
  {
    ClientSocket1->Active= false;
  }

  //清除命令
  for (int Index = 0 ; Index<=PCommandList->Count - 1 ;++Index)
  {
    delete(PCommandList->Items[Index]);
  }
  PCommandList->Clear();
        
}
//---------------------------------------------------------------------------

__fastcall TFrmADSLmain::TFrmADSLmain(TComponent* Owner)
        : TForm(Owner)
{
    PortIsOpen = false;     //初始化系统变量
    IsTransmit = false;
    DevAdd =StrToInt("0x"+CBAddress->Text);  //获取设备号
    FLogPath = ExtractFileDir(Application->ExeName); //存储目录初始化
    FLogPath = FLogPath + "\\log";
    CreateLogDir();                      //创建日志log目录
    Timer1->Interval = 800;              //时钟参数初始化,默认800ms
    ComboBoxTimer->ItemIndex = 4;
    for (int Index = 0 ;Index<2; ++Index)       //模拟量存储阀值数组初始化
    {
      FValve_V[Index] = 0;
    }
    CircleIndex = 0 ;            //命令代码轮寻初始化
    FIsClearBuf = false;        //设置清空缓存标志
    FIsRecvError = false;       //接收数据解析与校验正常

    //统计信息初始化
    FStatistics.SendCount        = 0;
    FStatistics.RecvCount        = 0;
    FStatistics.SendByteCount    = 0;
    FStatistics.RecvByteCount    = 0;
    FStatistics.RecvCountTimeOut = 0;
    FStatistics.RecvCountError   = 0;

    
    N1->Enabled = true;         //系统初始化时为串口连接方式
    SBPortSet->Enabled = true;
    EditTCP->Enabled = false;
    TCP1->Enabled = false;
    PortIsOpen = true;         //串口打开标志置位
    ShowPortSetInfo();         //显示端口配置信息
  try
   {
     YbCommDevice1->Active = true;
     AddressBCD = ComboBox1->Text;   //WBZ设备地址
     AddressBCD.Delete(3,1);
     AddressBCD.Delete(5,1);
     AddressBCD.Delete(7,1);
     AddressBCD.Delete(9,1);
     AddressBCD.Delete(11,1);
   }
  catch(Exception &e)
   {
     ShowMessage("YbCommDevice1: "+e.Message);
     if(!YbCommDevice1->SettingsDialog(this,true))
       Application->Terminate();
   }

  YbCommDevice1->PackageSize = 4096; //最大可发送 4096 个字节的数据包
  YbCommDevice1->PackageType = cptFrameTimeout; //用判断超时的方法接收数据包
  YbCommDevice1->UsePackage  = true; //启动数据包 (可以随时启动和停止, 与 Active 属性无关)
}
//---------------------------------------------------------------------------


void __fastcall TFrmADSLmain::SBAddrSETClick(TObject *Sender)
{
 SBAddressSet();//设置地址
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::EditTCPChange(TObject *Sender)         //TCP连接
{
try
  {
    ClientSocket1->Active = false;
    AnsiString StrIP = EditTCP->Text.Trim();
    ClientSocket1->Address = StrIP.SubString(1,StrIP.Pos(":")-1);   //IP
    ClientSocket1->Port = StrToInt((StrIP.SubString(StrIP.Pos(":")+1,StrIP.Length())).Trim()); //端口号
    ClientSocket1->Active = true;
    PortIsOpen = false;
    EditTCP->Enabled = true;
    TCP1->Enabled = true;
    N1->Enabled = false;
    SBPortSet->Enabled = false;
    StatusBar1->Panels->Items[1]->Text = "当前连接方式:TCP "+StrIP;
  }
  catch(Exception &E)
  {
     ShowMessage(E.Message);
  }
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::ClearShow(void)
{
try
  {
  switch (CurrentCommand.CommandCode)
  {
   case 0:
   Label48VXH->Caption = "00.00℃";
   break;

   case 1:
   Shape220VXH->Brush->Color = clSilver;
   Shape1->Brush->Color = clSilver;
   Shape2->Brush->Color = clSilver;
   Shape3->Brush->Color = clSilver;
   Shape4->Brush->Color = clSilver;
   Shape5->Brush->Color = clSilver;
   Shape6->Brush->Color = clSilver;
   Shape7->Brush->Color = clSilver;
   break;

   case 2:
   Edit1->Text = "0000";
   break;

   case 3:
   Edit2->Text = "0000";
   break;

   case 4:
   Edit3->Text = "0000";
   break;

   case 5:
   Edit4->Text = "00.00";
   break;

   case 6:
   Edit5->Text = "00.00";
   break;

   case 7:
   Edit6->Text = "00.00";
   break;

   case 8:
   Edit7->Text = "00.00";
   break;

   case 9:
   Edit8->Text = "00.00";
   break;

   case 10:
   Edit9->Text = "00.00";
   break;

   case 11:
   Edit10->Text = "00.00";
   break;

   case 12:
   Edit11->Text = "00.00";
   break;

   case 13:
   Edit12->Text = "00.00";
   break;

   case 14:
   Edit13->Text = "00.00";
   break;
   }

  }
  catch(Exception &E)
  {
     ShowMessage(E.Message);
  }
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::ComboBox1Change(TObject *Sender)
{
  AddressBCD = ComboBox1->Text;      //WBZ设备地址
  AddressBCD.Delete(3,1);
  AddressBCD.Delete(5,1);
  AddressBCD.Delete(7,1);
  AddressBCD.Delete(9,1);
  AddressBCD.Delete(11,1);
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::SpeedButton3Click(TObject *Sender)
{
  PADSLCommand CommandNode;
  int          Index;
try
{
  for (Index = 0 ; Index<=PCommandList->Count - 1 ;++Index)
  {
    delete(PCommandList->Items[Index]);
  }
  PCommandList->Clear();

  CommandNode = new TADSLCommand;
  CommandNode->CommandCode =16;   //命令代号
  CommandNode->AnswerLen   = 12;  //命令返回字节数

  //增加命令
  PCommandList->Add(CommandNode);

  IsTransmit = true;
  FIsClearBuf = true;

  //ShowMessage("操作命令提交!");
}
catch(Exception & E)
{
 //ShowMessage("请输入整数!!!");
}
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::CBAddressChange(TObject *Sender)
{
try
{
   //DevAdd =StrToInt("0x"+CBAddress->Items->Strings[CBAddress->ItemIndex]);  //获取设备号
   DevAdd =StrToInt("0x"+CBAddress->Text);  //获取设备号

 }
 catch(Exception &E)
 {
  ShowMessage("请输入有效数据!!!");
 }        
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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