📄 seriessampledlg.cpp
字号:
// SeriesSampleDlg.cpp : implementation file
//
#include "stdafx.h"
#include "SeriesSample.h"
#include "SeriesSampleDlg.h"
#include "DlgSeriesSteup.h"
#include "LoginDlg.h"
#include <memory.h>
#include <string.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//define for NETWORK LAYER PACKET constant
//Status of Send_object
#define ST_SENDOBJ_DISABLE 0
#define ST_SENDOBJ_ACTIVE 1
#define ST_SENDING_OBJ 2
#define ST_SENDOBJ_FINISHED 3
// 信息头
#define PAA 0xAA // 包起始第一位
#define P55 0x55 // 包起始第二位
// 包类型
#define PT_SEARCHNWREQ 0xA0 //搜索网络请求
#define PT_SEARCHNWACK 0xA1 //搜索网络应答
#define PT_SEARCHNDREQ 0xA2 //搜索设备请求
#define PT_SEARCHNDACK 0xA3 //搜索设备应答
#define PT_CONNREQ 0xA4 // 握手请求包
#define PT_CONNACK 0xA5 // 握手应答包
#define PT_SENDMSGREQ 0xB0 //消息发送
#define PT_SENDMSGACK 0xB1 //消息发送应答
#define PT_BROADCAST 0xB2 //消息广播
#define PT_BROADCASTACK 0xB3 //消息广播应答
#define PT_OBJTRANSREQ 0xC0 //对象传输请求
#define PT_OBJTRANSACK 0xC1 //对象传输应答
#define PT_ZBQULITYREQ 0xF0 //ZB信号质量查询请求
#define PT_ZBQULITYRACK 0xF1 //ZB信号质量查询应答
#define PT_ZBSENSITIVEREQ 0xF2 //ZB信号灵敏度查询请求
#define PT_ZBSENSITIVEACK 0xF3 //ZB信号灵敏度查询应答
#define MAX_PACKET_LEN 114 //最大包长度
#define MAX_PACKET_DATA_LEN 100 //最大包数长度
#define MAX_BUF_LEN 4096 ////最大缓冲区长度
extern CString g_MyID,g_MyPwd;
extern WORD g_WritePointer,g_ReadPointer;
extern BYTE g_dataPointer,g_recvLen,g_statusOfObj;
extern BOOL g_bDone,g_bGhExit,g_bPacketRecv_Flag,g_bLargePacket;
extern BYTE g_sendBuf[MAX_PACKET_LEN];
extern BYTE g_recvBuf[MAX_BUF_LEN];
extern BYTE g_recvdata[MAX_PACKET_LEN];
extern int g_PacketNo;
/////////////////////////////////////////////////////////////////////////////
// CSeriesSampleDlg dialog
CSeriesSampleDlg::CSeriesSampleDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSeriesSampleDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSeriesSampleDlg)
m_strRecv = _T("");
m_strSend = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSeriesSampleDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSeriesSampleDlg)
DDX_Text(pDX, IDC_EDTRECV, m_strRecv);
DDX_Text(pDX, IDC_EDTSEND, m_strSend);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSeriesSampleDlg, CDialog)
//{{AFX_MSG_MAP(CSeriesSampleDlg)
ON_BN_CLICKED(IDC_BTNSEND, OnBtnsend)
ON_BN_CLICKED(IDC_BTNDISCONN, OnBtndisconn)
ON_BN_CLICKED(IDC_BTNCONN, OnBtnconn)
ON_BN_CLICKED(IDC_BTN_LOGIN, OnBtnLogin)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSeriesSampleDlg message handlers
BOOL CSeriesSampleDlg::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
CenterWindow(GetDesktopWindow()); // center to the hpc screen
g_bGhExit=FALSE;
g_ReadPointer=0;
g_WritePointer=0;
g_dataPointer=0;
g_PacketNo=0;
g_bDone=FALSE;
g_bPacketRecv_Flag=FALSE;
g_bLargePacket=FALSE;
g_statusOfObj=ST_SENDOBJ_DISABLE;
// TODO: Add extra initialization here
SetTimer(1,100,NULL);
return TRUE; // return TRUE unless you set the focus to a control
}
void CSeriesSampleDlg::OnBtnsend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
BYTE * buf;
int i;
int bufLen = m_strSend.GetLength();
buf = new BYTE[bufLen];
for (i=0;i<bufLen;i++)
buf[i]=m_strSend[i];
PacketData(buf,PT_SENDMSGACK,0,0,0,bufLen);
//CopyMemory(buf,m_strSend.GetBuffer(m_strSend.GetLength()),bufLen);
if (!m_ceSeries.WritePort(g_sendBuf,bufLen+14))
{
AfxMessageBox(L"写入失败");
}
else
{
AfxMessageBox(L"写入成功");
}
}
void CSeriesSampleDlg::OnBtndisconn()
{
// TODO: Add your control notification handler code here
m_ceSeries.ClosePort();
KillTimer(1);
CButton *pBtnConn = (CButton*)GetDlgItem(IDC_BTNCONN);
CButton *pBtnDisConn = (CButton*)GetDlgItem(IDC_BTNDISCONN);
CButton *pBtnSend = (CButton*)GetDlgItem(IDC_BTNSEND);
ASSERT(pBtnConn != NULL);
ASSERT(pBtnDisConn != NULL);
ASSERT(pBtnSend != NULL);
pBtnConn->EnableWindow(TRUE);
pBtnDisConn->EnableWindow(FALSE);
pBtnSend->EnableWindow(FALSE);
}
void CSeriesSampleDlg::OnBtnconn()
{
// TODO: Add your control notification handler code here
m_ceSeries.m_OnSeriesRead = OnSeriesRead;
DlgSeriesSteup dlgSeries;
if (dlgSeries.DoModal() == IDOK)
{
if (!m_ceSeries.OpenPort(this,dlgSeries.m_portNo,dlgSeries.m_baud,dlgSeries.m_parity,dlgSeries.m_databits,dlgSeries.m_stopbits))
{
AfxMessageBox(L"打开串口失败");
}
else //打开成功的话,将关闭按钮和发送按钮置为可用
{
AfxMessageBox(L"打开串口成功");
/*CButton *pBtnConn = (CButton*)GetDlgItem(IDC_BTNCONN);
CButton *pBtnDisConn = (CButton*)GetDlgItem(IDC_BTNDISCONN);
CButton *pBtnSend = (CButton*)GetDlgItem(IDC_BTNSEND);
ASSERT(pBtnConn != NULL);
ASSERT(pBtnDisConn != NULL);
ASSERT(pBtnSend != NULL);
pBtnConn->EnableWindow(FALSE);
pBtnDisConn->EnableWindow(TRUE);
pBtnSend->EnableWindow(TRUE);*/
}
}
}
void CSeriesSampleDlg::OnSeriesRead(CWnd* pWnd,BYTE* buf,int bufLen)
{
/*CSeriesSampleDlg *pDlg = (CSeriesSampleDlg *)pWnd;
CEdit * pEdit;
pEdit = (CEdit*)pDlg->GetDlgItem(IDC_EDTRECV);
CString strRecv = (char*)buf;
CString strOld;
pEdit->GetWindowText(strOld);
pEdit->SetWindowText(strOld + strRecv);
*/
int i;
for(i=0;i<bufLen;i++)
{
g_recvBuf[g_WritePointer]=buf[i];
g_WritePointer=(g_WritePointer+1)%MAX_BUF_LEN;
}
delete[] buf;
}
void CSeriesSampleDlg::OnBtnLogin()
{
// TODO: Add your control notification handler code here
CString sID[10]={"12345","10000","10001","10002","10003","10004",
"10005","10006","10007","10008"};
CString sPwd[10]={"12345","10000","10001","10002","10003","10004",
"10005","10006","10007","10008"};
BOOL bIDOKFlag=FALSE;
BOOL bPwdOKFlag=FALSE;
int i=0;
CLoginDlg dlgLogin;
if(dlgLogin.DoModal()==IDOK)
{
for(i=0;i<10;i++)
{
if(sID[i]==g_MyID) bIDOKFlag=TRUE;
break;
}
for(i=0;i<10;i++)
{
if(sPwd[i]==g_MyPwd) bPwdOKFlag=TRUE;
break;
}
if(bIDOKFlag&&bPwdOKFlag)
{
CButton *pBtnConn = (CButton*)GetDlgItem(IDC_BTNCONN);
CButton *pBtnDisConn = (CButton*)GetDlgItem(IDC_BTNDISCONN);
CButton *pBtnSend = (CButton*)GetDlgItem(IDC_BTNSEND);
ASSERT(pBtnConn != NULL);
ASSERT(pBtnDisConn != NULL);
ASSERT(pBtnSend != NULL);
pBtnConn->EnableWindow(FALSE);
pBtnDisConn->EnableWindow(TRUE);
pBtnSend->EnableWindow(TRUE);
}
else
AfxMessageBox(L"用户ID或密码错误!");
}
}
void CSeriesSampleDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
BYTE dataLen=0;
int prePacketNo=0;
KillTimer(1);
switch(g_statusOfObj)
{
case ST_SENDOBJ_ACTIVE:
g_PacketNo=0;
prePacketNo=0;
g_statusOfObj=ST_SENDING_OBJ;
break;
default:
break;
}
while ((g_ReadPointer!=g_WritePointer)&&(!g_bDone))
{
g_recvdata[g_dataPointer]=g_recvBuf[g_ReadPointer];
g_ReadPointer=(g_ReadPointer+1)%MAX_BUF_LEN;
g_dataPointer=g_dataPointer+1;
switch(g_dataPointer)
{
case 1:
if(g_recvdata[0]!=PAA)
{
g_dataPointer=0;
for(int i=0;i<MAX_PACKET_LEN;i++)
g_recvdata[i]=0x00;
}
break;
case 2:
if(g_recvdata[1]!=P55)
{
g_dataPointer=0;
for(int i=0;i<MAX_PACKET_LEN;i++)
g_recvdata[i]=0x00;
}
break;
default:
break;
}
if(g_dataPointer>=12) dataLen=g_recvdata[11];
if(g_dataPointer>=(14+dataLen))
{/**/
g_bPacketRecv_Flag=TRUE;
g_recvLen=g_dataPointer;
g_dataPointer=0;
g_bDone=TRUE;
ParseData();
}
}
SetTimer(1,100,NULL);
}
BOOL CSeriesSampleDlg::CheckData(BYTE ldata[], int iLen)
{
int i,checksum;
BYTE checkhigh,checklow;
checksum=0;
for(i=0;i<iLen-2;i++)
checksum=checksum+ldata[i];
checkhigh=checksum/256;
checklow=checksum%256;
if ((checkhigh==ldata[iLen-2])&&(checklow==ldata[iLen-1]))
return TRUE;
else
return FALSE;
}
void CSeriesSampleDlg::ParseData()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -