📄 serialtestdlg.cpp
字号:
// SerialTestDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "MDF.h"
//#include "SerialTest.h"
#include "SerialTestDlg.h"
#include "SerialPort.h"
#include <shlwapi.h>
#include "comdef.h"
#include ".\serialtestdlg.h"
//#include "protocolfun.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CSerialTestDlg 对话框
CSerialTestDlg::CSerialTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSerialTestDlg::IDD, pParent)
, sockServer(NULL)
, m_rate(_T(""))
, m_curModel(0)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSerialTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LSTINFO, m_listInfo);
DDX_Control(pDX, IDC_LISTTABLE, m_listCarrent);
DDX_Text(pDX, IDC_EDTRATE, m_rate);
DDX_Control(pDX, IDC_CHKAUTO, m_chkAutoSend);
DDX_Control(pDX, IDC_TABALARM, m_tabAlarm);
DDX_Control(pDX, IDC_EDTINFO, m_SendInfo);
DDX_Control(pDX, IDC_LISTALARM, m_listAlarm);
DDX_Control(pDX, IDC_CMBCOM, m_listCom);
DDX_Control(pDX, IDC_EDTSETNUM, m_ConfigNum);
DDX_Control(pDX, IDC_CHKCONFIG, m_Config);
DDX_Control(pDX, IDC_CHKHEX, m_hex);
DDX_Control(pDX, IDC_CHKSOURCE, m_source);
}
BEGIN_MESSAGE_MAP(CSerialTestDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BTNOPEN, OnBnClickedBtnopen)
ON_WM_CHAR()
ON_MESSAGE(WM_COMM_RXCHAR,onCOMM_RXCHAR)
ON_MESSAGE(WM_SOCK_RXSTRING,onSockReadString)
ON_BN_CLICKED(IDC_BTNCLOSE, OnBnClickedBtnclose)
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BTNSEND, OnBnClickedBtnsend)
ON_BN_CLICKED(IDC_BTNSOCK, OnBnClickedBtnsock)
ON_BN_CLICKED(IDC_BTNTEST, OnBnClickedBtntest)
ON_BN_CLICKED(IDOK, OnBnClickedOk)
ON_WM_CLOSE()
ON_WM_DESTROY()
ON_WM_TIMER()
ON_BN_CLICKED(IDC_CHKSHOW, OnBnClickedChkshow)
ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
ON_LBN_SELCHANGE(IDC_LSTINFO, OnLbnSelchangeLstinfo)
ON_LBN_DBLCLK(IDC_LSTINFO, OnLbnDblclkLstinfo)
ON_EN_CHANGE(IDC_EDTPORTSERVER, OnEnChangeEdtportserver)
ON_BN_CLICKED(IDC_BTNCLEAR, OnBnClickedBtnclear)
//ON_BN_CLICKED(IDC_CHECK1, OnBnClickedCheck1)
ON_BN_CLICKED(IDC_CHKAUTO, OnBnClickedChkauto)
ON_EN_CHANGE(IDC_EDTRATE, OnEnChangeEdtrate)
ON_NOTIFY(TCN_SELCHANGE, IDC_TABALARM, OnTcnSelchangeTabalarm)
ON_BN_CLICKED(IDC_CHKCONFIG, OnBnClickedChkconfig)
ON_NOTIFY(NM_DBLCLK, IDC_LISTTABLE, OnNMDblclkListtable)
ON_BN_CLICKED(IDC_BTNSET, OnBnClickedBtnset)
ON_NOTIFY(NM_RCLICK, IDC_LISTTABLE, OnNMRclickListtable)
ON_NOTIFY(NM_DBLCLK, IDC_LISTALARM, OnNMDblclkListalarm)
ON_EN_CHANGE(IDC_EDTPORT, OnEnChangeEdtport)
ON_EN_CHANGE(IDC_EDTIP, OnEnChangeEdtip)
END_MESSAGE_MAP()
// CSerialTestDlg 消息处理程序
BOOL CSerialTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
//SetDlgItemText(IDC_EDTIP,"192.168.1.5");
//SetDlgItemText(IDC_EDTPORTSERVER,"9001");
//SetDlgItemText(IDC_EDTPORT,"9002");
SetDlgItemText(IDC_EDTRATE,"1000");
blTimerOpen = FALSE;
SetDlgItemText(IDC_STARECEIVE,"接收:0");
SetDlgItemText(IDC_STASEND,"发送: 接收: ");
m_ConfigNum.SetWindowText("180");
m_btArray.RemoveAll();
m_curModel = 0;
/*************************************/
//IniDB();
m_ConPtr = theApp.m_pAdoDB->m_ConPtr;
/*************************************/
IniControl();
LoadItem();
m_CirStatus = new CCircleStatus;
m_CirStatus->iCarrent = 0;
m_CirStatus->iLevel = 0;
m_CirStatus->iRate = 0;
m_CirStatus->srCarrent = 0;
m_CirStatus->srRate = 0;
m_CirStatus->tmStartTime = CTime::GetCurrentTime();
m_CirStatus->tmEndTime = CTime::GetCurrentTime();
m_CirStatus->dwSeconds = 0;
//装载样本表
IniSampleTable();
blOpen = FALSE;
blMonitor = FALSE;
m_inCount = m_outCount = 0;
iInterval = 500;
iCount = 0;
arrCarrent[0] = 1;
arrCarrent[1] =0;
arrCarrent[2] =0;
arrCarrent[3] =0;
arrCarrent[0] = 1 ;
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CSerialTestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
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;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CSerialTestDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CSerialTestDlg::OnBnClickedBtnopen()
{
// TODO: 在此添加控件通知处理程序代码
//串口打开程序
DWORD dwCommEvents =0;
dwCommEvents |= EV_BREAK;
dwCommEvents |= EV_CTS;
dwCommEvents |= EV_DSR;
dwCommEvents |= EV_ERR;
dwCommEvents |= EV_RING;
dwCommEvents |= EV_RLSD;
dwCommEvents |= EV_RXCHAR;
dwCommEvents |= EV_RXFLAG;
dwCommEvents |= EV_TXEMPTY;
BOOL bResult = FALSE;
CString strCom;
int iPort ;
if (blOpen)
{
m_Port.ClosePort();
((CWnd *)GetDlgItem(IDC_BTNOPEN))->SetWindowText("Open");
blOpen = FALSE;
}
else
{
m_listCom.GetWindowText(strCom);
if (strCom.GetLength() >0 )
{
strCom.Replace("COM","");
iPort = atoi(strCom.GetBuffer());
}
if (iPort < 0 || iPort> 12)
iPort = 1;
//assert(iPort>0 && iPort<= 12);
bResult = m_Port.InitPort(this,iPort,9600,'N',8,1,dwCommEvents,1024);
if (!bResult)
{
((CWnd *)GetDlgItem(IDC_BTNOPEN))->SetWindowText("Open");
blOpen = FALSE;
AfxMessageBox("串口被占用或不存在...");
return ;
}else
{
blOpen = TRUE;
((CWnd *)GetDlgItem(IDC_BTNOPEN))->SetWindowText("Close");
}
}
}
void CSerialTestDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDialog::OnChar(nChar, nRepCnt, nFlags);
}
LRESULT CSerialTestDlg::onCOMM_RXCHAR(WPARAM wParam, LPARAM lParam)
{
CString sBuf,sTemp;
int iLen;
char *pt;
char cbuf[MAX_SIZE];
sMsgBody *msgBody;
//CProtocolfun pfun;
msgBody = (sMsgBody *)wParam;
iLen = msgBody->iLen;
pt = new char[msgBody->iLen + 1];
memcpy(pt,msgBody->lpBuf ,msgBody->iLen);
pt[msgBody->iLen] = '\0';
CListBox *m_ListBox = (CListBox *)GetDlgItem(IDC_LSTINFO);
if (m_source.GetCheck() == BST_CHECKED)
{
if (m_hex.GetCheck()== BST_CHECKED)
sBuf = ToHexString(pt,iLen);
else
{
memcpy(cbuf,pt,iLen);
cbuf[iLen] = '\0';
sBuf = cbuf;
}
m_listInfo.AddString(sBuf);
}
m_inCount++ ;
CString strTip;
strTip.Format("发送:%d 接收:%d",m_outCount,m_inCount);
((CWnd *)GetDlgItem(IDC_STASEND))->SetWindowText(strTip);
DataAnalyse(pt,iLen);
return 0;
}
void CSerialTestDlg::OnBnClickedBtnclose()
{
// TODO: 在此添加控件通知处理程序代码
//sockServer->StopMonitoring();
BOOL bResult;
if (blMonitor)
{
bResult = m_Port.CloseMonitoring();
if (bResult)
{
((CWnd *)GetDlgItem(IDC_BTNCLOSE))->SetWindowText("Start");
blMonitor = FALSE;
}else
{
((CWnd *)GetDlgItem(IDC_BTNCLOSE))->SetWindowText("Stop");
blMonitor = TRUE;
}
}else
{
bResult = m_Port.StartMonitoring();
if (bResult)
{
((CWnd *)GetDlgItem(IDC_BTNCLOSE))->SetWindowText("Stop");
blMonitor = TRUE;
}else
{
((CWnd *)GetDlgItem(IDC_BTNCLOSE))->SetWindowText("Open");
blMonitor = FALSE;
}
}
//m_Port.ClosePort();
}
void CSerialTestDlg::OnBnClickedBtnsend()
{
// TODO: 在此添加控件通知处理程序代码
//串口测试程序民
char *btBuf;
CByteArray btSend;
CString sBuf;
//GetDlgItemText(IDC_EDTINFO,sBuf);
m_SendInfo.GetWindowText(sBuf);
int iLen = sBuf.GetLength() * sizeof(TCHAR);
btBuf = new char[iLen];
btBuf = (char *)sBuf.GetBuffer();
m_inCount++;
m_outCount++;
m_Port.AskCom(btBuf,iLen);
//m_Port.Write(sBuf);
//m_Port.WriteToPort((BYTE * )btBuf,iLen);
//m_Port.WriteToPort(btSend.GetData(),(int)btSend.GetSize());
}
void CSerialTestDlg::OnBnClickedBtnsock()
{
//blStop = !blStop;
CString m_MonitorPort;
GetDlgItemText(IDC_EDTPORTSERVER,m_MonitorPort);
int iport = atoi((char*)m_MonitorPort.GetBuffer());
sockServer = new CSocketComm();
sockServer->SetMessageWindow(this);
sockServer->StartMonitoring(iport);
// TODO: 在此添加控件通知处理程序代码
}
void CSerialTestDlg::OnBnClickedBtntest()
{
// TODO: 在此添加控件通知处理程序代码
//回复信息给所有接收过的地址
CString sBuf;
GetDlgItemText(IDC_EDTINFO,sBuf);
char *cBuf = (char*)sBuf.GetBuffer();
//sockServer->SendInfo(sBuf);
}
// Socket接收消息
LRESULT CSerialTestDlg::onSockReadString(WPARAM wParam, LPARAM lParam)
{
CString sBuf;
sMsgBody *msgBody;
//msgBody = new sMsgBody();
msgBody = (sMsgBody *)wParam;
CListBox *m_ListBox = (CListBox *)GetDlgItem(IDC_LSTINFO);
sBuf = CString(msgBody->lpBuf,msgBody->iLen);
//是否显示接收到的资料
if (((CButton*)GetDlgItem(IDC_CHKSHOW))->GetCheck() == BST_CHECKED)
m_ListBox->AddString("From:" + msgBody->sIP + " " + sBuf);
sBuf += "00";
sockServer->SendTo(sBuf,msgBody->sIP,9001);
Writelog(" From:" + msgBody->sIP + " " + sBuf);
sBuf.Format("接收数量:%d",m_ListBox->GetCount());
SetDlgItemText(IDC_STARECEIVE,sBuf);
//m_listInfo.AddString(sBuf.GetBuffer());
//Writelog(sBuf);
return LRESULT();
}
void CSerialTestDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
OnOK();
}
int CSerialTestDlg::Writelog(CString strSource)
{
//CFile fWrite;
CString strPath ,strTime,strTemp,m_strPath;
char cPath[255];
BOOL fOpen;
strTime = CTime::GetCurrentTime().Format ( "%Y-%m-%d %H:%M:%S" ) ; //获取当前时间
strTemp = "<" + strTime + "> "+ strSource + "\r\n";
if (fileLog.m_hFile == CFile::hFileNull)
{
GetCurrentDirectory(255,cPath);
m_strPath.Format("%s",cPath);
strPath = m_strPath + "\\log.txt";
BOOL fl = PathFileExists((LPCTSTR)strPath);
if (fl == TRUE)
fOpen = fileLog.Open(strPath,CFile::modeWrite);
else
{
strPath.Format("%s%slog.txt",m_strPath,"\\") ;
fOpen = fileLog.Open(strPath,CFile::modeCreate | CFile::modeReadWrite);
}
if(!fOpen)
return FALSE ;
}
fileLog.SeekToEnd() ;
fileLog.Write(strTemp.GetBuffer(0),strTemp.GetLength()) ;
return 0;
}
void CSerialTestDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDialog::OnClose();
}
void CSerialTestDlg::OnDestroy()
{
if (fileLog != CFile::hFileNull)
fileLog.Close();
CDialog::OnDestroy();
// TODO: 在此处添加消息处理程序代码
}
void CSerialTestDlg::OnTimer(UINT nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//CString sBuf;
//GetDlgItemText(IDC_EDTINFO,sBuf);
//sBuf = "gadfgsdjwrsfhfghdgfasdfasdf";
//char *cBuf = (char*)sBuf.GetBuffer();
//sockServer->SendTo(cBuf,sBuf.GetLength(),m_IP,m_PortNum);
//sBuf.Format("发送数量:%d",sockServer->m_SendCount);
//SetDlgItemText(IDC_STASEND,sBuf);
//Writelog( " To:" + m_IP + " " + sBuf);
CString strTip;
strTip.Format("发送:%d 接收:%d",m_outCount,m_inCount);
((CWnd *)GetDlgItem(IDC_STASEND))->SetWindowText(strTip);
UpdateWindow();
AskData();
CDialog::OnTimer(nIDEvent);
}
void CSerialTestDlg::OnBnClickedChkshow()
{
// TODO: 在此添加控件通知处理程序代码
}
void CSerialTestDlg::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
bAsking = FALSE;
OnCancel();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -