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

📄 common_serialdlg.cpp

📁 同时可以打开两个串口的程序。可以进行收发试验。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// ComMonDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ComMon_SERIAL.h"
#include "ComMon_SERIALDlg.h"
#include "SerialPort.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define CLOCK1		1
#define CLOCK2		2

static LONG HexToChar(void* pVoidOut, int nInSize, void* pVoidIn)
{
	LPCTSTR lpszIn = (LPTSTR)pVoidIn;
	if(!pVoidIn)
		return 0L;
	if(!pVoidOut)
		return -1L;

	CString strOut;
	strOut.Format("%02x", lpszIn);
	strcpy((LPTSTR)pVoidOut, (LPCTSTR)strOut);
	return strOut.GetLength();
}

static LONG CharToHex(void* pVoidOut, int nInSize, void* pVoidIn, BOOL bTrimSpace)
{
	BYTE* pByte = (BYTE*)pVoidIn;
	BYTE* pByteOut = (BYTE*)pVoidOut;
	if(!pByteOut)
	{
		return nInSize / 2;
	}
	else
	{
		int i;
		if(bTrimSpace)
		{
			BYTE* pBuf;
			if(pByte[nInSize - 1] == 0x20)
			{
				pBuf = new BYTE[nInSize / 3 + 1];
				for(i = 0; i < nInSize / 3; i ++)
				{
					BYTE b1 = isalpha(pByte[3 * i]) ?
						pByte[3 * i] - 0x37 : pByte[3 * i] - 0x30;
					BYTE b2 = isalpha(pByte[3 * i + 1]) ?
						pByte[3 * i + 1] - 0x37 : pByte[3 * i + 1] - 0x30;
					b1 <<= 4;
					b1 |= b2;
					pBuf[i] = b1;
				}
			}
			else
			{
				pBuf = new BYTE[(nInSize + 1) / 3 + 1];
				for(i = 0; i < (nInSize + 1) / 3; i ++)
				{
					BYTE b1 = isalpha(pByte[3 * i]) ?
						pByte[3 * i] - 0x37 : pByte[3 * i] - 0x30;
					BYTE b2 = isalpha(pByte[3 * i + 1]) ?
						pByte[3 * i + 1] - 0x37 : pByte[3 * i + 1] - 0x30;
					b1 <<= 4;
					b1 |= b2;
					pBuf[i] = b1;
				}
			}
			memcpy(pByteOut, pBuf, i);
			delete pBuf;
		}
		else
		{
			BYTE* pBuf = new BYTE[nInSize / 2 + 1];
			for(i = 0; i < nInSize / 2; i ++)
			{
				BYTE b1 = isalpha(pByte[2 * i]) ?
					pByte[2 * i] - 0x37 : pByte[2 * i] - 0x30;
				BYTE b2 = isalpha(pByte[2 * i + 1]) ?
					pByte[2 * i + 1] - 0x37 : pByte[2 * i + 1] - 0x30;
				b1 <<= 4;
				b1 |= b2;
				pBuf[i] = b1;
			}
			memcpy(pByteOut, pBuf, i);
			delete pBuf;
		}

		return i;
	}
}

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

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()

/////////////////////////////////////////////////////////////////////////////
// CCustomFileDlg dialog

class CCustomFileDlg : public CFileDialog
{
	DECLARE_DYNAMIC(CCustomFileDlg)

public:
	CCustomFileDlg(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
		LPCTSTR lpszDefExt = NULL,
		LPCTSTR lpszFileName = NULL,
		DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		LPCTSTR lpszFilter = NULL,
		CWnd* pParentWnd = NULL);

	void SetFileTitle(LPCTSTR lpszTitle) {strcpy(m_szFileTitle, (LPCTSTR)lpszTitle);}

protected:
	//{{AFX_MSG(CCustomFileDlg)
	virtual BOOL OnInitDialog();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
// CCustomFileDlg

IMPLEMENT_DYNAMIC(CCustomFileDlg, CFileDialog)

CCustomFileDlg::CCustomFileDlg(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
		DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :
		CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd)
{
}


BEGIN_MESSAGE_MAP(CCustomFileDlg, CFileDialog)
	//{{AFX_MSG_MAP(CCustomFileDlg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BOOL CCustomFileDlg::OnInitDialog() 
{
	if(CFileDialog::OnInitDialog() == TRUE) {
		HICON hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
		CWnd* pParent = GetParent();
		if(pParent != NULL) {  // null in NT 3.51
		// there's a phantom parent dialog -- gotta use it
			pParent->SetIcon(hIcon, TRUE);			// Set big icon
			pParent->SetIcon(hIcon, FALSE);		// Set small icon
		}
		return TRUE;
	}
	return FALSE;
}


/////////////////////////////////////////////////////////////////////////////
// CComMon_SERIALDlg dialog

const int WM_INITINTERFACE = WM_USER + 1001;

CComMon_SERIALDlg::CComMon_SERIALDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CComMon_SERIALDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CComMon_SERIALDlg)
	m_sSelCom1 = _T("");
	m_sSelBaud1 = _T("");
	m_sSelParity1 = _T("");
	m_sSelDatabit1 = _T("");
	m_sSelStopbit1 = _T("");
	m_sSelCom2 = _T("");
	m_sSelBaud2 = _T("");
	m_sSelParity2 = _T("");
	m_sSelDatabit2 = _T("");
	m_sSelStopbit2 = _T("");
	m_sRESnd1 = _T("");
	m_sRERcv1 = _T("");
	m_sRERcv2 = _T("");
	m_sRESnd2 = _T("");
	m_sComState1 = _T("关 闭");
	m_sComState2 = _T("关 闭");
	m_nRecvBytes1 = 0;
	m_nRecvBytes2 = 0;
	m_nSendBytes1 = 0;
	m_nSendBytes2 = 0;
	m_nSendCycle1 = 1000;
	m_nSendCycle2 = 1000;
	m_nBufSize = 512;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_aPorts.SetSize(0);
	m_aByteRcv1.SetSize(0);
	m_aByteSnd1.SetSize(0);
	m_aByteRcv2.SetSize(0);
	m_aByteSnd2.SetSize(0);
	m_bClock1_Open = FALSE;
	m_bClock2_Open = FALSE;
	AfxInitRichEdit();
}

CComMon_SERIALDlg::~CComMon_SERIALDlg()
{
	for(int i = 0; i < m_aPorts.GetSize(); i ++)
	{
		if(AfxIsValidAddress(m_aPorts.GetAt(i), sizeof(CSerialPort)))
		{
			delete (CSerialPort *)m_aPorts.GetAt(i);
		}
	}
}

void CComMon_SERIALDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CComMon_SERIALDlg)
	DDX_Control(pDX, IDC_RERECV2, m_reRecv2);
	DDX_Control(pDX, IDC_RERECV1, m_reRecv1);
	DDX_Control(pDX, IDC_RESEND2, m_reSend2);
	DDX_Control(pDX, IDC_RESEND1, m_reSend1);
	DDX_Control(pDX, IDC_ESENDCYCLE2, m_eSendCycle2);
	DDX_Control(pDX, IDC_ESENDCYCLE1, m_eSendCycle1);
	DDX_Control(pDX, IDC_CHECK_NORCV, m_chNotRecv);
	DDX_Control(pDX, IDC_CTRANSMIT_1AND2, m_chTransmit1And2);
	DDX_Control(pDX, IDC_CSENDHEX2, m_chSendHex2);
	DDX_Control(pDX, IDC_CSENDHEX1, m_chSendHex1);
	DDX_Control(pDX, IDC_CAUTOSND2, m_chAutoSnd2);
	DDX_Control(pDX, IDC_CAUTOSND1, m_chAutoSnd1);
	DDX_Control(pDX, IDC_CRECVHEX2, m_chRcvHex2);
	DDX_Control(pDX, IDC_CRECVHEX1, m_chRcvHex1);
	DDX_Control(pDX, IDC_CAUTONLINE2, m_chAutoNLine2);
	DDX_Control(pDX, IDC_CAUTONLINE1, m_chAutoNLine1);
	DDX_Control(pDX, IDC_CSELCHECKBIT2, m_cSelParity2);
	DDX_Control(pDX, IDC_CSELCHECKBIT1, m_cSelParity1);
	DDX_Control(pDX, IDC_CSELCOM2, m_cSelCom2);
	DDX_Control(pDX, IDC_CSELCOM1, m_cSelCom1);
	DDX_Control(pDX, IDC_CSELSTOPBIT2, m_cSelStopbit2);
	DDX_Control(pDX, IDC_CSELSTOPBIT1, m_cSelStopbit1);
	DDX_Control(pDX, IDC_CSELDATABIT2, m_cSelDatabit2);
	DDX_Control(pDX, IDC_CSELDATABIT1, m_cSelDatabit1);
	DDX_Control(pDX, IDC_CSELBAUD2, m_cSelBaud2);
	DDX_Control(pDX, IDC_CSELBAUD1, m_cSelBaud1);
	DDX_Control(pDX, IDC_BSTARTCOM2, m_bstartcom2);
	DDX_Control(pDX, IDC_BSTARTCOM1, m_startcom1);
	DDX_Control(pDX, IDC_BSEND2, m_bSend2);
	DDX_Control(pDX, IDC_BSEND1, m_bSend1);
	DDX_CBString(pDX, IDC_CSELBAUD2, m_sSelBaud2);
	DDX_CBString(pDX, IDC_CSELDATABIT1, m_sSelDatabit1);
	DDX_CBString(pDX, IDC_CSELDATABIT2, m_sSelDatabit2);
	DDX_CBString(pDX, IDC_CSELSTOPBIT2, m_sSelStopbit2);
	DDX_CBString(pDX, IDC_CSELCOM1, m_sSelCom1);
	DDX_CBString(pDX, IDC_CSELCOM2, m_sSelCom2);
	DDX_CBString(pDX, IDC_CSELBAUD1, m_sSelBaud1);
	DDX_CBString(pDX, IDC_CSELCHECKBIT1, m_sSelParity1);
	DDX_CBString(pDX, IDC_CSELCHECKBIT2, m_sSelParity2);
	DDX_CBString(pDX, IDC_CSELSTOPBIT1, m_sSelStopbit1);
	DDX_Text(pDX, IDC_RESEND1, m_sRESnd1);
	DDX_Text(pDX, IDC_RERECV1, m_sRERcv1);
	DDX_Text(pDX, IDC_RERECV2, m_sRERcv2);
	DDX_Text(pDX, IDC_RESEND2, m_sRESnd2);
	DDX_Text(pDX, IDC_ECOMSTATE1, m_sComState1);
	DDX_Text(pDX, IDC_ECOMSTATE2, m_sComState2);
	DDX_Text(pDX, IDC_ERECVBYTE1, m_nRecvBytes1);
	DDX_Text(pDX, IDC_ERECVBYTE2, m_nRecvBytes2);
	DDX_Text(pDX, IDC_ESENDBYTE1, m_nSendBytes1);
	DDX_Text(pDX, IDC_ESENDBYTE2, m_nSendBytes2);
	DDX_Text(pDX, IDC_ESENDCYCLE1, m_nSendCycle1);
	DDX_Text(pDX, IDC_ESENDCYCLE2, m_nSendCycle2);
	DDX_Text(pDX, IDC_EBUFSIZE, m_nBufSize);
	DDV_MinMaxUInt(pDX, m_nBufSize, 16, 65536);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CComMon_SERIALDlg, CDialog)
	//{{AFX_MSG_MAP(CComMon_SERIALDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_OK, OnCOK)
	ON_BN_CLICKED(IDC_CANCEL, OnCCancel)
	ON_BN_CLICKED(IDC_BSTARTCOM1, OnStartCom1)
	ON_BN_CLICKED(IDC_BSTARTCOM2, OnStartCom2)
	ON_BN_CLICKED(IDC_BSEND1, OnSend1)
	ON_BN_CLICKED(IDC_BSEND2, OnSend2)
	ON_BN_CLICKED(IDC_CTRANSMIT_1AND2, OnTransmit_1AND2)
	ON_BN_CLICKED(IDC_CAUTORCVSND1, OnAutoRcvSnd1)
	ON_BN_CLICKED(IDC_CAUTORCVSND2, OnAutoRcvSnd2)
	ON_CBN_EDITCHANGE(IDC_CSELCOM1, OnEditchangeCom1)
	ON_CBN_EDITCHANGE(IDC_CSELBAUD1, OnEditchangeBaud1)
	ON_CBN_EDITCHANGE(IDC_CSELDATABIT1, OnEditchangeDatabit1)
	ON_CBN_EDITCHANGE(IDC_CSELCHECKBIT1, OnEditchangeCheckbit1)
	ON_CBN_EDITCHANGE(IDC_CSELSTOPBIT1, OnEditchangeStopbit1)
	ON_CBN_EDITCHANGE(IDC_CSELCOM2, OnEditchangeCom2)
	ON_CBN_EDITCHANGE(IDC_CSELBAUD2, OnEditchangeBaud2)
	ON_CBN_EDITCHANGE(IDC_CSELDATABIT2, OnEditchangeDatabit2)
	ON_CBN_EDITCHANGE(IDC_CSELCHECKBIT2, OnEditchangeCheckbit2)
	ON_CBN_EDITCHANGE(IDC_CSELSTOPBIT2, OnEditchangeStopbit2)
	ON_CBN_SELCHANGE(IDC_CSELCHECKBIT1, OnSelchangeSelCheckbit1)
	ON_CBN_SELCHANGE(IDC_CSELBAUD1, OnSelchangeSelBaud1)
	ON_CBN_SELCHANGE(IDC_CSELBAUD2, OnSelchangeSelBaud2)
	ON_CBN_SELCHANGE(IDC_CSELCHECKBIT2, OnSelchangeSelCheckbit2)
	ON_CBN_SELCHANGE(IDC_CSELCOM1, OnSelchangeSelCom1)
	ON_CBN_SELCHANGE(IDC_CSELCOM2, OnSelchangeSelCom2)
	ON_CBN_SELCHANGE(IDC_CSELDATABIT1, OnSelchangeSelDatabit1)
	ON_CBN_SELCHANGE(IDC_CSELDATABIT2, OnSelchangeSelDatabit2)
	ON_CBN_SELCHANGE(IDC_CSELSTOPBIT1, OnSelchangeSelStopbit1)
	ON_CBN_SELCHANGE(IDC_CSELSTOPBIT2, OnSelchangeSelStopbit2)
	ON_BN_CLICKED(IDC_BCLEARRCV1, OnClearRcv1)
	ON_BN_CLICKED(IDC_BCLEARSND1, OnClearSnd1)
	ON_BN_CLICKED(IDC_BCLEARRCV2, OnClearRcv2)
	ON_BN_CLICKED(IDC_BCLEARSND2, OnClearSnd2)
	ON_BN_CLICKED(IDC_BCLEARCOUNT1, OnClearCount1)
	ON_BN_CLICKED(IDC_BCLEARCOUNT2, OnClearCount2)
	ON_WM_SHOWWINDOW()
	ON_WM_TIMER()
	ON_EN_CHANGE(IDC_ESENDCYCLE1, OnChangeESendCycle1)
	ON_EN_CHANGE(IDC_ESENDCYCLE2, OnChangeESendCycle2)
	ON_EN_CHANGE(IDC_RESEND1, OnChangeRESend1)
	ON_EN_CHANGE(IDC_RESEND2, OnChangeRESend2)
	ON_NOTIFY(EN_SELCHANGE, IDC_RESEND1, OnSelChangeRESend1)
	ON_BN_CLICKED(IDC_BSAVEDATA1, OnSaveData1)
	ON_BN_CLICKED(IDC_BSAVEDATA2, OnSaveData2)
	ON_BN_CLICKED(IDC_CAUTONLINE1, OnAutoNLine1)
	ON_BN_CLICKED(IDC_CAUTONLINE2, OnAutoNLine2)
	ON_BN_CLICKED(IDC_CAUTOSND1, OnAutoSnd1)
	ON_BN_CLICKED(IDC_CAUTOSND2, OnAutoSnd2)
	ON_BN_CLICKED(IDC_OK, OnOK)
	ON_BN_CLICKED(IDC_CANCEL, OnCancel)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_INITINTERFACE, OnInitInterface)
	ON_MESSAGE(WM_COMM_EVENT, OnCommEvent)
	ON_MESSAGE(WM_COMM_RXCHAR, OnComRXChars)
	ON_MESSAGE(WM_COMM_ERROR, OnCommError)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CComMon_SERIALDlg message handlers

BOOL CComMon_SERIALDlg::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_reSend1.SendMessage(EM_SETEVENTMASK, 0, ENM_UPDATE | ENM_CHANGE | ENM_SELCHANGE);
	m_reSend2.SendMessage(EM_SETEVENTMASK, 0, ENM_UPDATE | ENM_CHANGE | ENM_SELCHANGE);
	m_reRecv1.SendMessage(EM_SETEVENTMASK, 0, ENM_UPDATE | ENM_CHANGE | ENM_SELCHANGE);
	m_reRecv2.SendMessage(EM_SETEVENTMASK, 0, ENM_UPDATE | ENM_CHANGE | ENM_SELCHANGE);

	// init the ports
	int j = 0;
	for (int i = 0; i < 256; i++)
	{
		CSerialPort* pSerialPort = new CSerialPort;
		if (pSerialPort->InitPort(this, i + 1, i == 0 ? 9600 : 19200))
		{
			if(!j)
			{
				j = i + 1;
			}
			CString sCom;
			sCom.Format("COM%d", i + 1);
			m_cSelCom1.AddString(sCom);
			m_cSelCom2.AddString(sCom);
			pSerialPort->SetComName(sCom);
			pSerialPort->ClosePort();
			m_aPorts.Add(pSerialPort);
		}
		else
		{
			delete pSerialPort;
		}
	}

	if(j)
	{
		m_cSelCom1.SetCurSel(0);
		m_cSelParity1.SetCurSel(0);
		m_cSelDatabit1.SetCurSel(0);
		m_cSelStopbit1.SetCurSel(0);
		for(int i = 0; m_cSelBaud1.GetCount(); i ++)
		{
			CString sLB;
			m_cSelBaud1.GetLBText(i, sLB);
			if(sLB == "9600")
			{
				m_cSelBaud1.SetCurSel(i);
				break;
			}
		}
		if(m_cSelCom2.GetCount() > 1)
		{
			m_cSelCom2.SetCurSel(1);
			m_cSelParity2.SetCurSel(0);
			m_cSelDatabit2.SetCurSel(0);
			m_cSelStopbit2.SetCurSel(0);
			for(i = 0; m_cSelBaud2.GetCount(); i ++)
			{
				CString sLB;
				m_cSelBaud2.GetLBText(i, sLB);
				if(sLB == "9600")
				{
					m_cSelBaud2.SetCurSel(i);
					break;
				}
			}
		}
		m_cSelDatabit1.SetCurSel(m_cSelDatabit1.GetCount() - 1);
		m_cSelDatabit2.SetCurSel(m_cSelDatabit2.GetCount() - 1);
	}
	PostMessage(WM_INITINTERFACE);
	m_bComNO1_Open = FALSE;
	m_bComNO2_Open = FALSE;
	m_chRcvHex1.SetCheck(1);
	m_chSendHex1.SetCheck(1);
	m_chRcvHex2.SetCheck(1);
	m_chSendHex2.SetCheck(1);

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CComMon_SERIALDlg::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 CComMon_SERIALDlg::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();
	}
	UpdateData();
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CComMon_SERIALDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CComMon_SERIALDlg::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CDialog::OnShowWindow(bShow, nStatus);
	
}

