?? commtestdlg.cpp
字號:
// CommTestDlg.cpp : implementation file
//
#include "stdafx.h"
#include "CommTest.h"
#include "CommTestDlg.h"
#include "SetGB.h"
#include "MPGBTest.h"
#include "ComParaSet.h"
#include "MPTran.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
DWORD WINAPI ProcThread(LPVOID pParm);
DWORD WINAPI ProcThread(LPVOID pParm)
{
CCommTestDlg *pDlg = (CCommTestDlg *)pParm;
pDlg->Execute();
return 0;
}
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCommTestDlg dialog
CCommTestDlg::CCommTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCommTestDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCommTestDlg)
m_display = _T("");
m_input = _T("");
m_hex = FALSE;
m_err_info = _T("");
MeterClass = 0xFF;
m_command = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_TestItem = 0;
}
void CCommTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCommTestDlg)
DDX_Control(pDX, IDC_EDIT_INPUT, m_hex_edit);
DDX_Text(pDX, IDC_EDIT_DISPLAY, m_display);
DDX_Text(pDX, IDC_EDIT_INPUT, m_input);
DDX_Check(pDX, IDC_CHECK_HEX, m_hex);
DDX_Text(pDX, IDC_EDIT_ERR, m_err_info);
DDX_Text(pDX, IDC_EDIT_IN, m_command);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCommTestDlg, CDialog)
//{{AFX_MSG_MAP(CCommTestDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_SEND, OnButtonSend)
ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)
ON_COMMAND(ID_MENUITEM_645, OnMenuitem645)
ON_COMMAND(ID_MENU_TEST, OnMenuTest)
ON_COMMAND(ID_MENU_COM_SET, OnMenuComSet)
ON_BN_CLICKED(IDC_BUTTON_CLEAR2, OnButtonClear2)
ON_BN_CLICKED(IDC_BUTTON_COM, OnButtonCom)
ON_BN_CLICKED(IDC_CHECK_HEX, OnCheckHex)
ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)
ON_EN_CHANGE(IDC_EDIT_IN, OnChangeEditIn)
ON_BN_CLICKED(IDC_BUTTON_SETTIME, OnButtonSettime)
ON_BN_CLICKED(IDC_BUTTON_SETADDRESS, OnButtonSetaddress)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_USER + 100,UpDateData)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCommTestDlg message handlers
BOOL CCommTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 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
m_ComSet.baud = 2;
m_ComSet.comno = 0;
m_ComSet.dabit = 2;
m_ComSet.parity= 2;
m_ComSet.stbit = 0;
pMyCom = new CMyCom(this);
pMyCom->SetCom( m_ComSet );
pMyCom->Open();
InitThread();
FormatMeterAddr("000000000001",address);
MeterClass = 0;
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CCommTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 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 CCommTestDlg::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 CCommTestDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
BOOL CCommTestDlg::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
CloseThread();
delete pMyCom;
// RunFlag = FALSE;
return CDialog::DestroyWindow();
}
void CCommTestDlg::OnButtonSend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
BYTE Buff[100];
DWORD Len;
CMPGB m_gb;
CMPTran m_zj;
int Item = strtoul(m_input, (CHAR **)NULL, 16);
pMyCom->ProcEventFlags = TRUE;//不啟動自動采集
switch(MeterClass)
{
case 0:
Len = m_gb.FormReadDataFrame(Buff,Item,address);
pMyCom->Write(Buff,Len);
break;
case 1:
Len = m_zj.FormReadDataFrame(Buff,Item,address);
pMyCom->Write(Buff,Len);
break;
}
}
void CCommTestDlg::UpDateData(WPARAM wParam, LPARAM lParam)
{
UpdateData(wParam);
}
void CCommTestDlg::OnButtonClear()
{
// TODO: Add your control notification handler code here
// int i(1,4);
m_display = "";
SendMessage(WM_USER + 100,0,0);
}
void CCommTestDlg::OnMenuitem645()
{
// TODO: Add your command handler code here
CSetGB mSetGB;
if( mSetGB.DoModal( ) == IDOK)
{
if(!FormatMeterAddr(mSetGB.m_address,address))
{
}
MeterClass = mSetGB.MeterClass;
}
}
BOOL CCommTestDlg::FormatMeterAddr(CString lpszAddr,BYTE bt[])
{
CString m_strAddr = lpszAddr;
DWORD adress;
m_strAddr.TrimRight();
m_strAddr.MakeUpper();
char c;
int m_nLength = m_strAddr.GetLength();
//檢查表計地址是否合法
if(m_nLength == 0 || m_nLength >12)
return FALSE;
for(int i = 0;i<m_nLength;i++)
{
c = m_strAddr.GetAt(i);
// if(!((c >= '0' && c <= '9') || c == 'A' || c == 'a' )) ctype_base
if(!isxdigit(c))//strtoul
return FALSE;
}
//對齊
if(m_nLength % 2 != 0)
m_strAddr = "0" + m_strAddr;
m_nLength = m_strAddr.GetLength();
m_nLength = m_nLength / 2;
switch(m_nLength)
{
case 1:
// if(m_strAddr.GetAt(0) == 'd' || m_strAddr.GetAt(0) == 'D')
// {
// bt[1] = 0xAA;
// }
// bt[0] = (m_strAddr.GetAt(0)-'0') * 16 + (m_strAddr.GetAt(1)-'0');
// if(m_strAddr.GetAt(1) == 'd')
// {
// bt[1] = 0xAA;
// }
adress= strtoul(m_strAddr, (CHAR **)NULL, 16);
bt[0] = LOBYTE(LOWORD(adress));
bt[1] = 0xAA;
bt[2] = 0xAA;
bt[3] = 0xAA;
bt[4] = 0xAA;
bt[5] = 0xAA;
break;
case 2:
// bt[0] = (m_strAddr.GetAt(2)-'0')*16 + (m_strAddr.GetAt(3)-'0');
// bt[1] = (m_strAddr.GetAt(0)-'0')*16 + (m_strAddr.GetAt(1)-'0');
adress= strtoul(m_strAddr, (CHAR **)NULL, 16);
bt[0] = LOBYTE(LOWORD(adress));
bt[1] = HIBYTE(LOWORD(adress));
bt[2] = 0xAA;
bt[3] = 0xAA;
bt[4] = 0xAA;
bt[5] = 0xAA;
break;
case 3:
// bt[0] = (m_strAddr.GetAt(4)-'0')*16 + (m_strAddr.GetAt(5)-'0');
// bt[1] = (m_strAddr.GetAt(2)-'0')*16 + (m_strAddr.GetAt(3)-'0');
// bt[2] = (m_strAddr.GetAt(0)-'0')*16 + (m_strAddr.GetAt(1)-'0');
adress= strtoul(m_strAddr, (CHAR **)NULL, 16);
bt[0] = LOBYTE(LOWORD(adress));
bt[1] = HIBYTE(LOWORD(adress));
bt[2] = LOBYTE(HIWORD(adress));
bt[3] = 0xAA;
bt[4] = 0xAA;
bt[5] = 0xAA;
break;
case 4:
// bt[0] = (m_strAddr.GetAt(6)-'0')*16 + (m_strAddr.GetAt(7)-'0');
// bt[1] = (m_strAddr.GetAt(4)-'0')*16 + (m_strAddr.GetAt(5)-'0');
// bt[2] = (m_strAddr.GetAt(2)-'0')*16 + (m_strAddr.GetAt(3)-'0');
// bt[3] = (m_strAddr.GetAt(0)-'0')*16 + (m_strAddr.GetAt(1)-'0');
adress= strtoul(m_strAddr, (CHAR **)NULL, 16);
bt[0] = LOBYTE(LOWORD(adress));
bt[1] = HIBYTE(LOWORD(adress));
bt[2] = LOBYTE(HIWORD(adress));
bt[3] = HIBYTE(HIWORD(adress));
bt[4] = 0xAA;
bt[5] = 0xAA;
break;
case 5:
// bt[0] = (m_strAddr.GetAt(8)-'0') * 16 + (m_strAddr.GetAt(9)-'0');
// bt[1] = (m_strAddr.GetAt(6)-'0') * 16 + (m_strAddr.GetAt(7)-'0');
// bt[2] = (m_strAddr.GetAt(4)-'0') * 16 + (m_strAddr.GetAt(5)-'0');
// bt[3] = (m_strAddr.GetAt(2)-'0') * 16 + (m_strAddr.GetAt(3)-'0');
// bt[4] = (m_strAddr.GetAt(0)-'0') * 16 + (m_strAddr.GetAt(1)-'0');
bt[5] = 0xAA;
adress= strtoul(m_strAddr.Right(8), (CHAR **)NULL, 16);
bt[0] = LOBYTE(LOWORD(adress));
bt[1] = HIBYTE(LOWORD(adress));
bt[2] = LOBYTE(HIWORD(adress));
bt[3] = HIBYTE(HIWORD(adress));
adress= strtoul(m_strAddr.Left(2), (CHAR **)NULL, 16);
bt[4] = LOBYTE(LOWORD(adress));//(m_strAddr.GetAt(0)-'0') * 16 + (m_strAddr.GetAt(1)-'0');
bt[5] = 0xAA;
adress = 0;
break;
case 6:
// bt[0] = (m_strAddr.GetAt(10)-'0')*16 + (m_strAddr.GetAt(11)-'0');
// bt[1] = (m_strAddr.GetAt(8)-'0')*16 + (m_strAddr.GetAt(9)-'0');
// bt[2] = (m_strAddr.GetAt(6)-'0')*16 + (m_strAddr.GetAt(7)-'0');
// bt[3] = (m_strAddr.GetAt(4)-'0')*16 + (m_strAddr.GetAt(5)-'0');
// bt[4] = (m_strAddr.GetAt(2)-'0')*16 + (m_strAddr.GetAt(3)-'0');
// bt[5] = (m_strAddr.GetAt(0)-'0')*16 + (m_strAddr.GetAt(1)-'0');
adress= strtoul(m_strAddr.Right(8), (CHAR **)NULL, 16);
bt[0] = LOBYTE(LOWORD(adress));
bt[1] = HIBYTE(LOWORD(adress));
bt[2] = LOBYTE(HIWORD(adress));
bt[3] = HIBYTE(HIWORD(adress));
adress= strtoul(m_strAddr.Left(4), (CHAR **)NULL, 16);
bt[4] = LOBYTE(LOWORD(adress));//(m_strAddr.GetAt(0)-'0') * 16 + (m_strAddr.GetAt(1)-'0');
bt[5] = HIBYTE(LOWORD(adress));
adress = 0;
break;
default:
break;
}
return TRUE;
}
void CCommTestDlg::OnMenuTest()
{
// TODO: Add your command handler code here
m_TestItem = 1;
}
BOOL CCommTestDlg::Execute()
{
while(RunFlag)
{
switch( m_TestItem )
{
case 1:
TestMeterItem();
break;
default:
Sleep(100);
break;
}
};
return TRUE;
}
BOOL CCommTestDlg::InitThread()
{
RunFlag = TRUE;
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ProcThread,(LPVOID)this,0,&TimeOut_id);
return TRUE;
}
BOOL CCommTestDlg::CloseThread()
{
DWORD ExitCode = 1;
if(hThread)
{
RunFlag = FALSE;
if(::WaitForSingleObject(hThread,500)==WAIT_TIMEOUT)
{
::TerminateThread(hThread,ExitCode);
}
CloseHandle(hThread);
hThread = NULL;
}
return TRUE;
}
void CCommTestDlg::TestMeterItem()
{
CMPGBTest gb;
CMPGB m_gb;
CMPTran m_zj;
int i = 0;
int count;
BYTE Buff[100];
DWORD Len;
CString mm;
pMyCom->ProcEventFlags = FALSE;//不啟動自動采集
switch(MeterClass)
{
case 0:
count= gb.TestItem(i);;
for(i = 0; count ; i++)
{
if(pMyCom->ProcEventFlags)break;
Len = m_gb.FormReadDataFrame(Buff, count,address);
pMyCom->Write(Buff,Len);
Sleep(300);
if(!pMyCom->OnReceive())
{
mm.Format("\r\nERR %04x",count);
m_err_info += mm;
SendMessage(WM_USER + 100,0,0);
}
count = gb.TestItem(i);
}
break;
case 1:
for(i = 0; i < 256; i++)
{
address[0] = i;
Len = m_zj.FormReadDataFrame(Buff,0x9010,address);
pMyCom->Write(Buff,Len);
Sleep(500);
if(pMyCom->OnReceive())
{
break;
}
}
break;
}
m_TestItem = 0;
}
void CCommTestDlg::OnMenuComSet()
{
// TODO: Add your command handler code here
CComParaSet m_ComDlg;
if( m_ComDlg.DoModal( ) == IDOK)
{
}
}
void CCommTestDlg::OnButtonClear2()
{
// TODO: Add your control notification handler code here
m_err_info = "";
SendMessage(WM_USER + 100,0,0);
}
void CCommTestDlg::OnButtonCom()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
BYTE m_buff[256] = {0};
DWORD Len;
if(!HexCString( m_buff, Len, m_command))
return;
pMyCom->ProcEventFlags = TRUE;
pMyCom->Write(m_buff,Len);
// Sleep(500);
// pMyCom->OnReceive();
}
BOOL CCommTestDlg::HexCString(BYTE *buf,DWORD &Len,CString m_String)
{
switch(m_String.GetLength() % 3)
{
case 0:
break;
case 1:
m_String +="0 ";
break;
case 2:
m_String +=" ";
break;
}
for(Len = 0; (int)Len < (m_String.GetLength() + 1) / 3 ; Len++)
{
if( (!isxdigit(m_String.GetAt(Len * 3))) || (!isxdigit(m_String.GetAt(Len * 3 + 1))) || m_String.GetAt(Len * 3 + 2) != ' ')
{
return FALSE;
}
buf[Len] = LOBYTE(strtoul(m_String.Mid(Len * 3, 3), (CHAR **)NULL, 16));
}
return TRUE;
}
void CCommTestDlg::OnCheckHex()
{
// TODO: Add your control notification handler code here
SendMessage(WM_USER + 100,1,1);
}
void CCommTestDlg::OnButtonStop()
{
// TODO: Add your control notification handler code here
pMyCom->ProcEventFlags = TRUE;
// CloseThread();
}
void CCommTestDlg::OnChangeEditIn()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
SendMessage(WM_USER + 100,1,1);
}
void CCommTestDlg::OnButtonSettime()
{
// TODO: Add your control notification handler code here
BYTE Buff[100];//_strdup
DWORD Len;
CMPGB m_gb;
int Item = strtoul(m_input, (CHAR **)NULL, 16);
pMyCom->ProcEventFlags = TRUE;//不啟動自動采集
switch(MeterClass)
{
case 0:
Len = m_gb.FormCheckClock(Buff,NULL,address);//,address
pMyCom->Write(Buff,Len);
break;
case 1:
break;
}
}
void CCommTestDlg::OnButtonSetaddress()
{
// TODO: Add your control notification handler code here
BYTE Buff[100];
DWORD Len;
CMPGB m_gb;
CMPTran m_zj;
int Item = strtoul(m_input, (CHAR **)NULL, 16);
pMyCom->ProcEventFlags = TRUE;//不啟動自動采集
switch(MeterClass)
{
case 0:
Len = m_gb.FormSetAddress(Buff,address);//,address
//FormSetAddress(BYTE *buff, BYTE *addr)
pMyCom->Write(Buff,Len);
break;
case 1:
Len = m_zj.FormSetAddress(Buff,address);//,address
pMyCom->Write(Buff,Len);
break;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -