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

📄 porttestdlg.cpp

📁 串口测试工具
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "PortTest.h"
#include "PortTestDlg.h"
#include "PortSet.h"

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

int PortNo = 1 ;
CString PortSet = "9600,n,8,1";

static BYTE CRCHi[] = {
	0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
	0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
	0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,
	0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
	0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,
	0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
	0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,
	0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
	0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
	0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
	0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,
	0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
	0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
	} ;
static BYTE CRCLo[] = {
	0x00,0xc0,0xc1,0x01,0xc3,0x03,0x02,0xc2,0xc6,0x06,0x07,0xc7,0x05,0xc5,0xc4,0x04,0xcc,0x0c,0x0d,0xcd,
	0x0f,0xcf,0xce,0x0e,0x0a,0xca,0xcb,0x0b,0xc9,0x09,0x08,0xc8,0xd8,0x18,0x19,0xd9,0x1b,0xdb,0xda,0x1a,
	0x1e,0xde,0xdf,0x1f,0xdd,0x1d,0x1c,0xdc,0x14,0xd4,0xd5,0x15,0xd7,0x17,0x16,0xd6,0xd2,0x12,0x13,0xd3,
	0x11,0xd1,0xd0,0x10,0xf0,0x30,0x31,0xf1,0x33,0xf3,0xf2,0x32,0x36,0xf6,0xf7,0x37,0xf5,0x35,0x34,0xf4,
	0x3c,0xfc,0xfd,0x3d,0xff,0x3f,0x3e,0xfe,0xfa,0x3a,0x3b,0xfb,0x39,0xf9,0xf8,0x38,0x28,0xe8,0xe9,0x29,
	0xeb,0x2b,0x2a,0xea,0xee,0x2e,0x2f,0xef,0x2d,0xed,0xec,0x2c,0xe4,0x24,0x25,0xe5,0x27,0xe7,0xe6,0x26,
	0x22,0xe2,0xe3,0x23,0xe1,0x21,0x20,0xe0,0xa0,0x60,0x61,0xa1,0x63,0xa3,0xa2,0x62,0x66,0xa6,0xa7,0x67,
	0xa5,0x65,0x64,0xa4,0x6c,0xac,0xad,0x6d,0xaf,0x6f,0x6e,0xae,0xaa,0x6a,0x6b,0xab,0x69,0xa9,0xa8,0x68,
	0x78,0xb8,0xb9,0x79,0xbb,0x7b,0x7a,0xba,0xbe,0x7e,0x7f,0xbf,0x7d,0xbd,0xbc,0x7c,0xb4,0x74,0x75,0xb5,
	0x77,0xb7,0xb6,0x76,0x72,0xb2,0xb3,0x73,0xb1,0x71,0x70,0xb0,0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,
	0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9c,0x5c,0x5d,0x9d,0x5f,0x9f,0x9e,0x5e,0x5a,0x9a,0x9b,0x5b,
	0x99,0x59,0x58,0x98,0x88,0x48,0x49,0x89,0x4b,0x8b,0x8a,0x4a,0x4e,0x8e,0x8f,0x4f,0x8d,0x4d,0x4c,0x8c,
	0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40,
	} ;

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

CPortTestDlg::CPortTestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPortTestDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CPortTestDlg)
	m_AsciiHex = -1;
	m_AutoSend = FALSE;
	m_TimeSpace = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CPortTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPortTestDlg)
	DDX_Control(pDX, IDC_EMAIL, m_email);
	DDX_Control(pDX, IDC_SENDSET, m_SendSet);
	DDX_Control(pDX, IDC_MOVE, m_Move);
	DDX_Control(pDX, IDC_OUT, m_Send);
	DDX_Control(pDX, IDC_SUM, m_Sum);
	DDX_Control(pDX, IDC_LPC, m_Lpc);
	DDX_Control(pDX, IDC_CRC16, m_Crc16);
	DDX_Control(pDX, IDC_CRC8, m_Crc8);
	DDX_Control(pDX, IDC_CLEAR, m_Clear);
	DDX_Control(pDX, IDC_SET, m_Set);
	DDX_Control(pDX, IDC_CLOSE, m_Close);
	DDX_Control(pDX, IDC_OPEN, m_Open);
	DDX_Control(pDX, IDC_MSCOMM, m_MsComm);
	DDX_Radio(pDX, IDC_ASCII, m_AsciiHex);
	DDX_Check(pDX, IDC_AUTOSEND, m_AutoSend);
	DDX_Text(pDX, IDC_TIMESPACE, m_TimeSpace);
	DDV_MinMaxInt(pDX, m_TimeSpace, 100, 10000);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CPortTestDlg, CDialog)
	//{{AFX_MSG_MAP(CPortTestDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_OPEN, OnOpen)
	ON_BN_CLICKED(IDC_CLOSE, OnClose)
	ON_BN_CLICKED(IDC_CLEAR, OnClear)
	ON_BN_CLICKED(IDC_OUT, OnOut)
	ON_EN_KILLFOCUS(IDC_SENDSET, OnKillfocusSendset)
	ON_BN_CLICKED(IDC_ASCII, OnAscii)
	ON_BN_CLICKED(IDC_HEX, OnHex)
	ON_BN_CLICKED(IDC_AUTOSEND, OnAutosend)
	ON_EN_KILLFOCUS(IDC_TIMESPACE, OnKillfocusTimespace)
	ON_BN_CLICKED(IDC_SET, OnSet)
	ON_BN_CLICKED(IDC_SUM, OnSum)
	ON_BN_CLICKED(IDC_LPC, OnLpc)
	ON_BN_CLICKED(IDC_CRC8, OnCrc8)
	ON_BN_CLICKED(IDC_CRC16, OnCrc16)
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BOOL CPortTestDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	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);
		}
	}

	SetIcon( m_hIcon, TRUE ) ;
	SetIcon( m_hIcon, FALSE ) ;
	
	HICON m_hOpenIcon = AfxGetApp()->LoadIcon( IDI_OPEN ) ;
	HICON m_hCloseIcon = AfxGetApp()->LoadIcon( IDI_CLOSE ) ;
	HICON m_hSetIcon = AfxGetApp()->LoadIcon( IDI_SET ) ;
	HICON m_hSendIcon = AfxGetApp()->LoadIcon( IDI_SEND ) ;
	HICON m_hClearIcon = AfxGetApp()->LoadIcon( IDI_CLEAR ) ;
	HICON m_hCrc8Icon = AfxGetApp()->LoadIcon( IDI_CRC8 ) ;
	HICON m_hCrc16Icon = AfxGetApp()->LoadIcon( IDI_CRC16 ) ;
	HICON m_hLpcIcon = AfxGetApp()->LoadIcon( IDI_LPC ) ;
	HICON m_hSumIcon = AfxGetApp()->LoadIcon( IDI_SUM ) ;
	
	m_Open.SetIcon( m_hOpenIcon, m_hOpenIcon ) ;	//打开
	m_Open.SetCursor( IDC_CURSOR_HAND ) ;

	m_Close.SetIcon( m_hCloseIcon, m_hCloseIcon ) ;	//关闭
	m_Close.SetCursor( IDC_CURSOR_HAND ) ;
	
	m_Set.SetIcon( m_hSetIcon, m_hSetIcon ) ;		//设置
	m_Set.SetCursor( IDC_CURSOR_HAND ) ;

	m_Send.SetIcon( m_hSendIcon, m_hSendIcon ) ;	//发送
	m_Send.SetCursor( IDC_CURSOR_HAND ) ;

	m_Clear.SetIcon( m_hClearIcon, m_hClearIcon ) ;	//清除
	m_Clear.SetCursor( IDC_CURSOR_HAND ) ;

	m_Crc8.SetIcon( m_hCrc8Icon, m_hCrc8Icon ) ;	//CRC8
	m_Crc8.SetCursor( IDC_CURSOR_HAND ) ;

	m_Crc16.SetIcon( m_hCrc16Icon, m_hCrc16Icon ) ;	//CRC16
	m_Crc16.SetCursor( IDC_CURSOR_HAND ) ;

	m_Lpc.SetIcon( m_hLpcIcon, m_hLpcIcon ) ;		//LPC
	m_Lpc.SetCursor( IDC_CURSOR_HAND ) ;

	m_Sum.SetIcon( m_hSumIcon, m_hSumIcon ) ;		//SUM
	m_Sum.SetCursor( IDC_CURSOR_HAND ) ;

    m_Splitter.BindWithControl( this, IDC_SPLITTER ) ;	//横分割条
    m_Splitter.SetMinWidth( 50, 50 ) ;
    m_Splitter.AttachAsLeftPane( IDC_RECVTEXT ) ;
    m_Splitter.AttachAsLeftPane( IDC_RECVTITLE ) ;
    m_Splitter.AttachAsRightPane( IDC_SENDTEXT ) ;
    m_Splitter.AttachAsRightPane( IDC_SENDTITLE ) ;
    m_Splitter.RecalcLayout() ;
	
    m_SplitterH.BindWithControl( this, IDC_SPLITTERH ) ;//竖分割条	
    m_SplitterH.SetMinHeight( 100, 20 ) ;
    m_SplitterH.AttachAsAbovePane( IDC_SENDTEXT ) ;
    m_SplitterH.AttachAsAbovePane( IDC_RECVTEXT ) ;
    m_SplitterH.AttachAsAbovePane( IDC_SPLITTER ) ;
    m_SplitterH.AttachAsBelowPane( IDC_SENDSET ) ;
    m_SplitterH.RecalcLayout() ;

	m_AsciiHex = 1 ;
	m_TimeSpace = 1000 ;
	m_MsComm.SetCommPort( PortNo ) ;	//串口号
	m_MsComm.SetSettings( PortSet ) ;	//串口设置

	m_Move.SetTextColor( RGB( 255, 0, 0 ) ) ;
	m_Move.SetTextHeight( 18 ) ;
	m_Move.BeginRoll() ;

	m_email.SetURL( _T("mailto:zxtfyj@163.com") ) ;

	UpdateData( FALSE ) ;
	SetTimer( 1, 500, NULL ) ;	//显示时间
	return TRUE ;
}

void CPortTestDlg::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 CPortTestDlg::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 CPortTestDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CPortTestDlg::OnTimer(UINT nIDEvent) 
{
	if( nIDEvent == 1 )		//设置日期时间显示
	{
		CString strPortNo ;
		if( m_MsComm.GetPortOpen() )	//端口状态
			SetDlgItemText( IDC_STATUS, "状态:打开" ) ;
		else 	
			SetDlgItemText( IDC_STATUS, "状态:关闭" ) ;

		strPortNo.Format( "端口:%02d", m_MsComm.GetCommPort() ) ;	//端口号
		SetDlgItemText( IDC_PORT, strPortNo ) ;

		SetDlgItemText( IDC_PORTSET, "设置:" + PortSet ) ;

		char TempBuf[40] ;
		SYSTEMTIME st ;
		GetLocalTime( &st ) ;	//取当前时间
		wsprintf( TempBuf, "%04d年%02d月%02d日 %02d时%02d分%02d秒 ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond ) ;
		switch( st.wDayOfWeek )	//星期
		{
		case 0:
			lstrcat( TempBuf, "星期日" ) ;
			break ;
		case 1:
			lstrcat( TempBuf, "星期一" ) ;
			break ;
		case 2:
			lstrcat( TempBuf, "星期二" ) ;
			break ;
		case 3:
			lstrcat( TempBuf, "星期三" ) ;
			break ;
		case 4:
			lstrcat( TempBuf, "星期四" ) ;
			break ;
		case 5:
			lstrcat( TempBuf, "星期五" ) ;
			break ;
		case 6:
			lstrcat( TempBuf, "星期六" ) ;
			break ;
		}
		SetDlgItemText( IDC_DATETIME, TempBuf );	//设置时间显示
	}
	if( nIDEvent == 2 )		//自动发送报文
	{
		if( m_MsComm.GetPortOpen() )	//串口已打开
		{
			int nLen = ( m_strSendSetHex.GetLength() + 1 )/3 ;	//待发字节数
			if( nLen > 0 )	//待发送数据不为空
			{
				CByteArray OutBuf ; 
				COleVariant varOutput ; 
				OutBuf.SetSize( nLen ) ; 
				for( int i = 0; i < nLen; i++ )		//求发送字节
					OutBuf[i] = GetHexFromStr( m_strSendSetHex.Mid( 3*i, 2 ) ) ;
				varOutput = OutBuf ; 
				m_MsComm.SetOutput( varOutput ) ;	//发送
		
				//更新变量内容
				if( m_strSendTextHex == "" )
					m_strSendTextHex = m_strSendTextHex + m_strSendSetHex ;
				else
					m_strSendTextHex = m_strSendTextHex + " " + m_strSendSetHex ;
				m_strSendTextAscii = m_strSendTextAscii + m_strSendSetAscii ;
				
				//最多显示3000字节
				if( m_strSendTextHex.GetLength() > 8999 )
				{
					m_strSendTextHex = m_strSendTextHex.Right( 8999 ) ;
					m_strSendTextAscii = m_strSendTextAscii.Right( 3000 ) ;
				}
		
				if( m_AsciiHex )	//更新发送显示
					SetDlgItemText( IDC_SENDTEXT, m_strSendTextHex ) ;
				else
					SetDlgItemText( IDC_SENDTEXT, m_strSendTextAscii ) ;
			}
		}
	}

	CDialog::OnTimer( nIDEvent ) ;
}

void CPortTestDlg::OnOpen()		//打开串口
{
	if( m_MsComm.GetPortOpen() )
	{
		AfxMessageBox( "串口为打开状态!" ) ;
		return ;
	}
	m_MsComm.SetPortOpen( true ) ;
}

void CPortTestDlg::OnClose()	//关闭串口
{
	if( !m_MsComm.GetPortOpen() )
	{
		AfxMessageBox( "串口为关闭状态!" ) ;
		return ;
	}
	m_MsComm.SetPortOpen( false ) ;
}

BEGIN_EVENTSINK_MAP(CPortTestDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CPortTestDlg)
	ON_EVENT(CPortTestDlg, IDC_MSCOMM, 1 /* OnComm */, OnOnCommMscomm, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CPortTestDlg::OnOnCommMscomm() //接收数据处理
{
	if( m_MsComm.GetCommEvent() == 2 )	//有数据接收
	{
		CString strTmp ;
		VARIANT varInput ;
		unsigned char *InBuf ;

		int count = m_MsComm.GetInBufferCount() ;	//接收缓冲区的字符个数
		varInput = m_MsComm.GetInput() ;	//读缓冲区
		InBuf = (unsigned char *)( (varInput.parray)->pvData ) ;
		for( int i = 0; i < count; i++ )
		{
			m_strRecvTextAscii += InBuf[i] ;

			strTmp.Format( "%02x", InBuf[i] ) ;
			if( m_strRecvTextHex != "" ) m_strRecvTextHex += " " ;
			m_strRecvTextHex += strTmp ;
		}
		
		//最大3000字节
		if( m_strRecvTextHex.GetLength() > 8999 )
		{
			m_strRecvTextHex = m_strRecvTextHex.Right( 8999 ) ;
			m_strRecvTextAscii = m_strRecvTextAscii.Right( 3000 ) ;
		}

		if( m_AsciiHex )		//十六进制
			SetDlgItemText( IDC_RECVTEXT, m_strRecvTextHex ) ;
		else					//ASCII码
			SetDlgItemText( IDC_RECVTEXT, m_strRecvTextAscii ) ;
	}
}

⌨️ 快捷键说明

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