📄 porttestdlg.cpp
字号:
#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 + -