⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serialcontroldlg.cpp

📁 该代码是我在做课程设计时编写的一个串口调试的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -