📄 zdjcform.~cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "ZDJCForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Trayicon"
#pragma link "Lcd99"
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
iBaud = 9600;
bAddress = 0xFF;
iTerCount = 0;
iTryTimes = 0;
Comm.SetWnd (this->Handle);
bSeekStatus = false;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCloseQuery(TObject *Sender, bool &CanClose)
{
if (MessageBoxEx(this->Handle, "确认要退出本系统吗?",
"询问", MB_YESNO|MB_ICONQUESTION, 0) == IDYES)
CanClose = true;
else
CanClose = false;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::PopMenuExitClick(TObject *Sender)
{
MenuExitSysClick(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::MenuExitSysClick(TObject *Sender)
{
Close ();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::TBExitClick(TObject *Sender)
{
MenuExitSysClick(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::PopMenuMinClick(TObject *Sender)
{
PopMenuMin->Enabled = false;
TrayIcon->Minimize ();
PopMenuRestore->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::PopMenuRestoreClick(TObject *Sender)
{
PopMenuRestore->Enabled = false;
TrayIcon->Restore ();
PopMenuMin->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::TrayIconRestore(TObject *Sender)
{
PopMenuMin->Enabled = true;
PopMenuRestore->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::TrayIconMinimize(TObject *Sender)
{
PopMenuMin->Enabled = false;
PopMenuRestore->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::MenuItemComOptionClick(TObject *Sender)
{
ComOptionDlg->ComboBoxBaud->ItemIndex =iItemIndex;
ComOptionDlg->UpDown->Position = iPosition;
if (ComOptionDlg->ShowModal () == mrOk)
{
switch (ComOptionDlg->ComboBoxBaud->ItemIndex)
{
case 0:
iBaud = 1200;
break;
case 1:
iBaud = 2400;
break;
case 2:
iBaud = 4800;
break;
case 3:
iBaud = 9600;
break;
case 4:
iBaud = 19200;
break;
}
ADOTableComOpt->Active = true;
ADOTableComOpt->Edit();
ADOTableComOpt->FieldValues["BaudIndex"] = ComOptionDlg->ComboBoxBaud->ItemIndex;
ADOTableComOpt->FieldValues["Delay"] = ComOptionDlg->EditDelay->Text;
iItemIndex = ComOptionDlg->ComboBoxBaud->ItemIndex;
iPosition = ComOptionDlg->UpDown->Position;
ADOTableComOpt->Post();
ADOTableComOpt->Active = false;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::TBComOptionClick(TObject *Sender)
{
MenuItemComOptionClick(Sender);
}
//---------------------------------------------------------------------------
void TMainForm::ComBrowse()
{
HANDLE hComHandle;
AnsiString ComPort;
TTreeNode *ComNode;
COMMPROP ComProperties;
//搜索当前机器上的所有串口
for (int i=0; i<256; i++)
{
ComPort = "COM" + IntToStr(i);
hComHandle = CreateFile(ComPort.c_str(),
GENERIC_READ | GENERIC_WRITE,
0, // must be opened with exclusive-access
NULL, // no security attributes
OPEN_EXISTING, // must use OPEN_EXISTING
0, // not overlapped I/O
NULL // hTemplate must be NULL for comm devices
);
//根结点增加一个COM结点
if (hComHandle != INVALID_HANDLE_VALUE)
{
GetCommProperties (hComHandle, &ComProperties);
if (ComProperties.dwProvSubType == PST_RS232) //是否是标准COM口
{
ComNode = TreeView->Items->AddChild(TreeView->TopItem, ComPort);
ComNode->ImageIndex = 2;
ComNode->SelectedIndex = 2;
}
}
CloseHandle (hComHandle);
}
TreeView->TopItem->Expanded = true;
}
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
ADOTableComOpt->Active = true;
iItemIndex = ADOTableComOpt->Fields->Fields[0]->AsInteger;
iPosition = ADOTableComOpt->Fields->Fields[1]->AsInteger;
iPosBeg = ADOTableComOpt->Fields->Fields[2]->AsInteger;
iPosEnd = ADOTableComOpt->Fields->Fields[3]->AsInteger;
iPosTimes = ADOTableComOpt->Fields->Fields[4]->AsInteger;
ADOTableComOpt->Active = false;
switch (iItemIndex)
{
case 0:
iBaud = 1200;
break;
case 1:
iBaud = 2400;
break;
case 2:
iBaud = 4800;
break;
case 3:
iBaud = 9600;
break;
case 4:
iBaud = 19200;
break;
}
ComBrowse ();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::MenuItemSeekOptionClick(TObject *Sender)
{
SeekTermDlg->UpDownBeg->Position = iPosBeg;
SeekTermDlg->UpDownEnd->Position = iPosEnd;
SeekTermDlg->UpDownTimes->Position = iPosTimes;
if (SeekTermDlg->ShowModal () == mrOk)
{
ADOTableComOpt->Active = true;
ADOTableComOpt->Edit();
ADOTableComOpt->FieldValues["SeekBegin"] = SeekTermDlg->UpDownBeg->Position;
ADOTableComOpt->FieldValues["SeekEnd"] = SeekTermDlg->UpDownEnd->Position;
ADOTableComOpt->FieldValues["SeekTimes"] = SeekTermDlg->UpDownTimes->Position;
iPosBeg = SeekTermDlg->UpDownBeg->Position;
iPosEnd = SeekTermDlg->UpDownEnd->Position;
iPosTimes = SeekTermDlg->UpDownTimes->Position;
ADOTableComOpt->Post();
ADOTableComOpt->Active = false;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::TBSeekOptionClick(TObject *Sender)
{
MenuItemSeekOptionClick (Sender);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::TreeViewMouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
THitTests HT;
HT = TreeView->GetHitTestInfoAt(X, Y);
if (HT.Contains(htOnItem))
{
if (TreeView->Selected->Level == 1) //如果是串口层
{
SelComNode = TreeView->Selected;
iTerCount = 0;
bSeekStatus = true;
TimerQuery->Enabled = false;
TimerSeek->Enabled = !TimerSeek->Enabled;
if (TimerSeek->Enabled)
{
SelComNode->DeleteChildren ();
if(Comm.IsOpen()) //关闭串口
Comm.Close();
if (Comm.Open(TreeView->Selected->Index+1, iBaud)) //打开串口
{
StatusBar->Panels->Items[0]->Text = SelComNode->Text + "已经打开!";
StatusBar->Panels->Items[3]->Text = "开始搜索" + SelComNode->Text + "上的设备!";
//搜索起始地址
bAddress = iPosBeg;
TimerSeek->Interval = iPosition;
}
else
{
ShowMessage ("Fail");
}
}
else
{
if (Comm.IsOpen ())
{
Comm.Close ();
StatusBar->Panels->Items[0]->Text = SelComNode->Text + "已经关闭!";
StatusBar->Panels->Items[1]->Text = "";
StatusBar->Panels->Items[3]->Text = "停止搜索" + SelComNode->Text + "上的设备!";
}
}
}
if (TreeView->Selected->Level == 2) //如果是设备层
{
TimerSeek->Enabled = false;
bSeekStatus = false;
TimerQuery->Enabled = !TimerQuery->Enabled;
if (TimerQuery->Enabled)
{
if(Comm.IsOpen()) //关闭串口
Comm.Close();
if (Comm.Open(SelComNode->Index+1, iBaud)) //打开串口
{
ComStatus = COM_84;
bAddress = TreeView->Selected->Text.ToInt();
TimerQuery->Interval = iPosition;
StatusBar->Panels->Items[0]->Text = SelComNode->Text + "已经打开!";
StatusBar->Panels->Items[3]->Text = "开始与" + TreeView->Selected->Text + "号设备通信!";
}
}
}
SelComNode->Expanded = true;
}
}
//---------------------------------------------------------------------------
WORD TMainForm::CRC16 (Byte *auchMsg, int usDataLen)
{
WORD wCRC = 0xFFFF;
const WORD wFirBit = 0x0001;
const WORD wParam = 0xA001;
WORD wFirByte;
WORD wVal;
for (int i=0; i<usDataLen; i++)
{
wVal = *(auchMsg + i);
wCRC = wCRC ^ wVal;
for (int j=0; j<8; j++)
{
wFirByte = wCRC & wFirBit;
wCRC = wCRC >> 1;
if (0x0001 == wFirByte)
wCRC = wCRC ^ wParam;
}
}
return wCRC;
}
void TMainForm::On_Receive(TMessage& Message)
{
Byte Buffer[35];
WORDTYPE CRCValue;
TTreeNode *TerNode;
AnsiString CountString;
AnsiString AddressString;
int iBufLength = Comm.Read (Buffer, 35, 20);
if (bSeekStatus)
{
if (iBufLength == 11)
{
CRCValue.w = CRC16(Buffer, 9);
if (CRCValue.b[0] == Buffer[9] &&
CRCValue.b[1] == Buffer[10]) //校验码判断
{
//增加结点
iTerCount ++;
bAddress ++;
iTryTimes = 0;
TerNode = TreeView->Items->AddChild(SelComNode, Buffer[0]);
TerNode->ImageIndex = 3;
TerNode->SelectedIndex = 4;
CountString = iTerCount;
StatusBar->Panels->Items[2]->Text = "已搜索到" + CountString + "个设备!";
SelComNode->Expanded = true;
}
else
{
StatusBar->Panels->Items[2]->Text = "CRC校验错!";
}
}
}
else
{
if (iBufLength == 35)
{
CRCValue.w = CRC16 (Buffer, 33);
if (CRCValue.b[0] == Buffer[33] &&
CRCValue.b[1] == Buffer[34]) //校验码判断
{
if (Buffer[1] == 0x84) //判断功能码
{
ReadZDClassInfo (Buffer);
ComStatus = COM_82;
}
//AddressString = Buffer[0];
//StatusBar->Panels->Items[2]->Text = "收到" + AddressString + "号设备正确应答!";
}
else
{
StatusBar->Panels->Items[2]->Text = "CRC校验错!";
AnsiString Hex, Debug;
for (int i=0; i<iBufLength; i++)
{
Hex.printf ("%.2X ", Buffer[i]);
Debug += Hex;
}
Hex.printf ("%.2X ", CRCValue.b[0]);
Debug += Hex;
Hex.printf ("%.2X ", CRCValue.b[1]);
Debug += Hex;
Debug += "\n";
ErrorMessage (Debug.c_str());
}
}
if (iBufLength == 22)
{
CRCValue.w = CRC16 (Buffer, 20);
if (CRCValue.b[0] == Buffer[20] &&
CRCValue.b[1] == Buffer[21]) //校验码判断
{
switch (Buffer[1])
{
case 0x80:
ReadGroupInfo (Buffer);
GroupBoxGroup->Enabled = true;
ComStatus = COM_85;
break;
case 0x82:
ReadTermInfo (Buffer);
PanelTermInfo->Enabled = true;
ComStatus = COM_80;
break;
}
AddressString = Buffer[0];
StatusBar->Panels->Items[2]->Text = "收到" + AddressString + "号设备正确应答!";
}
else
{
StatusBar->Panels->Items[2]->Text = "CRC校验错!";
AnsiString Hex, Debug;
for (int i=0; i<iBufLength; i++)
{
Hex.printf ("%.2X ", Buffer[i]);
Debug += Hex;
}
Hex.printf ("%.2X ", CRCValue.b[0]);
Debug += Hex;
Hex.printf ("%.2X ", CRCValue.b[1]);
Debug += Hex;
Debug += "\n";
ErrorMessage (Debug.c_str());
}
}
if (iBufLength == 11)
{
CRCValue.w = CRC16 (Buffer, 9);
if (CRCValue.b[0] == Buffer[9] &&
CRCValue.b[1] == Buffer[10]) //校验码判断
{
if (Buffer[1] == 0x85)
{
ReadTimeInfo (Buffer);
ComStatus = COM_84;
GroupBoxTime->Enabled = true;
}
AddressString = Buffer[0];
StatusBar->Panels->Items[2]->Text = "收到" + AddressString + "号设备正确应答!";
}
else
{
StatusBar->Panels->Items[2]->Text = "CRC校验错!";
AnsiString Hex, Debug;
for (int i=0; i<iBufLength; i++)
{
Hex.printf ("%.2X ", Buffer[i]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -