📄 unit1.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 + -