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

📄 kevinapp001dlg.cpp

📁 一个在三星2440平台上测试串口的应用程序,附有源码,用VS2005进行编译,经本要测试过可用!!!
💻 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 + -