📄 sertestdlg.cpp
字号:
// SerTestDlg.cpp : implementation file
//
#include "stdafx.h"
#include "SerTest.h"
#include "SerTestDlg.h"
#include "Message.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSerTestDlg dialog
HANDLE hcom=INVALID_HANDLE_VALUE;
bool m_connect=false;
HWND m_dlgwnd=NULL;
HANDLE hwriteevent=INVALID_HANDLE_VALUE;
int lenth=0;
WCHAR unibuf[128];
WCHAR rcvbuf[128];
CRITICAL_SECTION g_spycs;
CSerTestDlg::CSerTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSerTestDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSerTestDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSerTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSerTestDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSerTestDlg, CDialog)
//{{AFX_MSG_MAP(CSerTestDlg)
ON_BN_CLICKED(IDC_SEND, OnSend)
ON_BN_CLICKED(IDC_CLEAR, OnClear)
ON_BN_CLICKED(IDC_BUTTON1, OnMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSerTestDlg message handlers
BOOL CSerTestDlg::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
CenterWindow(GetDesktopWindow()); // center to the hpc screen
// TODO: Add extra initialization here
//m_dlgwnd=(HWND)this->m_hWnd;
OnConnect();
memset(unibuf,0,128*sizeof(WCHAR));
memset(rcvbuf,0,128*sizeof(WCHAR));
return TRUE; // return TRUE unless you set the focus to a control
}
DWORD WINAPI readthread(LPVOID lpara)
{
DWORD lenth;
COMSTAT comstate;
HWND hwnd=(HWND)lpara;
HWND hedit1=NULL;
HWND hconnect=NULL;
//bool val;
int convert;
TCHAR totalbuf[1024];
DWORD dwstate,dwerror,dwhasread;
hedit1=::GetDlgItem(hwnd,IDC_EDIT1);
hconnect=::GetDlgItem(hwnd,IDC_CONNECT);
SetCommMask(hcom,EV_RXCHAR);
::SetWindowText(hedit1,TEXT(""));
totalbuf[0]='\0';
memset(totalbuf,0,sizeof(TCHAR)*1024);
::SetWindowText(hconnect,TEXT("READING..."));
SetCommMask(hcom,EV_RXCHAR | EV_CTS | EV_DSR | EV_RING);
while(m_connect){
WaitCommEvent(hcom,&dwstate,NULL);
SetCommMask(hcom,EV_RXCHAR);
if(dwstate&EV_RXCHAR){
ClearCommError(hcom,&dwerror,&comstate);
lenth=comstate.cbInQue;
if(lenth<=0)
continue;
if(lenth>0)
{
char * readbuf=new char[lenth+1];
memset(readbuf,0,(lenth+1)*sizeof(char));
TCHAR *unicodebuf=new TCHAR[lenth+1];
memset(unicodebuf,0,sizeof(TCHAR)*(lenth+1));
if(!ReadFile(hcom,readbuf,lenth,&dwhasread,NULL))
MessageBox(hwnd,TEXT("READING ERROR"),NULL,MB_OK);
if(dwhasread>0){
readbuf[dwhasread]='\0';
convert=mbstowcs(unicodebuf,readbuf,lenth+1);
EnterCriticalSection(&g_spycs);
memset(rcvbuf,0,sizeof(WCHAR)*128);
wcscpy(rcvbuf,unicodebuf);
LeaveCriticalSection(&g_spycs);
wcscat(totalbuf,unicodebuf);
::SetWindowText(hedit1,totalbuf);
if(wcslen(totalbuf)==1023)
memset(totalbuf,0,sizeof(TCHAR)*1024);
}
delete []readbuf;
delete []unicodebuf;
}
}
}
return 1;
}
DWORD WINAPI writethread(LPVOID lpara)
{
DWORD val;
DWORD dwrealwrite;
while(m_connect)
{
val=WaitForSingleObject(hwriteevent,INFINITE);
if(val==WAIT_OBJECT_0)
{
char* chbuf=new char[lenth];
chbuf[lenth]='\0';
wcstombs(chbuf,unibuf,lenth);
if(!WriteFile(hcom,chbuf,lenth,&dwrealwrite,NULL))
{
::MessageBox(m_dlgwnd,TEXT("WRITE PORT ERROR"),NULL,MB_OK);
}
PurgeComm(hcom,PURGE_TXCLEAR);
::ResetEvent(::hwriteevent);
delete []chbuf;
}
}
return 1;
}
bool hasastring(WCHAR * sub)
{
EnterCriticalSection(&g_spycs);
if(wcsstr(sub,rcvbuf)!=NULL)
{
LeaveCriticalSection(&g_spycs);
return true ;
}
else
{
LeaveCriticalSection(&g_spycs);
return false;
}
}
bool hasachar(WCHAR wchar)
{
EnterCriticalSection(&g_spycs);
if(wcschr(rcvbuf,wchar)!=NULL)
{
LeaveCriticalSection(&g_spycs);
return true ;
}
else
{
LeaveCriticalSection(&g_spycs);
return false;
}
}
void CSerTestDlg::OnConnect()
{
m_dlgwnd=this->GetSafeHwnd();
HWND hedit2=::GetDlgItem(m_dlgwnd,IDC_EDIT2);
::SetWindowText(hedit2,TEXT(""));
DCB dcb;
COMMTIMEOUTS time;
HANDLE hread,hwrite,hspy;
DWORD readid,writeid,spyid;
if(hcom!=INVALID_HANDLE_VALUE)
MessageBox(TEXT("hcom already open"),NULL,MB_OK);
hcom=CreateFile(TEXT("COM1:"),GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING,0, NULL);
if(!hcom){
MessageBox(TEXT("hcom open error"),NULL,MB_OK);
return;
}
else
GetCommState(hcom,&dcb);
dcb.DCBlength=sizeof(dcb);
dcb.BaudRate=4800;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
dcb.fInX=false;
dcb.fOutX=false;
dcb.fOutxCtsFlow=false;
dcb.fOutxDsrFlow=false;
dcb.fDtrControl=DTR_CONTROL_DISABLE ;
// dcb.fTXContinueOnXoff=ture;
dcb.fNull=false;
if(!SetCommState(hcom,&dcb))
MessageBox(TEXT("setdcb error"),NULL,MB_OK);
GetCommTimeouts(hcom,&time);
time.ReadIntervalTimeout=MAXDWORD;
time.ReadTotalTimeoutConstant=0;
time.ReadTotalTimeoutMultiplier=0;
time.WriteTotalTimeoutConstant=1000;
time.WriteTotalTimeoutMultiplier=10;
SetCommTimeouts(hcom,&time);
SetCommMask(hcom,EV_RXCHAR);
PurgeComm(hcom,PURGE_TXCLEAR|PURGE_RXCLEAR);
// cs
InitializeCriticalSection(&g_spycs);
//event
hwriteevent=CreateEvent(NULL,TRUE,FALSE,NULL);
ResetEvent(hwriteevent);
//thread
hread=CreateThread(NULL,0,readthread,(LPVOID)this->GetSafeHwnd(),0,&readid);
hwrite=CreateThread(NULL,0,writethread,(LPVOID)this->GetSafeHwnd(),0,&writeid);
if(!hread)
MessageBox(TEXT("read thread error"),NULL,MB_OK);
if(!hwrite)
MessageBox(TEXT("write thread error"),NULL,MB_OK);
if(!hspy)
MessageBox(TEXT("spy thread error"),NULL,MB_OK);
m_connect=true;
}
void CSerTestDlg::OnSend()
{ // TODO: Add your control notification handler code here
HWND hedit=::GetDlgItem(::m_dlgwnd,IDC_EDIT2);
WCHAR atd[]=L"atd";
lenth=::GetWindowTextLength(hedit);
if(lenth==0)
MessageBox(TEXT("TEXT EMPTY"),NULL,MB_OK);
else
{
WCHAR buf[128];
memset(buf,0,128*2);
GetDlgItemText(IDC_EDIT2,buf,128);
buf[lenth]='\r';
buf[lenth+1]='\n';
wcscpy(unibuf,atd);
wcscat(unibuf,buf);
lenth+=5;
::SetEvent(hwriteevent);
}
}
void CSerTestDlg::OnClear()
{
CEdit *hedit=(CEdit*)GetDlgItem(IDC_EDIT1);
hedit->SetWindowText(TEXT(""));
}
void CSerTestDlg::OnOK()
{
// TODO: Add extra validation here
//CDialog::OnOK();
}
void CSerTestDlg::OnMessage()
{
//ShowWindow(SW_HIDE);
CMessage mes;
mes.DoModal();
ShowWindow(SW_SHOW);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -