📄 serialtestdlg.cpp
字号:
// 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 + -