📄 kevinapp001dlg.cpp
字号:
// KevinApp001Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "KevinApp001.h"
#include "KevinApp001Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CKevinApp001Dlg dialog
CKevinApp001Dlg::CKevinApp001Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CKevinApp001Dlg::IDD, pParent)
{
m_Str_SendEdit = _T("");
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CKevinApp001Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX,IDC_BUTTON1,m_Btn_OpenCOM);
DDX_Control(pDX,IDC_BUTTON2,m_Btn_CloseCOM);
DDX_Control(pDX,IDC_COMBO1,m_CbBox_SerialNum);
DDX_Control(pDX,IDC_COMBO2,m_CbBox_Baudrate);
DDX_Control(pDX,IDC_COMBO3,m_CbBox_Databit);
DDX_Control(pDX,IDC_COMBO4,m_CbBox_Stopbit);
DDX_Control(pDX,IDC_COMBO5,m_CbBox_Verify);
DDX_Text(pDX,IDC_EDIT1,m_Str_ReceiveEdit);
DDX_Text(pDX,IDC_EDIT2,m_Str_SendEdit);
}
BEGIN_MESSAGE_MAP(CKevinApp001Dlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
ON_WM_SIZE()
#endif
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, &CKevinApp001Dlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CKevinApp001Dlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &CKevinApp001Dlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON4, &CKevinApp001Dlg::OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON5, &CKevinApp001Dlg::OnBnClickedButton5)
END_MESSAGE_MAP()
// CKevinApp001Dlg message handlers
BOOL CKevinApp001Dlg::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
m_CbBox_SerialNum.SetCurSel(0);
m_CbBox_Baudrate.SetCurSel(5);
m_CbBox_Databit.SetCurSel(1);
m_CbBox_Stopbit.SetCurSel(0);
m_CbBox_Verify.SetCurSel(0);
m_Btn_CloseCOM.EnableWindow(FALSE);
m_hComPort = INVALID_HANDLE_VALUE;
m_hExitThreadEvent = NULL;
m_Str_ReceiveEdit = _T("");
m_Str_SendEdit = _T("");
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}
//==============================================================================
//==============================================================================
//==============================================================================
BOOL CKevinApp001Dlg::CloseComPort()
{
if(m_hComPort != INVALID_HANDLE_VALUE)
{
SetCommMask(m_hComPort,0);
PurgeComm(m_hComPort,PURGE_RXCLEAR|PURGE_TXABORT);
CloseHandle(m_hComPort);
m_hComPort = INVALID_HANDLE_VALUE;
return TRUE;
}
MessageBox(_T("Close COM port Error !!!"));
return FALSE;
}
BOOL CKevinApp001Dlg::OpenComPort(LPCTSTR Port,int Baudrate,int Databit,int Stopbit,int Parity)
{
COMMTIMEOUTS CommTimeOuts;
m_hComPort = CreateFile(Port,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
if(m_hComPort == INVALID_HANDLE_VALUE)
{
MessageBox(_T("Can not Open COM port ! Please check it !!! "));
return FALSE;
}
GetCommState(m_hComPort,&dcb);
dcb.BaudRate = Baudrate;
dcb.ByteSize = Databit;
dcb.StopBits = Stopbit;
dcb.Parity = Parity;
dcb.fParity = FALSE;
dcb.fBinary = TRUE;
dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
dcb.fOutX = 0;
dcb.fInX = 0;
dcb.fTXContinueOnXoff = 0;
SetCommMask(m_hComPort,EV_RXCHAR);
SetupComm(m_hComPort,16384,16384);
if(!SetCommState(m_hComPort,&dcb))
{
MessageBox(_T("Current COM port parameter is error !!!"));
CloseComPort();
return FALSE;
}
GetCommTimeouts(m_hComPort,&CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout = 100;
CommTimeOuts.ReadTotalTimeoutMultiplier = 1;
CommTimeOuts.ReadTotalTimeoutConstant = 100;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0;
if(!SetCommTimeouts(m_hComPort,&CommTimeOuts))
{
MessageBox(_T("Can not set this time out parameter !!!"));
CloseComPort();
return FALSE;
}
PurgeComm(m_hComPort,PURGE_RXCLEAR|PURGE_TXABORT);
return TRUE;
}
void CALLBACK CKevinApp001Dlg::onCommReceive(CWnd* pWnd,char *buf,int buflen)
{
CString temp;
CKevinApp001Dlg *pDlg = (CKevinApp001Dlg*)pWnd;
CEdit *pRecvEditStr = (CEdit*)pDlg->GetDlgItem(IDC_EDIT1);
for(int i=0;i<buflen;i++,buf++)
{
temp.Format(_T("%c"),*buf);
pDlg->m_Str_ReceiveEdit += temp;
}
pRecvEditStr->SetWindowText(pDlg->m_Str_ReceiveEdit);
}
DWORD CKevinApp001Dlg::ComPortReceiveThread(LPVOID lparam)
{
DWORD dwLength;
char *RecvBuf = new char[512];
CKevinApp001Dlg *pDlg = (CKevinApp001Dlg*)lparam;
while(TRUE)
{
if(WaitForSingleObject(pDlg->m_hExitThreadEvent,0)==WAIT_OBJECT_0)
break;
if(pDlg->m_hComPort != INVALID_HANDLE_VALUE)
{
BOOL fReadState = ReadFile(pDlg->m_hComPort,RecvBuf,512,&dwLength,NULL);
if(fReadState)
{
if(dwLength != 0)
onCommReceive(pDlg,RecvBuf,dwLength);
}
}
}
delete[] RecvBuf;
return 0;
}
//==============================================================================
//==============================================================================
//==============================================================================
const CString PorTbl[6] = {_T("COM1:"),_T("COM2:"),_T("COM3:"),_T("COM4:"),_T("COM5:"), _T("COM6:")};
const DWORD BaudTbl[9] = {4800, 9600, 19200, 38400, 57600,115200,230400,460800,921600};
const DWORD DataBitTbl[2] = {7, 8};
const BYTE StopBitTbl[3] = {ONESTOPBIT, ONE5STOPBITS, TWOSTOPBITS};
const BYTE ParityTbl[4] = {NOPARITY, ODDPARITY, EVENPARITY, MARKPARITY};
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CKevinApp001Dlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
if (AfxIsDRAEnabled())
{
DRA::RelayoutDialog(
AfxGetResourceHandle(),
this->m_hWnd,
DRA::GetDisplayMode() != DRA::Portrait ?
MAKEINTRESOURCE(IDD_KEVINAPP001_DIALOG_WIDE) :
MAKEINTRESOURCE(IDD_KEVINAPP001_DIALOG));
}
}
#endif
void CKevinApp001Dlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
DWORD IDThread;
HANDLE hReceiveThread;
UpdateData(TRUE);
CString strPort = PorTbl[m_CbBox_SerialNum.GetCurSel()];
DWORD baudrate = BaudTbl[m_CbBox_Baudrate.GetCurSel()];
DWORD databit = DataBitTbl[m_CbBox_Databit.GetCurSel()];
BYTE stopbit = StopBitTbl[m_CbBox_Stopbit.GetCurSel()];
BYTE parity = ParityTbl[m_CbBox_Verify.GetCurSel()];
BOOL ret = OpenComPort(strPort,baudrate,databit,stopbit,parity);
if(ret==FALSE)
return ;
m_hExitThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
hReceiveThread = CreateThread(0,0,ComPortReceiveThread,this,0,&IDThread);
if(hReceiveThread == NULL)
{
MessageBox(_T("Creat thread failed !!!"));
return;
}
CloseHandle(hReceiveThread);
m_Btn_CloseCOM.EnableWindow(TRUE);
m_Btn_OpenCOM.EnableWindow(FALSE);
MessageBox(_T("Open") + strPort + _T("Secuss!"));
}
void CKevinApp001Dlg::OnBnClickedButton2()
{
// TODO: Add your control notification handler code here
if(m_hExitThreadEvent != NULL)
{
SetEvent(m_hExitThreadEvent);
Sleep(1000);
CloseHandle(m_hExitThreadEvent);
m_hExitThreadEvent = NULL;
}
m_Btn_CloseCOM.EnableWindow(FALSE);
m_Btn_OpenCOM.EnableWindow(TRUE);
CloseComPort();
}
void CKevinApp001Dlg::OnBnClickedButton3()
{
// TODO: Add your control notification handler code here
DWORD dwActLen;
if(m_hComPort == INVALID_HANDLE_VALUE)
{
MessageBox(_T("Com port not open !!!"));
return;
}
UpdateData(TRUE);
DWORD len = m_Str_SendEdit.GetLength();
char *pSentChar = new char[len+2];
for(DWORD i=0;i<len;i++)
pSentChar[i] = (char)m_Str_SendEdit.GetAt(i);
pSentChar[len] = (char)(13);
pSentChar[len+1] = (char)(10);
//pSentChar[len+2] = 0;
len = len + 2;
WriteFile(m_hComPort,pSentChar,len,&dwActLen,NULL);
delete[] pSentChar;
if(len != dwActLen)
{
MessageBox(_T("Sent data error !!!"));
}
}
void CKevinApp001Dlg::OnBnClickedButton4()
{
// TODO: Add your control notification handler code here
m_Str_SendEdit = _T("");
//SetDlgItemText(IDC_EDIT_Sent,m_Str_SendEdit);
UpdateData(FALSE);
}
void CKevinApp001Dlg::OnBnClickedButton5()
{
// TODO: Add your control notification handler code here
m_Str_ReceiveEdit = _T("");
SetDlgItemText(IDC_EDIT1,m_Str_ReceiveEdit);
//UpdateData(FALSE);
}
void CKevinApp001Dlg::OnOK(void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -