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

📄 unit1.~cpp

📁 很不错的ADSL串口测试程序
💻 ~CPP
📖 第 1 页 / 共 3 页
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "YbCommDevice"
#pragma link "LMDBaseControl"
#pragma link "LMDBaseGraphicControl"
#pragma link "LMDControl"
#pragma link "LMDGraphicControl"
#pragma link "LMDLEDCustomLabel"
#pragma link "LMDLEDLabel"
#pragma resource "*.dfm"
TFrmADSLmain *FrmADSLmain;

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

void __fastcall TFrmADSLmain::SBPortSetClick(TObject *Sender)    //打开端口配置界面
{
  YbCommDevice1->SettingsDialog(this,true);
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::N1Click(TObject *Sender)         //打开端口配置界面
{
  YbCommDevice1->SettingsDialog(this,true);
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::ComboBoxTimerChange(TObject *Sender)   //设置系统采集时钟
{
 Timer1->Interval = StrToInt(ComboBoxTimer->Items->Strings[ComboBoxTimer->ItemIndex]);
 //FIsClearBuf = true;
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::E1Click(TObject *Sender)  //关闭主程序界面
{
 FrmADSLmain->Close();
}
//---------------------------------------------------------------------------



void __fastcall TFrmADSLmain::N5Click(TObject *Sender)  //打开版本号界面
{
  FormVersion->Show();        
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::ComboBoxCOMChange(TObject *Sender)
{
  if (ComboBoxCOM->ItemIndex == 0)
  {   //串口连接


    N1->Enabled = true;
    SBPortSet->Enabled = true;
    EditTCP->Enabled = false;
    TCP1->Enabled = false;
    PortIsOpen = true;
   ShowPortSetInfo();         //显示端口配置信息

  }
  else
  {     //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()); //端口号

    //ShowMessage(ClientSocket1->Address+ClientSocket1->Port);
    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::DisplayData(AnsiString strDisplay)
{
  Memo1->Lines->Add(strDisplay);
}
//---------------------------------------------------------------------------

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

  DisplayData("");
  DisplayData("|++++++开始采集参数++++++|");
  SBStartTask->Enabled = false;
  SBStopTask->Enabled = true;
  Timer1->Enabled = true;      //开始时钟
  IsTransmit = true;
  EditTCP->Enabled = false;

  SpeedButton1->Enabled = true;   //自动调试按钮
  SpeedButton2->Enabled = false;  //结束自动调试按钮
  SBAddrSET->Enabled = true;      //地址设置按钮
  UpDown2->Enabled = true;        //调整系统按钮

  if (ComboBoxCOM->ItemIndex == 0)
  {   //串口连接
    YbCommDevice1->Active = true;
  }
  else  //TCP连接
  {
    ClientSocket1->Active= true;
  }

  if (CB_Save->Checked)     //  若需要保存通讯记录
   {
      FILE *LogFile = fopen(FLogComFileName.c_str(),"a+");
      AnsiString strdata = "****************开始采集参数********************\n";
      fputs(strdata.c_str(),LogFile);   //写入通讯数据
      fclose(LogFile);
   }
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::SBStopTaskClick(TObject *Sender)
{
  DisplayData("");
  DisplayData("|++++++停止采集参数++++++|");
  SBStartTask->Enabled = true;
  SBStopTask->Enabled = false;
  Timer1->Enabled = false;     //停止时钟
  IsTransmit = false;
  FIsClearBuf = true;

  SpeedButton1->Enabled = false;   //自动调试按钮
  SpeedButton2->Enabled = false;  //结束自动调试按钮
  SBAddrSET->Enabled = false;      //地址设置按钮
  UpDown2->Enabled = false;        //调整系统按钮

  FAuto48VSet = false;             //停止自动调试标志

  if (ComboBoxCOM->ItemIndex == 0)
  {   //串口连接
    YbCommDevice1->Active = false;
  }
  else  //TCP连接
  {
    ClientSocket1->Active= false;
  }

  ShowMessage(ShowDetail());
  EditTCP->Enabled = true;
  if (CB_Save->Checked)     //  若需要保存通讯记录
   {
      FILE *LogFile = fopen(FLogComFileName.c_str(),"a+");

      AnsiString strdata = "\n****************停止采集参数********************\n";
      fputs(strdata.c_str(),LogFile);   //写入通讯数据
      fclose(LogFile);
   }

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

void __fastcall TFrmADSLmain::BuildCommand(void)
{
 PADSLCommand CommandNode;

 switch (CircleIndex)
 {
   case  0:                                 //全部采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 0;   //命令代号
          CommandNode->AnswerLen   = 11;  //命令返回字节数
          PCommandList->Add(CommandNode);
          ++CircleIndex;
          break;
   case  1:                                 //48V直流电压系数采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 3;   //命令代号
          CommandNode->AnswerLen   = 10;  //命令返回字节数
          PCommandList->Add(CommandNode);
          CircleIndex = 0;               //命令代号索引归零
          break;

   default:
          CircleIndex = 0;
          break;

 }

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

void __fastcall TFrmADSLmain::BuildCmd(void)     //建立命令列表
{
  int Index;
  PADSLCommand tmpCmd;

  if (PCommandList->Count == 0)
  {
    BuildCommand();
  }
  tmpCmd = (struct TADSLCommand *)PCommandList->Items[0];
  CurrentCommand = * tmpCmd;
  PCommandList->Delete(0);
  delete tmpCmd;
  CmdNum = MakeCommand();
  strCmd ="";
  for (Index =0 ; Index<=CmdNum -1 ;++Index)
  {
     strCmd = strCmd +IntToHex(Byte(WBuf[Index]),2)+" ";
  }
   SendCmd();
}
//---------------------------------------------------------------------------

char __fastcall TFrmADSLmain::CheckSum(char *P ,int PCount)     //数据校验
{
  int Index;
  Byte Crc;
  Crc =0;
  for (Index = 3 ; Index <= PCount -1 ;++Index)
  {
    Crc =Crc + Byte(P[Index]);
  }

  return Char(Crc);
}
//---------------------------------------------------------------------------
 int  __fastcall TFrmADSLmain::MakeCommand(void)     //具体命令建立
{
  int ADD1,ADD2;

  WBuf[0] = char(0x7C);           //包头

  //设备地址
  ADD1  = DevAdd & 0x0F;       //低四位
  ADD2 = (DevAdd >> 4);       //高四位

  WBuf[1] = char(0x30+ADD2);     //设备地址高四位
  WBuf[2] = char(0x30+ADD1);      //设备地址低四位

  switch(CurrentCommand.CommandCode)
  {
    case 0 :  //全部采集命令:特征码:0301
    /*     序号	1	2	3	4	5	6
        字节数	1	2	1       2	1	1
         格式	7CH	ADDR	02H	0301H	CRC	0DH
    */

      WBuf[3] = char(0x02);              //数据长度
      WBuf[4] = char(0x03);              //命令代码
      WBuf[5] = char(0x01);
      WBuf[6] = CheckSum(WBuf,6);       //校验
      WBuf[7] = char(0x0D);              //包尾

      return 8;

   case 2 :  //48V直流电压系数设置命令:特征码:0302
    /*   序号	  1	2	3	4      	5	6       7
         字节数	  1	2	1	2      	2	1       1
          格式	 7CH	ADDR	04H	0302H	X	CRC     0DH
          X系数  电压系数(高位在前,地位在后)
    */

      WBuf[3] = char(0x04);              //数据长度
      WBuf[4] = char(0x03);              //命令代码
      WBuf[5] = char(0x02);
      WBuf[6] = char(int(CurrentCommand.Value) / 256); //X系数-电压系数
      WBuf[7] = char(int(CurrentCommand.Value) % 256);
      WBuf[8] = CheckSum(WBuf,8);       //校验
      WBuf[9] = char(0x0D);              //包尾

      return 10;


    case 3 :  //48V直流电压系数查寻命令:特征码:0303

    /*     序号	1	2	3	4	5	6
         字节数	1	2	1       2	1	1
          格式	7CH	ADDR	02H	0303H	CRC	0DH
    */

      WBuf[3] = char(0x02);              //数据长度
      WBuf[4] = char(0x03);              //命令代码
      WBuf[5] = char(0x03);
      WBuf[6] = CheckSum(WBuf,6);       //校验
      WBuf[7] = char(0x0D);              //包尾

      return 8;


    case 4 :  //48V直流电压系数设置登陆命令:特征码:0304
    /*
          序号	  1	2	3	4      	5	6       7
         字节数	  1	2	1	2      	2	1       1
          格式	 7CH	ADDR	04H	0304H	X	CRC     0DH
          X登陆命令(BCD码)  (高位在前,地位在后)
     */
      WBuf[3] = char(0x04);              //数据长度
      WBuf[4] = char(0x03);              //命令代码
      WBuf[5] = char(0x04);
      WBuf[6] = BCDToChar(CurrentCommand.Value1,1); //X系数-登陆命令
      WBuf[7] = BCDToChar(CurrentCommand.Value1,2);
      WBuf[8] = CheckSum(WBuf,8);      //校验
      WBuf[9] = char(0x0D);              //包尾

      return 10;


    case 5 :  //48V直流电压撤消登陆命令:特征码:0305
   /*
          序号	  1	2	3	4      	5	6       7
         字节数	  1	2	1	2      	2	1       1
          格式	 7CH	ADDR	04H	0305H	X	CRC     0DH
          X登陆命令(BCD码)  (高位在前,地位在后)
     */

      WBuf[3] = char(0x04);              //数据长度
      WBuf[4] = char(0x03);              //命令代码
      WBuf[5] = char(0x05);
      WBuf[6] = BCDToChar(CurrentCommand.Value1,1); //X系数-登陆命令
      WBuf[7] = BCDToChar(CurrentCommand.Value1,2);
      WBuf[8] = CheckSum(WBuf,8);      //校验
      WBuf[9] = char(0x0D);              //包尾


      return 10;


     case 6 :  //设备地址设置命令:特征码:0306
   /*
          序号	  1	2	3	4      	5	6        7       8
         字节数	  1	2	1	2      	1	4        1       1
          格式	 7CH   3F3FH	07H	0306H	X   31323334H   CRC     0DH
         X设备地址
     */
      WBuf[1] = char(0x3F);     //表示所有地址有效
      WBuf[2] = char(0x3F);     //
      WBuf[3] = char(0x07);     //数据长度
      WBuf[4] = char(0x03);     //命令代码
      WBuf[5] = char(0x06);
      WBuf[6] = char(Byte(CurrentCommand.Value));     //设备地址高四位
      WBuf[7] = char(0x31);
      WBuf[8] = char(0x32);
      WBuf[9] = char(0x33);
      WBuf[10] = char(0x34);
      WBuf[11] = CheckSum(WBuf,12);      //校验
      WBuf[12] = char(0x0D);              //包尾

      return 13;

   }

 return 0;

}

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

void __fastcall TFrmADSLmain::SendCmd(void)
{
 if (ComboBoxCOM->ItemIndex == 0)             //串口连接
 {
  YbCommDevice1->WritePackage(WBuf,CmdNum); //发送数据包
 }
 else                                       //TCP连接
 {
   ClientSocket1->Socket->SendBuf(WBuf,CmdNum);
 }

  FStatistics.SendCount++;                 //发送命令次数
  FStatistics.SendByteCount += CmdNum;     //累计发送字节数

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

void __fastcall TFrmADSLmain::Timer1Timer(TObject *Sender)
{
  int num, i;
  AnsiString timestr,str,strtmp;
  FILE *LogFile;
  unsigned char RBuf1[BufSize];
  bool FLGRecvOK = false;

 try
 {
  //清空接收缓存
  if (FIsClearBuf)
  {
    if (ComboBoxCOM->ItemIndex == 0)             //串口连接
    {
      YbCommDevice1->ReadPackage(RBuf1,BufSize); //接收数据包
    }
    else                                       //TCP连接
    {
      ClientSocket1->Socket->ReceiveBuf(RBuf1,BufSize);
    }
     FIsClearBuf = false;
  }

   if (IsTransmit)     //发送命令
   {
    IsTransmit = false;
    LastGetDataTime = Now();
    RBufNum = 0;
    BuildCmd();
    DisplayData("");
    timestr = TimeToStr(LastGetDataTime) + " 发送:"+ArrayCMDName[CurrentCommand.CommandCode];   //显示时间与标题
    DisplayData(timestr);
    DisplayData(strCmd);  //显示通讯数据

    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);
    }
   }

   else        //接收命令
   {
    if (ComboBoxCOM->ItemIndex == 0)             //串口连接
    {
      num = YbCommDevice1->ReadPackage(RBuf1,BufSize); //接收数据包
    }
    else                                       //TCP连接
    {

⌨️ 快捷键说明

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