void CComMon_SERIALDlg::OnCOK() 
{
	LookupSerialState();
	CDialog::OnOK();
}

void CComMon_SERIALDlg::OnCCancel() 
{
	LookupSerialState();
	CDialog::OnCancel();
}

void CComMon_SERIALDlg::OnStartCom1() 
{
	UpdateData();
	int i = m_cSelCom1.GetCurSel();
	if(((CSerialPort*)m_aPorts[i])->GetComName() == m_sSelCom1)
	{
		static BOOL bStart = FALSE;
		if(bStart)
		{
			((CSerialPort *)m_aPorts[i])->NeedThreadStopping(FALSE);
			((CSerialPort *)m_aPorts[i])->ClosePort();
			m_cSelBaud1.EnableWindow();
			m_cSelCom1.EnableWindow();
			m_cSelDatabit1.EnableWindow();
			m_cSelStopbit1.EnableWindow();
			m_cSelParity1.EnableWindow();
			SetDlgItemText(IDC_BSTARTCOM1, "打开串口");
			m_sComState1 = "关 闭";
			if(m_chAutoSnd1.GetCheck())
				KillTimer(CLOCK1);
			m_chAutoSnd1.SetCheck(0);
			m_chAutoSnd1.EnableWindow(FALSE);
			m_eSendCycle1.EnableWindow(FALSE);
			m_chTransmit1And2.SetCheck(0);
			m_chTransmit1And2.EnableWindow(FALSE);
			m_bClock1_Open = FALSE;
			m_bComNO1_Open = FALSE;
		}
		else
		{
			CString sComName;
			int nPos = -1;
			m_cSelCom1.GetWindowText(sComName);
			sComName.MakeUpper();
			if((nPos = sComName.Find("COM")) == -1) return;
			char* sComNo;
			char* sComTemp = strdup(sComName);
			sComNo = sComTemp + lstrlen("COM");
			((CSerialPort *)m_aPorts[i])->NeedThreadStopping(TRUE);
			if(!((CSerialPort *)m_aPorts[i])->InitPort(this, atoi(sComNo), atoi(m_sSelBaud1),
				m_sSelParity1[0], atoi(m_sSelDatabit1), atoi(m_sSelStopbit1)))
			{
				delete sComTemp;
				return;
			}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -