📄 serialcontroldlg.cpp
字号:
// SerialControlDlg.cpp : implementation file
//
#include "stdafx.h"
#include "SerialControl.h"
#include "SerialControlDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//声明全局变量
extern CString g_szPropName;
extern HANDLE g_hValue;
/////////////////////////////////////////////////////////////////////////////
const UINT WM_TASKBARCREATED = ::RegisterWindowMessage(_T("TaskbarCreated"));
/////////////////////////////////////////////////////////////////////////////
// CSerialControlDlg dialog
CSerialControlDlg::CSerialControlDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSerialControlDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSerialControlDlg)
m_Recive_Master = _T("");
m_SendDate_Master = _T("");
m_StatusMaster = _T("");
m_StatusWaiter1 = _T("");
m_StatusWaiter2 = _T("");
m_ReciveWaiter1 = _T("");
m_ReciveWaiter2 = _T("");
m_SendDateWaiter1 = _T("");
m_SendDateWaiter2 = _T("");
m_T_R = -1;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSerialControlDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSerialControlDlg)
DDX_Control(pDX, IDC_CHECKBIT_MASTER3, m_CheckBitWaiter2);
DDX_Control(pDX, IDC_CHECKBIT_MASTER2, m_CheckBitWaiter1);
DDX_Control(pDX, IDC_STOPBIT_MASTER3, m_StopBitWaiter2);
DDX_Control(pDX, IDC_STOPBIT_MASTER2, m_StopBitWaiter1);
DDX_Control(pDX, IDC_MASTER_NAME3, m_Waiter2Name);
DDX_Control(pDX, IDC_MASTER_NAME2, m_Waiter1Name);
DDX_Control(pDX, IDC_DATEBIT_MASTER3, m_DateBitWaiter2);
DDX_Control(pDX, IDC_DATEBIT_MASTER2, m_DateBitWaiter1);
DDX_Control(pDX, IDC_BOUDRATE_MASTER3, m_BoudRateWaiter2);
DDX_Control(pDX, IDC_BOUDRATE_MASTER2, m_BoudRateWaiter1);
DDX_Control(pDX, IDC_STOPBIT_MASTER, m_StopBitMaster);
DDX_Control(pDX, IDC_DATEBIT_MASTER, m_DateBitMaster);
DDX_Control(pDX, IDC_CHECKBIT_MASTER, m_CheckBitMaster);
DDX_Control(pDX, IDC_BOUDRATE_MASTER, m_BoudRateMaster);
DDX_Control(pDX, IDC_MASTER_NAME, m_MasterName);
DDX_Control(pDX, IDC_MSCOMMASTER, m_Master);
DDX_Control(pDX, IDC_MSCOMWAITER1, m_Waiter1);
DDX_Control(pDX, IDC_MSCOMWAITER2, m_Waiter2);
DDX_Text(pDX, IDC_RECIVE_MASTER, m_Recive_Master);
DDX_Text(pDX, IDC_SENDDATE_MASTER, m_SendDate_Master);
DDX_Text(pDX, IDC_EDITSTATUS, m_StatusMaster);
DDX_Text(pDX, IDC_EDITSTATUS2, m_StatusWaiter1);
DDX_Text(pDX, IDC_EDITSTATUS3, m_StatusWaiter2);
DDX_Text(pDX, IDC_RECIVE_MASTER2, m_ReciveWaiter1);
DDX_Text(pDX, IDC_RECIVE_MASTER3, m_ReciveWaiter2);
DDX_Text(pDX, IDC_SENDDATE_MASTER2, m_SendDateWaiter1);
DDX_Text(pDX, IDC_SENDDATE_MASTER3, m_SendDateWaiter2);
DDX_Radio(pDX, IDC_TEST, m_T_R);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSerialControlDlg, CDialog)
//{{AFX_MSG_MAP(CSerialControlDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_OPEN_MASTER, OnOpenMaster)
ON_CBN_EDITCHANGE(IDC_MASTER_NAME, OnEditchangeMasterName)
ON_BN_CLICKED(IDC_CLOSE_MASTER, OnCloseMaster)
ON_BN_CLICKED(IDC_SEND_MASTER, OnSendMaster)
ON_BN_CLICKED(IDC_OPEN_MASTER2, OnOpenMaster2)
ON_BN_CLICKED(IDC_CLOSE_MASTER2, OnCloseMaster2)
ON_BN_CLICKED(IDC_CLOSE_MASTER3, OnCloseMaster3)
ON_BN_CLICKED(IDC_OPEN_MASTER3, OnOpenMaster3)
ON_BN_CLICKED(IDC_SEND_MASTER2, OnSendMaster2)
ON_BN_CLICKED(IDC_SEND_MASTER3, OnSendMaster3)
ON_CBN_SELCHANGE(IDC_MASTER_NAME, OnSelchangeMasterName)
ON_CBN_SELCHANGE(IDC_MASTER_NAME2, OnSelchangeMasterName2)
ON_CBN_SELCHANGE(IDC_MASTER_NAME3, OnSelchangeMasterName3)
ON_WM_SYSCOMMAND()
ON_BN_CLICKED(IDOK, CSerialControlDlg::OnBnClickedOk)
ON_MESSAGE(WM_SHOWTASKICON,OnClickTaskIcon)
ON_REGISTERED_MESSAGE(WM_TASKBARCREATED, OnTaskbarRecreate)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////////////////////////
// CSerialControlDlg message handlers
BOOL CSerialControlDlg::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
//设置窗口属性
SetProp(m_hWnd,g_szPropName,g_hValue);
/////////////////////////////////////////////////////////////////////////////////////////////
m_IsHided=false;
FirstRun=0;
m_NotiIconData.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
m_NotiIconData.hWnd=this->m_hWnd;
m_NotiIconData.uID=IDR_MAINFRAME;
m_NotiIconData.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
m_NotiIconData.uCallbackMessage=WM_SHOWTASKICON;//自定义的消息名称 WM_USER+1000
m_NotiIconData.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(m_NotiIconData.szTip,"串口互连控制程序");//信息提示
////////////////////////////////////////////////////////////////////////////////////////////
m_MasterName.SetCurSel(0);
m_BoudRateMaster.SetCurSel(7);
m_CheckBitMaster.SetCurSel(2);
m_DateBitMaster.SetCurSel(0);
m_StopBitMaster.SetCurSel(0);
m_T_R=TRUE;
m_Master.SetCommPort(1); //选择COM1
m_Master.SetPortOpen(TRUE); //打开串口,以判断串口是否存在
if(m_Master.GetPortOpen()) //如果串口是打开的,则行关闭串口
{
m_Master.SetPortOpen(FALSE);
m_Master.SetInBufferSize(1024); //接收缓冲区
m_Master.SetOutBufferSize(1024);//发送缓冲区
m_Master.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_Master.SetInputMode(1);//以二进制方式读写数据
m_Master.SetRThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
m_Master.SetOutBufferCount(0);
m_Master.SetPortOpen(TRUE);
m_StatusMaster="打开";
MasterActive=TRUE;
m_Master.SetSettings("9600,n,8,1");//波特率9600无检验位,8个数据位,1个停止位
m_Master.GetInput();//先预读缓冲区以清除残留数据
GetDlgItem(IDC_OPEN_MASTER)->EnableWindow(FALSE);
}
else
{
MessageBox("没有COM1串口或串口被占用");
MasterActive=FALSE;
m_StatusMaster="未发现";
GetDlgItem(IDC_OPEN_MASTER)->EnableWindow(FALSE);
GetDlgItem(IDC_CLOSE_MASTER)->EnableWindow(FALSE);
GetDlgItem(IDC_SEND_MASTER)->EnableWindow(FALSE);
}
///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
m_Waiter1Name.SetCurSel(1);
m_BoudRateWaiter1.SetCurSel(7);
m_CheckBitWaiter1.SetCurSel(2);
m_DateBitWaiter1.SetCurSel(0);
m_StopBitWaiter1.SetCurSel(0);
m_Waiter1.SetCommPort(2); //选择COM2
m_Waiter1.SetPortOpen(TRUE);
if(m_Waiter1.GetPortOpen()) //如果串口是打开的,则行关闭串口
{
m_Waiter1.SetPortOpen(FALSE);
m_Waiter1.SetInBufferSize(1024); //接收缓冲区
m_Waiter1.SetOutBufferSize(1024);//发送缓冲区
m_Waiter1.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_Waiter1.SetInputMode(1);//以二进制方式读写数据
m_Waiter1.SetRThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
m_Waiter1.SetSettings("9600,n,8,1");//波特率9600无检验位,8个数据位,1个停止位
m_Waiter1.SetOutBufferCount(0);
m_Waiter1.SetPortOpen(TRUE);
m_StatusWaiter1="打开";
Waiter1Active=TRUE;
GetDlgItem(IDC_OPEN_MASTER2)->EnableWindow(FALSE);
}
else
{
MessageBox("没有COM2串口或串口被占用");
Waiter1Active=FALSE;
m_StatusWaiter1="未发现";
GetDlgItem(IDC_OPEN_MASTER2)->EnableWindow(FALSE);
GetDlgItem(IDC_CLOSE_MASTER2)->EnableWindow(FALSE);
GetDlgItem(IDC_SEND_MASTER2)->EnableWindow(FALSE);
}
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
m_Waiter2Name.SetCurSel(2);
m_BoudRateWaiter2.SetCurSel(7);
m_CheckBitWaiter2.SetCurSel(2);
m_DateBitWaiter2.SetCurSel(0);
m_StopBitWaiter2.SetCurSel(0);
m_Waiter2.SetCommPort(3); //选择COM3
// m_Waiter2.SetPortOpen(TRUE);
if(m_Waiter2.GetPortOpen()) //如果串口是打开的,则行关闭串口
{
m_Waiter2.SetPortOpen(FALSE);
m_Waiter2.SetInBufferSize(1024); //接收缓冲区
m_Waiter2.SetOutBufferSize(1024);//发送缓冲区
m_Waiter2.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_Waiter2.SetInputMode(1);//以二进制方式读写数据
m_Waiter2.SetRThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
m_Waiter2.SetSettings("9600,n,8,1");//波特率9600无检验位,8个数据位,1个停止位
m_Waiter2.SetOutBufferCount(0);
m_Waiter2.SetPortOpen(TRUE);
m_StatusWaiter2="打开";
Waiter2Active=TRUE;
GetDlgItem(IDC_OPEN_MASTER3)->EnableWindow(FALSE);
}
else
{
MessageBox("没有COM3串口或串口被占用");
m_StatusWaiter2="未发现";
Waiter2Active=FALSE;
GetDlgItem(IDC_OPEN_MASTER3)->EnableWindow(TRUE);
GetDlgItem(IDC_CLOSE_MASTER3)->EnableWindow(FALSE);
GetDlgItem(IDC_SEND_MASTER3)->EnableWindow(FALSE);
}
UpdateData(FALSE);
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 CSerialControlDlg::OnPaint()
{
if(FirstRun<2)
{
SendMessage(WM_SYSCOMMAND,SC_MINIMIZE);
FirstRun+=1;
}
else
{
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 CSerialControlDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CSerialControlDlg::OnOpenMaster()
{
// TODO: Add your control notification handler code here
CString error,sh,df,wq,BR;
switch(m_BoudRateMaster.GetCurSel())
{
case 0:
wq="300";
break;
case 1:
wq="600";
break;
case 2:
wq="1200";
break;
case 3:
wq="1800";
break;
case 4:
wq="2400";
break;
case 5:
wq="4800";
break;
case 6:
wq="7200";
break;
case 7:
wq="9600";
break;
case 8:
wq="14400";
break;
case 9:
wq ="19200";
break;
case 10:
wq="38400";
break;
case 11:
wq ="57600";
break;
case 12:
wq ="115200";
break;
default:
break;
}
BR=wq;
BR+=",";
switch(m_CheckBitMaster.GetCurSel())
{
case 0:
wq="E";
break;
case 1:
wq="M";
break;
case 2:
wq="N";
break;
case 3:
wq="O";
break;
case 4:
wq="S";
break;
default:
break;
}
BR+=wq;
BR+=",";
switch(m_DateBitMaster.GetCurSel())
{
case 0:
wq="8";
break;
case 1:
wq="7";
break;
case 2:
wq="6";
break;
case 3:
wq="5";
break;
default:
break;
}
BR+=wq;
BR+=",";
switch(m_StopBitMaster.GetCurSel())
{
case 0:
wq="1";
break;
case 1:
wq="1.5";
break;
case 2:
wq="2";
break;
default:
break;
}
BR+=wq;
int a;
a=m_MasterName.GetCurSel();
m_MasterName.GetLBText(a, wq);
sh="没有";
df="串口或串口被占用";
error=sh + wq + df;
m_Master.SetCommPort(a+1);
m_Master.SetPortOpen(TRUE);
if(m_Master.GetPortOpen()) //如果串口是打开的,则行关闭串口
{
m_Master.SetPortOpen(FALSE);
m_Master.SetInBufferSize(1024); //接收缓冲区
m_Master.SetOutBufferSize(1024); //发送缓冲区
m_Master.SetInputLen(0); //设置当前接收区数据长度为0,表示全部读取
m_Master.SetInputMode(1); //以二进制方式读写数据
m_Master.SetRThreshold(1); //接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
m_Master.SetSettings(BR); //波特率9600无检验位,8个数据位,1个停止位
m_Master.SetOutBufferCount(0);
m_Master.SetPortOpen(TRUE);
m_StatusMaster="打开";
MasterActive=TRUE;
GetDlgItem(IDC_OPEN_MASTER)->EnableWindow(FALSE);
GetDlgItem(IDC_CLOSE_MASTER)->EnableWindow(TRUE);
}
else
MessageBox(error);
UpdateData(FALSE);
}
void CSerialControlDlg::OnEditchangeMasterName()
{
// TODO: Add your control notification handler code here
}
void CSerialControlDlg::OnCloseMaster()
{
// TODO: Add your control notification handler code here
m_Master.SetPortOpen(FALSE);
GetDlgItem(IDC_OPEN_MASTER)->EnableWindow(TRUE);
GetDlgItem(IDC_CLOSE_MASTER)->EnableWindow(FALSE);
m_StatusMaster="关闭";
MasterActive=FALSE;
UpdateData(FALSE);
}
void CSerialControlDlg::OnSendMaster()
{
// TODO: Add your control notification handler code here
if(m_Master.GetPortOpen())
{
UpdateData(TRUE);
m_Master.SetOutput(COleVariant(m_SendDate_Master));//发送数据
}
}
BEGIN_EVENTSINK_MAP(CSerialControlDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CSerialControlDlg)
ON_EVENT(CSerialControlDlg, IDC_MSCOMMASTER, 1 /* OnComm */, OnOnCommMscommaster, VTS_NONE)
ON_EVENT(CSerialControlDlg, IDC_MSCOMWAITER1, 1 /* OnComm */, OnOnCommMscomwaiter1, VTS_NONE)
ON_EVENT(CSerialControlDlg, IDC_MSCOMWAITER2, 1 /* OnComm */, OnOnCommMscomwaiter2, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CSerialControlDlg::OnOnCommMscommaster()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_Master.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_Master.GetInput(); //读缓冲区
if(!m_T_R)
{
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_Recive_Master+=strtemp; //加入接收编辑框对应字符串
}
UpdateData(FALSE);
}
}
//更新编辑框内容
if(m_Waiter1.GetPortOpen())
{
m_Waiter1.SetOutput(variant_inp);
}
if(m_Waiter2.GetPortOpen())
{
m_Waiter2.SetOutput(variant_inp);
}
}
void CSerialControlDlg::OnOpenMaster2()
{
// TODO: Add your control notification handler code here
CString error,sh,df,wq,BR;
switch(m_BoudRateMaster.GetCurSel())
{
case 0:
wq="300";
break;
case 1:
wq="600";
break;
case 2:
wq="1200";
break;
case 3:
wq="1800";
break;
case 4:
wq="2400";
break;
case 5:
wq="4800";
break;
case 6:
wq="7200";
break;
case 7:
wq="9600";
break;
case 8:
wq="14400";
break;
case 9:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -