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

📄 unit1.cpp

📁 中国移动通讯基站和直放站CDT循环规约
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "MSCommLib_OCX"
#pragma resource "*.dfm"
TfrmMain *frmMain;
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::OpenComm()//打开串行端口
{
   AnsiString strMeg="不能打开端口"+String(PortNum);

   try
   {
     MSComm1->CommPort=1;//PortNum;
     MSComm1->PortOpen=true;
   }
   catch(...)
   {   Application->MessageBox(strMeg.c_str(),"端口错误,重新设置端口",MB_OK);}
   //改变菜单
   switch(PortNum)
   {
      case 1:
         smnuPort1->Checked=true;smnuPort2->Checked=false;
         break;
      case 2:
         smnuPort1->Checked=false;smnuPort2->Checked=true;
         break;
   }
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ReceiveReport()
{//读模块数据

    rBuff = VarArrayCreate(OPENARRAY(int,(0,InBufferCount-1)),varByte);
    rBuff = MSComm1->Input;
    for(int i = 0;i<InBufferCount;i++)
       rData[i]=rBuff.GetElement(i);

    if(rData[0] == 0XEB && rData[1] == 0X90 && rData[2] == 0XEB && rData[3] == 0X90
       && rData[4] == 0XEB && rData[5] == 0X90 && rData[11]==CDTCRC(6))//判断报文头与校验码
    {   
       switch(rData[7])
       {
          case 0X61://重要遥测
              for(int i=0;i<rData[8];i++)
              {  if(rData[17+i*6]==CDTCRC(12+i*6))//判各遥测值校验码
                   RM[i]= (rData[14+i*2]*256+rData[13+i*2]) & 0XFFF;//应根据实际需要再乘以变比
              }
              break;
          case 0XC2://次要遥测

             break;
          case 0XB3://一般遥测

             break;
          case 0XF4://遥信状态

             break;
          case 0X57://设定命令

             break;
       }
    }
    RefreshData();
}
//---------------------------------------------------------------------------
Byte __fastcall TfrmMain::CDTCRC(int Pos)
{//计算CRC
    ChkCRC=0;

    for(int i=Pos;i<Pos+5;i++)//计算校验码
    {
       ChkCRC^= rData[i];
       for(int j=0;j<8;j++)
       {  ChkCRC<<=1;
          if(ChkCRC & 0X100) ChkCRC ^= 0X107;
       }
    }
    return(~ChkCRC & 0xFF);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::Timer1Timer(TObject *Sender)
{//定时1秒检测输入缓冲区字节数
    InBufferCount=MSComm1->InBufferCount;
    StatusBar->Panels->Items[0]->Text =AnsiString(InBufferCount);
    if(InBufferCount>80) MSComm1->InBufferCount=0;//保护将输入缓冲区清零
    if(InBufferCount==30)
       ReceiveReport();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::RefreshData()
{//刷新数据
    lblRM1->Caption=RM[0];
    lblRM2->Caption=RM[1];
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormCreate(TObject *Sender)
{
    OpenComm();        
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::smnuExitClick(TObject *Sender)
{//退出
   if(MSComm1->PortOpen) MSComm1->PortOpen=false;
   Close();
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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