📄 comportrdlg.cpp
字号:
// ComPortRDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ComPortR.h"
#include "ComPortRDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CComPortRDlg dialog
CComPortRDlg::CComPortRDlg(CWnd* pParent /*=NULL*/)
: CDialog(CComPortRDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CComPortRDlg)
// 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 CComPortRDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CComPortRDlg)
DDX_Control(pDX, IDC_ALARMDISPLAY, m_AlarmDisplay);
DDX_Control(pDX, IDC_LIST1, m_List);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CComPortRDlg, CDialog)
//{{AFX_MSG_MAP(CComPortRDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_READDATA, OnReaddata)
ON_BN_CLICKED(IDC_IDC_READALARMDATA, OnIdcReadalarmdata)
ON_BN_CLICKED(IDC_OPENCOM, OnOpencom)
ON_BN_CLICKED(IDC_READPORTINF, OnReadportinf)
ON_BN_CLICKED(IDC_STARTALARM, OnStartalarm)
ON_WM_TIMER()
ON_EN_CHANGE(IDC_ALARMDISPLAY, OnChangeAlarmdisplay)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CComPortRDlg message handlers
BOOL CComPortRDlg::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
ComCounter = 0;
SmCounter = 0;
//串口实例化
DWORD style=WS_VISIBLE|WS_CHILD;
if (!m_myCom1.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))
{
AfxMessageBox("创建MSComm控件失败!");
}
if (!m_myCom2.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))
{
AfxMessageBox("创建MSComm控件失败!");
}
if (!m_myCom3.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))
{
AfxMessageBox("创建MSComm控件失败!");
}
if (!m_myCom4.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))
{
AfxMessageBox("创建MSComm控件失败!");
}
if (!m_myCom5.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))
{
AfxMessageBox("创建MSComm控件失败!");
}
if (!m_myCom6.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))
{
AfxMessageBox("创建MSComm控件失败!");
}
if (!m_myCom7.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))
{
AfxMessageBox("创建MSComm控件失败!");
}
if (!m_myCom8.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))
{
AfxMessageBox("创建MSComm控件失败!");
}
//报警对话框初始化
m_List.SetExtendedStyle(LVS_REPORT|LVS_EX_FULLROWSELECT|LVS_OWNERDRAWFIXED |LVS_EX_FLATSB|LVS_SHOWSELALWAYS|LVS_EX_HEADERDRAGDROP);
m_List.InsertColumn(50,"端口ID");
m_List.SetColumnWidth(0,100);
m_List.InsertColumn(100,"端口类型");
m_List.SetColumnWidth(1,100);
m_List.InsertColumn(50,"通信格式");
m_List.SetColumnWidth(2,100);
m_List.InsertColumn(50,"端口地址");
m_List.SetColumnWidth(3,100);
m_List.InsertColumn(50,"");
m_List.SetColumnWidth(4,100);
m_List.InsertColumn(50,"");
m_List.SetColumnWidth(5,100);
m_List.InsertColumn(50,"");
m_List.SetColumnWidth(6,100);
m_List.InsertColumn(50,"");
m_List.SetColumnWidth(7,100);
m_List.InsertColumn(50,"");
m_List.SetColumnWidth(8,100);
m_List.InsertColumn(50,"");
m_List.SetColumnWidth(9,100);
//读取串口配置信息
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 CComPortRDlg::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 CComPortRDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
BOOL CComPortRDlg::OpenComPort(_RecordsetPtr &recPtr, CString &strSQL)
{
CComPortRApp* pApp=(CComPortRApp*)AfxGetApp();
//
m_pComPort.CreateInstance(__uuidof(Recordset));
//在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
//因为它有时会经常出现一些想不到的错误
try
{
//从数据库中打开表
recPtr->Open(strSQL.AllocSysString(),
pApp->ConnConfigDB.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch (_com_error e)
{
CString strError;
strError.Format("警告:打开数据表时发生异常。 错误信息: %s", e.ErrorMessage());
AfxMessageBox(strError);
return FALSE;
}
return TRUE;
}
void CComPortRDlg::OnReaddata()
{
// TODO: Add your control notification handler code here
int j=0,k=0;
CString strSQL="select * from PortConfigTable";
if(!OpenComPort(m_pComPort,strSQL))
AfxMessageBox("端口配置表打开失败:(");
else m_pComPort->MoveFirst();
while(!m_pComPort->adoEOF)
{
ComPortInfN[j].PortID = (long)m_pComPort->GetCollect("PortId");
ComPortInfN[j].PortType = (long)m_pComPort->GetCollect("PortType");
ComPortInfN[j].PortCommFormat = (long)m_pComPort->GetCollect("PortCommFormat");
ComPortInfN[j].PortAddress = (long)m_pComPort->GetCollect("PortAddress");
if(ComPortInfN[j].PortAddress < 8)
{
int iTemp,m_nColumn;
CString strTemp;
m_nColumn = m_List.GetItemCount();
iTemp = m_nColumn+1;
strTemp.Format("%d", ComPortInfN[j].PortID);
m_List.InsertItem(m_nColumn,strTemp);
strTemp.Format("%d", ComPortInfN[j].PortType);
m_List.SetItemText(m_nColumn, 1, strTemp);
strTemp.Format("%d", ComPortInfN[j].PortCommFormat);
m_List.SetItemText(m_nColumn, 2, strTemp);
switch(ComPortInfN[j].PortCommFormat) {
case 1:
{
myComConfig[j].PortCommFormat = "19200,N,8,1";
break;
}
case 2:
{
myComConfig[j].PortCommFormat = "4800,N,8,2";
break;
}
case 3:
{
myComConfig[j].PortCommFormat = "4800,N,8,1";
break;
}
case 4:
{
myComConfig[j].PortCommFormat = "2400,N,8,1";
break;
}
case 5:
{
myComConfig[j].PortCommFormat = "1200,N,8,1";
break;
}
case 6:
{
myComConfig[j].PortCommFormat = "9600,N,8,1";
break;
}
case 7:
{
myComConfig[j].PortCommFormat = "9600,E,8,1";
break;
}
case 8:
{
myComConfig[j].PortCommFormat = "4800,E,8,1";
break;
}
case 9:
{
myComConfig[j].PortCommFormat = "2400,O,8,1";
break;
}
default:
;
}
strTemp.Format("%d", ComPortInfN[j].PortAddress);
m_List.SetItemText(m_nColumn, 3, strTemp);
switch(ComPortInfN[j].PortAddress) {
case 1:
{
myComConfig[j].PortAddress = 1;
break;
}
case 2:
{
myComConfig[j].PortAddress = 2;
break;
}
case 3:
{
myComConfig[j].PortAddress = 3;
break;
}
case 4:
{
myComConfig[j].PortAddress = 4;
break;
}
case 5:
{
myComConfig[j].PortAddress = 5;
break;
}
case 6:
{
myComConfig[j].PortAddress = 6;
break;
}
case 7:
{
myComConfig[j].PortAddress = 7;
break;
}
case 8:
{
myComConfig[j].PortAddress = 8;
break;
}
default:
;
}
k++;
}
m_pComPort->MoveNext();
j++;
}
ComCounter = k;
}
void CComPortRDlg::OnIdcReadalarmdata()
{
// TODO: Add your control notification handler code here
int j=0, k=0, nColumn=0, SmNumber=0;
nColumn = m_List.GetItemCount();
m_List.InsertItem(nColumn,"ScCode");
m_List.SetItemText(nColumn, 1, "SsCode");
m_List.SetItemText(nColumn, 2, "SuCode");
m_List.SetItemText(nColumn, 3, "SmId");
m_List.SetItemText(nColumn, 4, "TimeOut");
m_List.SetItemText(nColumn, 5, "SmType");
m_List.SetItemText(nColumn, 6, "Protocol");
m_List.SetItemText(nColumn, 7, "Address");
m_List.SetItemText(nColumn, 8, "PolligTime");
m_List.SetItemText(nColumn, 9, "PortId");
CString strSQL="select * from SmConfigTable where (SmType = 1) and (SuCode = 3)";
if(!OpenComPort(m_pComPort,strSQL))
AfxMessageBox("端口配置表打开失败:(");
else
{
try{m_pComPort->MoveFirst();} //m_pComPort->MoveFirst();
catch (_com_error e)
{
CString strError;
strError.Format("端口配置表为空,请检查!错误信息: %s", e.ErrorMessage());
AfxMessageBox(strError);
//return FALSE;
}
}
while(!m_pComPort->adoEOF)
{
SmNumber++;
mySmSetInf[j].ScCode = (long)m_pComPort->GetCollect("ScCode");
mySmSetInf[j].SsCode = (long)m_pComPort->GetCollect("SsCode");
mySmSetInf[j].SuCode = (long)m_pComPort->GetCollect("SuCode");
mySmSetInf[j].SmId = (long)m_pComPort->GetCollect("SmId");
mySmSetInf[j].TimeOut = (long)m_pComPort->GetCollect("TimeOut");
mySmSetInf[j].SmType = (long)m_pComPort->GetCollect("SmType");
mySmSetInf[j].Protocol = (long)m_pComPort->GetCollect("Protocol");
mySmSetInf[j].Address = (long)m_pComPort->GetCollect("Address");
mySmSetInf[j].PollingTime = (long)m_pComPort->GetCollect("PollingTime");
mySmSetInf[j].PortId = (long)m_pComPort->GetCollect("PortId");
int iTemp,m_nColumn;
CString strTemp;
m_nColumn = m_List.GetItemCount();
iTemp = m_nColumn+1;
strTemp.Format("%d", mySmSetInf[j].ScCode);
m_List.InsertItem(m_nColumn,strTemp);
strTemp.Format("%d", mySmSetInf[j].SsCode);
m_List.SetItemText(m_nColumn, 1, strTemp);
strTemp.Format("%d", mySmSetInf[j].SuCode);
m_List.SetItemText(m_nColumn, 2, strTemp);
strTemp.Format("%d", mySmSetInf[j].SmId);
m_List.SetItemText(m_nColumn, 3, strTemp);
strTemp.Format("%d", mySmSetInf[j].TimeOut);
m_List.SetItemText(m_nColumn, 4, strTemp);
strTemp.Format("%d", mySmSetInf[j].SmType);
m_List.SetItemText(m_nColumn, 5, strTemp);
strTemp.Format("%d", mySmSetInf[j].Protocol);
m_List.SetItemText(m_nColumn, 6, strTemp);
strTemp.Format("%d", mySmSetInf[j].Address);
m_List.SetItemText(m_nColumn, 7, strTemp);
strTemp.Format("%d", mySmSetInf[j].PollingTime);
m_List.SetItemText(m_nColumn, 8, strTemp);
strTemp.Format("%d", mySmSetInf[j].PortId);
m_List.SetItemText(m_nColumn, 9, strTemp);
m_pComPort->MoveNext();
j++;
// m_pComPort->MoveNext();
}
SmCounter = SmNumber;
}
void CComPortRDlg::OnOpencom()
{
// TODO: Add your control notification handler code here
int j;
CString Temp;
j = ComCounter;
while(j>0)
{
switch(myComConfig[j-1].PortAddress) {
case 1:
m_myCom1.SetCommPort(myComConfig[j-1].PortAddress);
m_myCom1.SetSettings(myComConfig[j-1].PortCommFormat); //通信参数设置
m_myCom1.SetInBufferSize(1024); //指定接收缓冲区大小
m_myCom1.SetInBufferCount(0); //清空接收缓冲区
m_myCom1.SetInputMode(1); //设置数据获取方式
m_myCom1.SetInputLen(0); //设置每次读取长度
m_myCom1.SetRThreshold(1); //设置接收OnComm事件门限值
m_myCom1.SetPortOpen(1); //打开串口
AfxMessageBox("串口1打开成功!");
break;
case 2:
m_myCom2.SetCommPort(myComConfig[j-1].PortAddress);
m_myCom2.SetSettings(myComConfig[j-1].PortCommFormat); //通信参数设置
m_myCom2.SetInBufferSize(1024); //指定接收缓冲区大小
m_myCom2.SetInBufferCount(0); //清空接收缓冲区
m_myCom2.SetInputMode(1); //设置数据获取方式
m_myCom2.SetInputLen(0); //设置每次读取长度
m_myCom2.SetRThreshold(1); //设置接收OnComm事件门限值
m_myCom2.SetPortOpen(1); //打开串口
AfxMessageBox("串口2打开成功!");
break;
case 3:
m_myCom3.SetCommPort(myComConfig[j-1].PortAddress);
m_myCom3.SetSettings(myComConfig[j-1].PortCommFormat); //通信参数设置
m_myCom3.SetInBufferSize(1024); //指定接收缓冲区大小
m_myCom3.SetInBufferCount(0); //清空接收缓冲区
m_myCom3.SetInputMode(1); //设置数据获取方式
m_myCom3.SetInputLen(0); //设置每次读取长度
m_myCom3.SetRThreshold(1); //设置接收OnComm事件门限值
m_myCom3.SetPortOpen(1); //打开串口
AfxMessageBox("串口3打开成功!");
break;
case 4:
m_myCom4.SetCommPort(myComConfig[j-1].PortAddress);
m_myCom4.SetSettings(myComConfig[j-1].PortCommFormat); //通信参数设置
m_myCom4.SetInBufferSize(1024); //指定接收缓冲区大小
m_myCom4.SetInBufferCount(0); //清空接收缓冲区
m_myCom4.SetInputMode(1); //设置数据获取方式
m_myCom4.SetInputLen(0); //设置每次读取长度
m_myCom4.SetRThreshold(1); //设置接收OnComm事件门限值
m_myCom4.SetPortOpen(1); //打开串口
AfxMessageBox("串口4打开成功!");
break;
case 5:
m_myCom5.SetCommPort(myComConfig[j-1].PortAddress);
m_myCom5.SetSettings(myComConfig[j-1].PortCommFormat); //通信参数设置
m_myCom5.SetInBufferSize(1024); //指定接收缓冲区大小
m_myCom5.SetInBufferCount(0); //清空接收缓冲区
m_myCom5.SetInputMode(1); //设置数据获取方式
m_myCom5.SetInputLen(0); //设置每次读取长度
m_myCom5.SetRThreshold(1); //设置接收OnComm事件门限值
m_myCom5.SetPortOpen(1); //打开串口
AfxMessageBox("串口5打开成功!");
break;
case 6:
m_myCom6.SetCommPort(myComConfig[j-1].PortAddress);
m_myCom6.SetSettings(myComConfig[j-1].PortCommFormat); //通信参数设置
m_myCom6.SetInBufferSize(1024); //指定接收缓冲区大小
m_myCom6.SetInBufferCount(0); //清空接收缓冲区
m_myCom6.SetInputMode(1); //设置数据获取方式
m_myCom6.SetInputLen(0); //设置每次读取长度
m_myCom6.SetRThreshold(1); //设置接收OnComm事件门限值
m_myCom6.SetPortOpen(1); //打开串口
AfxMessageBox("串口6打开成功!");
break;
case 7:
m_myCom7.SetCommPort(myComConfig[j-1].PortAddress);
m_myCom7.SetSettings(myComConfig[j-1].PortCommFormat); //通信参数设置
m_myCom7.SetInBufferSize(1024); //指定接收缓冲区大小
m_myCom7.SetInBufferCount(0); //清空接收缓冲区
m_myCom7.SetInputMode(1); //设置数据获取方式
m_myCom7.SetInputLen(0); //设置每次读取长度
m_myCom7.SetRThreshold(1); //设置接收OnComm事件门限值
m_myCom7.SetPortOpen(1); //打开串口
AfxMessageBox("串口7打开成功!");
break;
case 8:
m_myCom8.SetCommPort(myComConfig[j-1].PortAddress);
m_myCom8.SetSettings(myComConfig[j-1].PortCommFormat); //通信参数设置
m_myCom8.SetInBufferSize(1024); //指定接收缓冲区大小
m_myCom8.SetInBufferCount(0); //清空接收缓冲区
m_myCom8.SetInputMode(1); //设置数据获取方式
m_myCom8.SetInputLen(0); //设置每次读取长度
m_myCom8.SetRThreshold(1); //设置接收OnComm事件门限值
m_myCom8.SetPortOpen(1); //打开串口
AfxMessageBox("串口8打开成功!");
break;
default:
;
}
j--;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -