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

📄 sertestdlg.cpp

📁 串口通讯的编程源码。很有参考价值!值得一看
💻 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 + -