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

📄 serialtestdlg.cpp

📁 EVC下的串口测试工具
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// SerialTestDlg.cpp : 备泅 颇老
//
#include "stdafx.h"
#include "SerialTest.h"
#include "SerialTestDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define	ASCII_LF		0x0a
#define	ASCII_CR		0x0d
#define	ASCII_XON		0x11
#define	ASCII_XOFF		0x13
#define OEM_DEBUG_UART_PORT   3

const int MAX_BUFF_SIZE		=	150 * 1024; // 150KB
const int BUFF_HEAD_SIZE	=	sizeof(DWORD); // buffer head size

const int TIMEOUT			=	200;

const int MAX_INT			=	2147483647;
const int MAX_CHAR			=	10240;
const int MSG_BUFF_SIZE		=	51200;


/* 馆汗屈怕 搬沥 惑荐. 冉荐 肚绰 矫埃 */
const int REPEAT_COUNT		=	1;
const int REPEAT_TIME		=	2;

const int ID_TIMER			=	1000;
const int ID_COMMANDBAR		=	2000;

unsigned int  fOnWait = 0;

CWinThread *pWhatchWriteQ = NULL; 

HANDLE hCommSem;
HANDLE hReadSem;
HANDLE hWriteSem;

BOOL fReading = FALSE;

PBYTE originBuff = NULL;
DWORD originSize = 0;

BOOL fRead = FALSE;
BOOL fWrite = FALSE;
BOOL fStress = FALSE;
UINT StressThread(LPVOID lParam);

CQueue *pRead;
CQueue *pWrite;

UINT ReadThread(LPVOID lParam);
UINT WriteThread(LPVOID lParam);
UINT WhatchThread(LPVOID lParam);
UINT WhatchWriteQ(LPVOID lParam);
BOOL ByteCpy(BYTE *source, BYTE *target, unsigned int size);
BOOL CheckBuffer(PBYTE pBuff, DWORD buffsize);
BOOL GetTimeText(CString *msg);

void DumpMemory(PBYTE buff, FILE *output,unsigned int dataSize, int delimcnt = 16);
// 览侩 橇肺弊伐 沥焊俊 荤侩登绰 CAboutDlg 措拳 惑磊涝聪促.

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// 措拳 惑磊 单捞磐涝聪促.
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 瘤盔涝聪促.

// 备泅涝聪促.
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CSerialTestDlg 措拳 惑磊




CSerialTestDlg::CSerialTestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSerialTestDlg::IDD, pParent)
	, m_Afc(false)
	, m_Repeat(0)
	, m_RepeatTime(0)
	, m_fRepeat(false)
	, m_fSync(FALSE)
	, m_fLoopBack(FALSE)
	, m_rSize(0)
	, m_wSize(0)
	, m_timeout(10000)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CSerialTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_CMBPORT, m_CmbPort);
	DDX_Control(pDX, IDC_CMBBAUD, m_CmbBaud);
	DDX_Text(pDX, IDC_EDTDATA, m_DataSize);
	DDX_Text(pDX, IDC_EDTBLOCK, m_BlockSize);
	DDX_Check(pDX, IDC_CHKAFC, m_Afc);
	DDX_Text(pDX, IDC_EDTREPEAT, m_RepeatCount);
	DDX_Text(pDX, IDC_EDTTERM, m_RepeatTerm);
	DDX_Text(pDX, IDC_EDTTIME, m_RepeatTime);
	DDX_Control(pDX, IDC_SPNTIME, m_SpnTime);
	DDX_Check(pDX, IDC_CHKSYNC, m_fSync);
	DDX_Check(pDX, IDC_CHKLOOPBACK, m_fLoopBack);
	DDX_Control(pDX, IDC_SPNTERM, m_SpnTerm);
	DDX_Control(pDX, IDC_SPNCOUNT, m_SpnCount);
	DDX_Text(pDX, IDC_EDTRSIZE, m_rSize);
	DDX_Text(pDX, IDC_EDTWSIZE, m_wSize);
	DDX_Text(pDX, IDC_EDTTIMEOUT, m_timeout);
	DDX_Control(pDX, IDC_EDTRESULT, m_EdtResult);
	DDX_Control(pDX, IDC_EDTERROR, m_EdtError);
}

BEGIN_MESSAGE_MAP(CSerialTestDlg, CDialog)
	//{{AFX_MSG_MAP
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_MESSAGE(WM_UPDATE, OnUpdateScreen)
	ON_COMMAND(ID_FILE_EXIT, OnFileExit)
	ON_COMMAND(ID_ABOUT_ABOUT, OnAboutAbout)
	ON_BN_CLICKED(IDC_BTNCONNECT, OnBnClickedBtnconnect)
	ON_BN_CLICKED(IDC_BTNQUIT, OnBnClickedBtnquit)
	ON_CBN_SELCHANGE(IDC_CMBPORT, OnCbnSelchangeCmbport)
	ON_BN_CLICKED(IDC_RDOREPEAT, OnBnClickedRdorepeat)
	ON_BN_CLICKED(IDC_RDOTIME, OnBnClickedRdotime)
	ON_BN_CLICKED(IDC_BTNSEND, OnBnClickedBtnsend)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_CHKSYNC, OnBnClickedChksync)
	ON_BN_CLICKED(IDC_CHKLOOPBACK, OnBnClickedChkloopback)
	ON_BN_CLICKED(IDC_BTNSTRESS, OnBnClickedBtnstress)
	ON_BN_CLICKED(IDC_BTNREAD, OnBnClickedBtnread)
	ON_EN_CHANGE(IDC_EDTTIME, OnEnChangeEdttime)
	ON_EN_CHANGE(IDC_EDTTERM, OnEnChangeEdtterm)
	ON_EN_CHANGE(IDC_EDTREPEAT, OnEnChangeEdtrepeat)
	//}}AFX_MSG_MAP	
END_MESSAGE_MAP()


// CSerialTestDlg 皋矫瘤 贸府扁

BOOL CSerialTestDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 矫胶袍 皋春俊 "沥焊..." 皋春 亲格阑 眠啊钦聪促.

	// IDM_ABOUTBOX绰 矫胶袍 疙飞 裹困俊 乐绢具 钦聪促.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);
#ifndef UNDER_CE
	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);
		}
	}
#endif

	// 捞 措拳 惑磊狼 酒捞能阑 汲沥钦聪促. 览侩 橇肺弊伐狼 林 芒捞 措拳 惑磊啊 酒匆 版快俊绰
	//  橇饭烙况农啊 捞 累诀阑 磊悼栏肺 荐青钦聪促.
	SetIcon(m_hIcon, TRUE);			// 奴 酒捞能阑 汲沥钦聪促.
	SetIcon(m_hIcon, FALSE);		// 累篮 酒捞能阑 汲沥钦聪促.

	// TODO: 咯扁俊 眠啊 檬扁拳 累诀阑 眠啊钦聪促.

	UpdateData(TRUE);

	int i;
	CString port;

	/* 霓焊冠胶 汲沥 */
#ifdef UNDER_CE
	/* WinCE 皋春 眠啊 */
	HWND hWnd = this->GetSafeHwnd();
    HINSTANCE hInst = AfxGetApp()->m_hInstance; 

	HWND hwndCB = CommandBar_Create(hInst, GetSafeHwnd(), ID_COMMANDBAR);
    CommandBar_InsertMenubar(hwndCB, hInst, IDR_MENU1, 0);
    //CommandBar_AddAdornments(hwndCB, 0, 0)

	/* 器飘汲沥 */
//	char *port[]={"COM1:", "COM2:", "COM3:", "COM4:", "COM5:", "COM6:"};
	for( i=0; i<6; i++)
	{
		port.Format(TEXT("COM%d:"), i+1);
		m_CmbPort.AddString(port);
	}

#else
//	char *port[]={"COM1", "COM2", "COM3", "COM4", "COM5", "COM6"};
	for( i=0; i<64; i++)
	{
		port.Format(TEXT("COM%d"), i+1);
		m_CmbPort.AddString(port);
	}
#endif

	char *baud[]={"2400", "4800", "9600", "19200", "38400", "57600", "115200"};
	for( i=0; i<7; i++)
	{
		m_CmbBaud.AddString((CString)baud[i]);
	}
	m_CmbPort.SetCurSel(0);
#ifdef UNDER_CE
	m_CmbPort.SetCurSel(1);
#endif
	m_CmbBaud.SetCurSel(m_CmbBaud.GetCount()-1);

	/* 俊叼飘冠胶 棺 滚瓢 檬扁拳 */
	m_fConnect = FALSE;
	m_DataSize = 2048;
	m_BlockSize = 256;
	m_RepeatTerm = 1000;
	m_RepeatTime = 10;
	m_RepeatCount = 3;
	m_Afc = FALSE;

	OnBnClickedRdorepeat();
	((CButton *)GetDlgItem(IDC_RDOREPEAT))->SetCheck(TRUE);

	((CButton *)GetDlgItem(IDC_BTNSEND))->EnableWindow(FALSE);
	((CButton *)GetDlgItem(IDC_BTNREAD))->EnableWindow(FALSE);

	/* 胶巧 牧飘费 汲沥. */
	UDACCEL accel[] = {{0,1}};
	m_SpnTime.SetRange32(0, MAX_INT);
	m_SpnTime.SetAccel(1, accel);
	m_SpnCount.SetRange32(0, MAX_INT);
	m_SpnTime.SetAccel(1, accel);

	UDACCEL accel1[] = {{0,100}};
	m_SpnTerm.SetRange32(0, MAX_INT);
	m_SpnTerm.SetAccel(1, accel1);

	pRead = new CQueue(1024);
	pWrite = new CQueue(512);

	m_ResultBuff = (wchar_t *)LocalAlloc(LPTR, sizeof(wchar_t) * MSG_BUFF_SIZE);
	m_ErrorBuff = (wchar_t *)LocalAlloc(LPTR, sizeof(wchar_t) * MSG_BUFF_SIZE);
	/* 肺弊颇老 坷锹 */
	logFile = fopen("SerialLog.txt", "a");
	errorFile = fopen("ErrorLog.txt", "a");


	UpdateData(FALSE);

	return TRUE;  // 器目胶甫 牧飘费俊 汲沥窍瘤 臼栏搁 TRUE甫 馆券钦聪促.
}

void CSerialTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if( nID == SC_CLOSE)
	{
		OnFileExit();		
	}
	else if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// 措拳 惑磊俊 弥家拳 窜眠甫 眠啊且 版快 酒捞能阑 弊府妨搁
//  酒贰 内靛啊 鞘夸钦聪促. 巩辑/轰 葛胆阑 荤侩窍绰 MFC 览侩 橇肺弊伐狼 版快俊绰
//  橇饭烙况农俊辑 捞 累诀阑 磊悼栏肺 荐青钦聪促.
#ifndef UNDER_CE
void CSerialTestDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 弊府扁甫 困茄 叼官捞胶 牧咆胶飘

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 努扼捞攫飘 荤阿屈俊辑 酒捞能阑 啊款单俊 嘎娩聪促.
		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;

		// 酒捞能阑 弊赋聪促.
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}
#endif
// 荤侩磊啊 弥家拳等 芒阑 掺绰 悼救俊 目辑啊 钎矫登档废 矫胶袍俊辑
//  捞 窃荐甫 龋免钦聪促.
HCURSOR CSerialTestDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

LRESULT CSerialTestDlg::OnUpdateScreen(WPARAM wParam, LPARAM lParam)
{
	UpdateData(false);
	m_EdtResult.LineScroll(MAX_INT);
	m_EdtError.LineScroll(MAX_INT);

	return 0;
}


void CSerialTestDlg::LogMessage(CString *message,  BOOL error)
{
	if( wcslen(m_ResultBuff) + message->GetLength() + 1 > MSG_BUFF_SIZE )
		wcscpy(m_ResultBuff, m_ResultBuff + wcslen(m_ResultBuff)-1024);

	wcscat(m_ResultBuff, LPCTSTR(*message));
	
	if(wcslen(m_ResultBuff) > MAX_CHAR)
		m_EdtResult.SetWindowTextW( m_ResultBuff + wcslen(m_ResultBuff) - MAX_CHAR);
	else
		m_EdtResult.SetWindowTextW( m_ResultBuff );

	fwprintf(logFile, TEXT("%s"), *message);

	if(error == TRUE)
	{
		if( wcslen(m_ErrorBuff) + message->GetLength() + 1 > MSG_BUFF_SIZE )
			wcscpy(m_ErrorBuff, m_ErrorBuff + wcslen(m_ErrorBuff)-1024);

		wcscat(m_ErrorBuff, LPCTSTR(*message));

		if(wcslen(m_ErrorBuff) > MAX_CHAR)
			m_EdtError.SetWindowTextW( m_ErrorBuff + wcslen(m_ErrorBuff) - MAX_CHAR);
		else
			m_EdtError.SetWindowTextW( m_ErrorBuff );
		
		CString time;
		GetTimeText(&time);
//		m_errorLog = *message + m_errorLog;
		fwprintf(errorFile, TEXT("Error Occured At %s\r\n"), time);
		fwprintf(errorFile, TEXT("%s"), *message);
	}
	::SendMessage(GetSafeHwnd(), WM_UPDATE, NULL, NULL);
}

void CSerialTestDlg::OnFileExit()
{
	// TODO: 咯扁俊 疙飞 贸府扁 内靛甫 眠啊钦聪促.
	OnBnClickedBtnquit();
}

void CSerialTestDlg::OnAboutAbout()
{
	// TODO: 咯扁俊 疙飞 贸府扁 内靛甫 眠啊钦聪促.
	CAboutDlg about;
	about.DoModal();
}



void CSerialTestDlg::OnBnClickedBtnquit()
{
	// TODO: 咯扁俊 牧飘费 舅覆 贸府扁 内靛甫 眠啊钦聪促.
	if(m_fConnect == TRUE)
		ClosePort();

	fclose(logFile);
	fclose(errorFile);

	LocalFree(m_ResultBuff);
	LocalFree(m_ErrorBuff);
	delete pRead;
	delete pWrite;

	OnOK();
//	::SendMessage(GetSafeHwnd(), WM_CLOSE, NULL, NULL);	
}

void CSerialTestDlg::OnBnClickedBtnconnect()
{

	if(m_fConnect == FALSE)
		OpenPort();
	else if(m_fConnect == TRUE)
		ClosePort();
}


void CSerialTestDlg::OnCbnSelchangeCmbport()
{
	// TODO: 咯扁俊 牧飘费 舅覆 贸府扁 内靛甫 眠啊钦聪促.
	CButton *pAfc = (CButton *)GetDlgItem(IDC_CHKAFC);
	if(m_CmbPort.GetCurSel() < 2)
		pAfc->EnableWindow(TRUE);
	else
	{
		pAfc->EnableWindow(FALSE);
		m_Afc = FALSE;
	}

	UpdateData(false);
}

void CSerialTestDlg::OnBnClickedRdorepeat()
{
	// TODO: 咯扁俊 牧飘费 舅覆 贸府扁 内靛甫 眠啊钦聪促.
	CEdit *pRepeat = (CEdit *)GetDlgItem(IDC_EDTREPEAT);
	CEdit *pTime = (CEdit *)GetDlgItem(IDC_EDTTIME);

	pRepeat->EnableWindow(TRUE);
	pTime->EnableWindow(FALSE);
	m_Repeat = REPEAT_COUNT;
	UpdateData(false);
}

void CSerialTestDlg::OnBnClickedRdotime()
{
	// TODO: 咯扁俊 牧飘费 舅覆 贸府扁 内靛甫 眠啊钦聪促.
	CEdit *pRepeat = (CEdit *)GetDlgItem(IDC_EDTREPEAT);
	CEdit *pTime = (CEdit *)GetDlgItem(IDC_EDTTIME);

	pRepeat->EnableWindow(FALSE);
	pTime->EnableWindow(TRUE);
	m_Repeat = REPEAT_TIME;
	UpdateData(false);
}


void CSerialTestDlg::OpenPort()
{
	// TODO: 咯扁俊 牧飘费 舅覆 贸府扁 内靛甫 眠啊钦聪促.
	UpdateData(TRUE);

	CString msg;
	COMMTIMEOUTS	timeouts;
	DCB				dcb;
	BOOL fResult = TRUE;

	CString port;
	m_CmbPort.GetWindowTextW(port);
	if(m_CmbPort.GetCurSel() > 8)
		port = TEXT("\\\\.\\") + port;

	int baud;
	CString sbaud;
	m_CmbBaud.GetWindowTextW(sbaud);
	baud = _wtoi(sbaud);
	
	m_hComm = CreateFile( port, 
		GENERIC_READ | GENERIC_WRITE,
		0,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 
		NULL);

	if(m_hComm == INVALID_HANDLE_VALUE)
	{
		CString msg;
		int res = GetLastError();
		msg.Format(TEXT("ERROR : Open %s port Failed. Error Code - %d\r\n"), port, res);
		LogMessage(&msg, TRUE);
		return;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -