📄 pc2clientdlg.cpp
字号:
// PC2ClientDlg.cpp : implementation file
//
#include "stdafx.h"
#include "PC2Client.h"
#include "PC2ClientDlg.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPC2ClientDlg dialog
CPC2ClientDlg::CPC2ClientDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPC2ClientDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CPC2ClientDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CPC2ClientDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPC2ClientDlg)
DDX_Control(pDX, IDC_VOLUME4, m_Volume4);
DDX_Control(pDX, IDC_VOLUME3, m_Volume3);
DDX_Control(pDX, IDC_VOLUME2, m_Volume2);
DDX_Control(pDX, IDC_VOLUME1, m_Volume1);
DDX_Control(pDX, IDC_VALVE4, m_Valve4);
DDX_Control(pDX, IDC_VALVE2, m_Valve2);
DDX_Control(pDX, IDC_VALVE1, m_Valve1);
DDX_Control(pDX, IDC_SETUPCOM, m_Setup);
DDX_Control(pDX, IDC_OPENCOM, m_Open);
DDX_Control(pDX, IDC_CLOSECOM, m_Close);
DDX_Control(pDX, IDC_EDIT1, m_Edit1);
DDX_Control(pDX, IDC_VALVE3, m_Valve3);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPC2ClientDlg, CDialog)
//{{AFX_MSG_MAP(CPC2ClientDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_SETUPCOM, OnSetupcom)
ON_BN_CLICKED(IDC_OPENCOM, OnOpencom)
ON_BN_CLICKED(IDC_CLOSECOM, OnClosecom)
ON_WM_CLOSE()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPC2ClientDlg message handlers
BOOL CPC2ClientDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
int i,k;
this->SetWindowText("PC->KingComClient:19200 COM4 O-8-1");
DWORD style=WS_VISIBLE|WS_CHILD;
if (!myComm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))
{
AfxMessageBox("创建MSComm控件失败!");
return -1;
}
m_Open.EnableWindow(false);
m_Close.EnableWindow(false);
bytCount=0;
bytSum=0;
k=1;
for(i=22;i>=0;i--)
{
arrMantissa[i] =(float)(1 /pow(2,k));
k++;
}
for(i=0;i<=7;i++)
{
arrCompare[i] =(BYTE) pow(2,i);
}
for(i=0;i<=4;i++)
{
arrB[i]=0;
arrF[i]=0;
}
arrTypeLong[1]=1; //byte型占1字节
arrTypeLong[2]=2; //int型占2字节
arrTypeLong[3]=4; //float型占4字节
arrTypeLong[4]=2; //uint型占2字节
dblIncStep=0.1;
dblVarible=-1;
m_Edit1.SetReadOnly(true);
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CPC2ClientDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CPC2ClientDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CPC2ClientDlg::OnSetupcom()
{
// TODO: Add your control notification handler code here
CString myStr,myStr1;
if (mySetupDlg.DoModal()==IDOK)
{
myStr="PC->KingComClient:";
switch (mySetupDlg.m_Com )
{
case 0:
{
myStr+="COM1 ";
break;
}
case 1:
{
myStr+="COM2 ";
break;
}
case 2:
{
myStr+="COM3 ";
break;
}
case 3:
{
myStr+="COM4 ";
break;
}
case 4:
{
myStr+="COM5 ";
break;
}
case 5:
{
myStr+="COM6 ";
break;
}
}
switch (mySetupDlg.m_BaudRate)
{
case 0:
{
myStr+="19200 ";
break;
}
case 1:
{
myStr+="9600 ";
break;
}
case 2:
{
myStr+="4800 ";
break;
}
case 3:
{
myStr+="2400 ";
break;
}
}
switch (mySetupDlg.m_Parity)
{
case 0:
{
myStr+="N-8-1";
break;
}
case 1:
{
myStr+="O-8-1";
break;
}
case 2:
{
myStr+="E-8-1";
break;
}
}
this->SetWindowText(myStr);
m_Open.EnableWindow(true);
m_Close.EnableWindow(false);
}
}
BEGIN_EVENTSINK_MAP(CPC2ClientDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CPC2ClientDlg)
ON_EVENT(CPC2ClientDlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnCommMscomm1, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CPC2ClientDlg::OnOnCommMscomm1()
{
// TODO: Add your control notification handler code here
int intDimension;//每次进入OnComm事件后,读出数据的个数.一帧读完后,是一帧数据的个数
int i; //循环计数用
bool bFlag; //调用函数时返回值,成功与否,
BYTE arrTemp[4]; //临时存放字节型数组
BYTE bytTemp; //临时存放字节型变量
float fTemp; //临时使用的浮点数
BYTE bytActFlag; //操作标志,读还是写
BYTE bytType; //数据类型
int intOffset; //寄存器偏移地址
BYTE bytNumber; //读请求中要读的数据个数
BYTE bytDataLong; //回应读请求时,回应串行字符的总个数
CString myStr,myStr1; //显示信息时使用
VARIANT input1; //定义VARIANT类型变量
BYTE rxdata[2048]; //定义存放二进制数据的数组,rxdata[]临时存放每次接收到的串行信号原始值,并非完整帧
long k;
COleSafeArray safearray1; //定义COleSafeArray类的实例
CByteArray Array1; //创建存放二进制数据的CByteArray类实例
input1=myComm.GetInput();
//将VARAIANT变量赋值给COleSafeArray类的实例
safearray1=input1;
//使用COleSafeArray类的成员函数获取数据长度
intDimension=safearray1.GetOneDimSize();
for(k=0;k<intDimension;k++)
//使用COleSafeArray类的成员函数将数据写入数组
{
safearray1.GetElement(&k,rxdata+k);
arrReceive[bytCount+k]=rxdata[k]; //传数
}
switch(bytCount) // '区别是否首次读一帧数据,0为首次读
{
case 0:
{
switch(arrReceive[2])
{
case 0x52: //若为读操作
{
bytCount = intDimension;
bytSum = 9; //应该接收到的数据个数为9个
break;
}
case 0x57: //若为写操作
{
switch(arrReceive[3]) //区别byte类型1还是float类型3
{
case 1:
{
bytCount = intDimension;
bytSum = 10; //应该接收到的数据个数为10个
break;
}
case 3:
{
bytCount = intDimension;
bytSum = 12; //应该接收到的数据个数为12个
break;
}
}
}
}
break;
}
default:
{
bytCount+=intDimension; //累计已接收到的数据个数
}
}
if (bytCount == bytSum) //已经收到要求数量的字符
{
myStr1="收到:";
for(k=0;k<bytCount;k++)
{
myStr.Format("%02X",arrReceive[k]);
myStr1+=myStr;
myStr1+="-";
}
m_Edit1.SetSel(1000000,1000000);
myStr1.TrimRight('-');
m_Edit1.ReplaceSel(myStr1);
UpdateData(false);
intDimension = bytCount;
bytCount = 0;
bytSum = 0;
}
else
{
if(bytCount>20) //传输出现错误,重新开始进行接收计数
{
bytCount = 0;
bytSum = 0;
}
return;
}
//已经收到要求数量的字符,并且存放在arrReceive[]中
//判校验CRC正确否?正确继续,否则跳出oncomm过程
bytTemp = 0;
for(k=0;k<=intDimension-3;k++)
{
bytTemp=bytTemp^arrReceive[k];
}
if (bytTemp!=arrReceive[intDimension-2])
{
bFlag=AckError(0x83);
return;
}
//判结束符0D?
if( arrReceive[intDimension - 1] != 0x0D)
{
bFlag = AckError(0x82);
return;
}
//判STX起始位是否为02?
if( arrReceive[0] != 0x2)
{
bFlag = AckError(0x82);
return;
}
//判Sta起始位是否为27?
if( arrReceive[1] != 0x27)
{
bFlag = AckError(0x82);
return;
}
switch(arrReceive[2]) //确定操作类型
{
case 0x52:
case 0x57:
{
bytActFlag = arrReceive[2];
break;
}
default:
{
bFlag = AckError(0x82);
return;
}
}
switch(arrReceive[3]) //确定数据类型
{
case 1:
case 3:
{
bytType = arrReceive[3];
break;
}
default:
{
bFlag = AckError(0x80);
return;
}
}
intOffset = arrReceive[4] + arrReceive[5] * 256;//变量偏移地址
switch(bytActFlag)
{
case 0x57: //写操作
{
switch(bytType)
{
case 1:
{
arrB[intOffset]= arrReceive[7];
myStr1=" 写B";
myStr.Format("%d=%02X",intOffset,arrB[intOffset]);
myStr1+=myStr;
myStr1+="\15\12";
m_Edit1.SetSel(1000000,1000000);
m_Edit1.ReplaceSel(myStr1);
if( arrB[intOffset] == 255)
{
switch(intOffset)
{
case 1:
{
m_Valve1.SetWindowText("已打开");
break;
}
case 2:
{
m_Valve2.SetWindowText("已打开");
break;
}
case 3:
{
m_Valve3.SetWindowText("已打开");
break;
}
case 4:
{
m_Valve4.SetWindowText("已打开");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -