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

📄 unit1.cpp

📁 网吧电量采集、温湿度采集串口通信实例程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
      WBuf[5] = BCDToChar(AddressBCD,4);           //地址
      WBuf[6] = BCDToChar(AddressBCD,5);           //
      WBuf[7] = BCDToChar(AddressBCD,6);           //
      WBuf[8] = char(0x68);
      WBuf[9] = char(0x01);
      WBuf[10] = char(0x02);
      WBuf[11] = char(0x55);
      WBuf[12] = char(0xE9);

      WBuf[13] = CheckSum2(WBuf,13);       //校验
      WBuf[14] = char(0x16);              //包尾

      return 15;

   case 7 :  //C相电流采集命令:

    /*     序号	1	2	3	4	5	6     7       8
         字节数	1	6	1       1	1	2      1      1
          格式	68H	ADDR	68H	01H	02H    56E9H    CRC    16H
    */
      WBuf[0] = char(0xFE);           //前导符
      WBuf[1] = char(0x68);           //包头
      WBuf[2] = BCDToChar(AddressBCD,1);           //地址
      WBuf[3] = BCDToChar(AddressBCD,2);           //
      WBuf[4] = BCDToChar(AddressBCD,3);           //
      WBuf[5] = BCDToChar(AddressBCD,4);           //地址
      WBuf[6] = BCDToChar(AddressBCD,5);           //
      WBuf[7] = BCDToChar(AddressBCD,6);           //
      WBuf[8] = char(0x68);
      WBuf[9] = char(0x01);
      WBuf[10] = char(0x02);
      WBuf[11] = char(0x56);
      WBuf[12] = char(0xE9);

      WBuf[13] = CheckSum2(WBuf,13);       //校验
      WBuf[14] = char(0x16);              //包尾

      return 15;

   case 8 :  //A相功率采集命令:

    /*     序号	1	2	3	4	5	6     7       8
         字节数	1	6	1       1	1	2      1      1
          格式	68H	ADDR	68H	01H	02H    64E9H    CRC    16H
    */
      WBuf[0] = char(0xFE);           //前导符
      WBuf[1] = char(0x68);           //包头
      WBuf[2] = BCDToChar(AddressBCD,1);           //地址
      WBuf[3] = BCDToChar(AddressBCD,2);           //
      WBuf[4] = BCDToChar(AddressBCD,3);           //
      WBuf[5] = BCDToChar(AddressBCD,4);           //地址
      WBuf[6] = BCDToChar(AddressBCD,5);           //
      WBuf[7] = BCDToChar(AddressBCD,6);           //
      WBuf[8] = char(0x68);
      WBuf[9] = char(0x01);
      WBuf[10] = char(0x02);
      WBuf[11] = char(0x64);
      WBuf[12] = char(0xE9);

      WBuf[13] = CheckSum2(WBuf,13);       //校验
      WBuf[14] = char(0x16);              //包尾

      return 15;

  case 9 :  //B相功率采集命令:

    /*     序号	1	2	3	4	5	6     7       8
         字节数	1	6	1       1	1	2      1      1
          格式	68H	ADDR	68H	01H	02H    65E9H    CRC    16H
    */
      WBuf[0] = char(0xFE);           //前导符
      WBuf[1] = char(0x68);           //包头
      WBuf[2] = BCDToChar(AddressBCD,1);           //地址
      WBuf[3] = BCDToChar(AddressBCD,2);           //
      WBuf[4] = BCDToChar(AddressBCD,3);           //
      WBuf[5] = BCDToChar(AddressBCD,4);           //地址
      WBuf[6] = BCDToChar(AddressBCD,5);           //
      WBuf[7] = BCDToChar(AddressBCD,6);           //
      WBuf[8] = char(0x68);
      WBuf[9] = char(0x01);
      WBuf[10] = char(0x02);
      WBuf[11] = char(0x65);
      WBuf[12] = char(0xE9);

      WBuf[13] = CheckSum2(WBuf,13);      //校验
      WBuf[14] = char(0x16);              //包尾

      return 15;

  case 10 :  //C相功率采集命令:

    /*     序号	1	2	3	4	5	6     7       8
         字节数	1	6	1       1	1	2      1      1
          格式	68H	ADDR	68H	01H	02H    66E9H    CRC    16H
    */
      WBuf[0] = char(0xFE);           //前导符
      WBuf[1] = char(0x68);           //包头
      WBuf[2] = BCDToChar(AddressBCD,1);           //地址
      WBuf[3] = BCDToChar(AddressBCD,2);           //
      WBuf[4] = BCDToChar(AddressBCD,3);           //
      WBuf[5] = BCDToChar(AddressBCD,4);           //地址
      WBuf[6] = BCDToChar(AddressBCD,5);           //
      WBuf[7] = BCDToChar(AddressBCD,6);           //
      WBuf[8] = char(0x68);
      WBuf[9] = char(0x01);
      WBuf[10] = char(0x02);
      WBuf[11] = char(0x66);
      WBuf[12] = char(0xE9);

      WBuf[13] = CheckSum2(WBuf,13);       //校验
      WBuf[14] = char(0x16);              //包尾

      return 15;

   case 11 :  //A相功率因数采集命令:

    /*     序号	1	2	3	4	5	6     7       8
         字节数	1	6	1       1	1	2      1      1
          格式	68H	ADDR	68H	01H	02H    84E9H    CRC    16H
    */
      WBuf[0] = char(0xFE);           //前导符
      WBuf[1] = char(0x68);           //包头
      WBuf[2] = BCDToChar(AddressBCD,1);           //地址
      WBuf[3] = BCDToChar(AddressBCD,2);           //
      WBuf[4] = BCDToChar(AddressBCD,3);           //
      WBuf[5] = BCDToChar(AddressBCD,4);           //地址
      WBuf[6] = BCDToChar(AddressBCD,5);           //
      WBuf[7] = BCDToChar(AddressBCD,6);           //
      WBuf[8] = char(0x68);
      WBuf[9] = char(0x01);
      WBuf[10] = char(0x02);
      WBuf[11] = char(0x84);
      WBuf[12] = char(0xE9);

      WBuf[13] = CheckSum2(WBuf,13);       //校验
      WBuf[14] = char(0x16);              //包尾

      return 15;

  case 12 :  //B相功率因素采集命令:

    /*     序号	1	2	3	4	5	6     7       8
         字节数	1	6	1       1	1	2      1      1
          格式	68H	ADDR	68H	01H	02H    85E9H    CRC    16H
    */
      WBuf[0] = char(0xFE);           //前导符
      WBuf[1] = char(0x68);           //包头
      WBuf[2] = BCDToChar(AddressBCD,1);           //地址
      WBuf[3] = BCDToChar(AddressBCD,2);           //
      WBuf[4] = BCDToChar(AddressBCD,3);           //
      WBuf[5] = BCDToChar(AddressBCD,4);           //地址
      WBuf[6] = BCDToChar(AddressBCD,5);           //
      WBuf[7] = BCDToChar(AddressBCD,6);           //
      WBuf[8] = char(0x68);
      WBuf[9] = char(0x01);
      WBuf[10] = char(0x02);
      WBuf[11] = char(0x85);
      WBuf[12] = char(0xE9);

      WBuf[13] = CheckSum2(WBuf,13);       //校验
      WBuf[14] = char(0x16);              //包尾

      return 15;

   case 13 :  //C相功率因数采集命令:

    /*     序号	1	2	3	4	5	6     7       8
         字节数	1	6	1       1	1	2      1      1
          格式	68H	ADDR	68H	01H	02H    86E9H    CRC    16H
    */
      WBuf[0] = char(0xFE);           //前导符
      WBuf[1] = char(0x68);           //包头
      WBuf[2] = BCDToChar(AddressBCD,1);           //地址
      WBuf[3] = BCDToChar(AddressBCD,2);           //
      WBuf[4] = BCDToChar(AddressBCD,3);           //
      WBuf[5] = BCDToChar(AddressBCD,4);           //地址
      WBuf[6] = BCDToChar(AddressBCD,5);           //
      WBuf[7] = BCDToChar(AddressBCD,6);           //
      WBuf[8] = char(0x68);
      WBuf[9] = char(0x01);
      WBuf[10] = char(0x02);
      WBuf[11] = char(0x86);
      WBuf[12] = char(0xE9);

      WBuf[13] = CheckSum2(WBuf,13);      //校验
      WBuf[14] = char(0x16);              //包尾

      return 15;

  case 14 :  //电度采集命令:

    /*     序号	1	2	3	4	5	6     7       8
         字节数	1	6	1       1	1	2      1      1
          格式	68H	ADDR	68H	01H	02H    43C3H    CRC    16H
    */
      WBuf[0] = char(0xFE);           //前导符
      WBuf[1] = char(0x68);           //包头
      WBuf[2] = BCDToChar(AddressBCD,1);           //地址
      WBuf[3] = BCDToChar(AddressBCD,2);           //
      WBuf[4] = BCDToChar(AddressBCD,3);           //
      WBuf[5] = BCDToChar(AddressBCD,4);           //地址
      WBuf[6] = BCDToChar(AddressBCD,5);           //
      WBuf[7] = BCDToChar(AddressBCD,6);           //
      WBuf[8] = char(0x68);
      WBuf[9] = char(0x01);
      WBuf[10] = char(0x02);
      WBuf[11] = char(0x43);
      WBuf[12] = char(0xC3);

      WBuf[13] = CheckSum2(WBuf,13);      //校验
      WBuf[14] = char(0x16);              //包尾

      return 15;

      case 15 :  //地址设置命令

    /*     序号	1	2	3	4	5	6     7       8
         字节数	1	6	1       1	1	6      1      1
          格式	68H    ADDR1	68H	0AH	06H    ADDR    CRC    16H

        注:ADDR1 = 99 99 99 99 99 99H
    */
      WBuf[0] = char(0xFE);           //前导符
      WBuf[1] = char(0x68);           //包头
      WBuf[2] = char(0x99);           //地址
      WBuf[3] = char(0x99);           //
      WBuf[4] = char(0x99);           //
      WBuf[5] = char(0x99);           //地址
      WBuf[6] = char(0x99);           //
      WBuf[7] = char(0x99);           //
      WBuf[8] = char(0x68);
      WBuf[9] = char(0x0A);
      WBuf[10] = char(0x06);

      WBuf[11] = BCDToChar(AddressBCD,1)+0x33;           //地址
      WBuf[12] = BCDToChar(AddressBCD,2)+0x33;           //
      WBuf[13] = BCDToChar(AddressBCD,3)+0x33;           //
      WBuf[14] = BCDToChar(AddressBCD,4)+0x33;           //地址
      WBuf[15] = BCDToChar(AddressBCD,5)+0x33;           //
      WBuf[16] = BCDToChar(AddressBCD,6)+0x33;           //

      WBuf[17] = CheckSum2(WBuf,17);       //校验
      WBuf[18] = char(0x16);              //包尾

      return 19;

      case 16 :  //电度清零命令

    /*     序号	1	2	3	4	5      6       7
         字节数	1	6	1       1	1      1       1
          格式	68H    ADDR	68H	04H	02H    CRC    16H
    */
      WBuf[0] = char(0xFE);           //前导符
      WBuf[1] = char(0x68);           //包头
      WBuf[2] = BCDToChar(AddressBCD,1);           //地址
      WBuf[3] = BCDToChar(AddressBCD,1);           //
      WBuf[4] = BCDToChar(AddressBCD,1);           //
      WBuf[5] = BCDToChar(AddressBCD,1);           //地址
      WBuf[6] = BCDToChar(AddressBCD,1);           //
      WBuf[7] = BCDToChar(AddressBCD,1);           //
      WBuf[8] = char(0x68);
      WBuf[9] = char(0x04);
      WBuf[10]= char(0x02);
      WBuf[11]= char(0xB2);
      WBuf[12]= char(0xC3);
      WBuf[13] = CheckSum2(WBuf,13);       //校验
      WBuf[14] = char(0x16);              //包尾

      return 15;

   }

 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;
  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) + "发送:";   //显示时间与标题
    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);
    }

    if (CurrentCommand.CommandCode == 16)     //清除电量命令则返回
    {
     IsTransmit = true;

    }


   }

   else        //接收命令
   {
    if (ComboBoxCOM->ItemIndex == 0)             //串口连接
    {
      num = YbCommDevice1->ReadPackage(RBuf1,BufSize); //接收数据包
    }
    else                                       //TCP连接
    {
      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);
     if(!str.IsEmpty())
     {
       timestr = TimeToStr(LastGetDataTime) + "接收:";      //显示时间与标题
       DisplayData("");
       DisplayData(timestr);
       DisplayData(str);
       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();    //显示清零
        if(CurrentCommand.CommandCode != 16)
        {
        DisplayData("======接收超时======");
        }
        IsTransmit = True;
      }

   }

  }
  catch(Exception &E)
  {
    IsTransmit = True;
    //ShowMessage(E.Message);
  }


}

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

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

⌨️ 快捷键说明

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