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

📄 ysfttydlg.cpp

📁 windows mobile ppc5.0 mfc 编制的串口测试程序
💻 CPP
字号:
// YsfTTYDlg.cpp : 实现文件
//
//************************************************
//项目:YsfTTYDlg 
//文件名:YsfTTYDlg.cpp 
//功能:wm5串口终端主程序
//日期:2008/07/28
//版权:Copyright (C) 2008
//作者:杨世峰
//
//修改备注
//...
//************************************************


#include "stdafx.h"
#include "YsfTTY.h"
#include "YsfTTYDlg.h"
#include "Serial.h"
#include "DlgCommSet.h"
#include "DlgAbout.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

const DWORD dwAdornmentFlags = 0; // 退出按钮
extern DWORD dwBaudRates[];

// CYsfTTYDlg 对话框

CYsfTTYDlg::CYsfTTYDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CYsfTTYDlg::IDD, pParent)
	, m_bConnected(FALSE)
	, m_szSend(_T("AT"))
	, m_bAdd1310(TRUE)
	, m_nCommNo(0)//comm1
	, m_nBaut(1)//9600
	, m_nParity(0)//无
	, m_nDataBits(0)//8
	, m_nStopBits(0)//1
	, m_nShakeHand(0)//无
	, m_szRecvShow(_T(""))
	, m_nTimerCount(0)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CYsfTTYDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDT_SEND, m_szSend);
	DDX_Check(pDX, IDC_CHECK_1310, m_bAdd1310);
	DDX_Text(pDX, IDC_EDT_RECV, m_szRecvShow);
}

BEGIN_MESSAGE_MAP(CYsfTTYDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
	ON_WM_SIZE()
#endif
	//}}AFX_MSG_MAP
	ON_COMMAND(ID_MENU_COMMLINK, &CYsfTTYDlg::OnMenuCommlink)
	ON_COMMAND(ID_MENU_COMMUNLINK, &CYsfTTYDlg::OnMenuCommunlink)
	ON_COMMAND(ID_MENU_COMMSET, &CYsfTTYDlg::OnMenuCommset)
	ON_UPDATE_COMMAND_UI(ID_MENU_COMMLINK, &CYsfTTYDlg::OnUpdateMenuCommlink)
	ON_UPDATE_COMMAND_UI(ID_MENU_COMMUNLINK, &CYsfTTYDlg::OnUpdateMenuCommunlink)
	ON_COMMAND(ID_APP_ABOUT, &CYsfTTYDlg::OnAppAbout)
	ON_BN_CLICKED(IDC_BTN_COMMLINK, &CYsfTTYDlg::OnBnClickedBtnCommlink)
	ON_BN_CLICKED(IDC_BTN_COMMUNLINK, &CYsfTTYDlg::OnBnClickedBtnCommunlink)
	ON_BN_CLICKED(IDC_BTN_COMMSET, &CYsfTTYDlg::OnBnClickedBtnCommset)

	ON_MESSAGE(WM_COMM_RECV,OnMyRecv)
	ON_BN_CLICKED(IDC_BTN_CLEARRECV, &CYsfTTYDlg::OnBnClickedBtnClearrecv)
	ON_WM_TIMER()
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_BTN_SEND, &CYsfTTYDlg::OnBnClickedBtnSend)
	ON_BN_CLICKED(IDC_CHECK_1310, &CYsfTTYDlg::OnBnClickedCheck1310)
	ON_EN_CHANGE(IDC_EDT_SEND, &CYsfTTYDlg::OnEnChangeEdtSend)
END_MESSAGE_MAP()


// CYsfTTYDlg 消息处理程序

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

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	if (!m_wndCommandBar.Create(this) 
		|| !m_wndCommandBar.InsertMenuBar(IDR_MENU_MAIN)
		|| !m_wndCommandBar.AddAdornments(dwAdornmentFlags)
		//|| !m_wndCommandBar.LoadToolBar(IDR_TOOLBAR_MAIN)
		)
	{
		TRACE0("未能创建 CommandBar\n");
		return -1;      // 未能创建
	}
	m_wndCommandBar.SetBarStyle(m_wndCommandBar.GetBarStyle() | CBRS_SIZE_FIXED);

	TBBUTTONINFO tbbi = {0};
	tbbi.cbSize = sizeof(tbbi);

	tbbi.dwMask = TBIF_LPARAM | TBIF_BYINDEX;

	::SendMessageW(m_wndCommandBar.m_hCommandBar, TB_GETBUTTONINFO,0, (LPARAM)&tbbi); 
	this->m_hMenu = (HMENU)tbbi.lParam;
	
	::EnableMenuItem(m_hMenu, ID_MENU_COMMUNLINK, MF_BYCOMMAND | MF_GRAYED);	

	this->GetDlgItem(IDC_BTN_COMMUNLINK)->EnableWindow(FALSE);

	this->SetTimer(1,1000,NULL);

	BYTE btDataBits;
	switch(this->m_nDataBits)
	{
	case 0:
		btDataBits = 8;
		break;
	default:
		btDataBits = 8;
	}
	CString strStop;
	switch(this->m_nStopBits)
	{
	case 0:
		strStop = TEXT("1");
		break;
	case 1:
		strStop = TEXT("1.5");
		break;
	case 2:
		strStop = TEXT("2");
		break;
	}
	CString str;
	str.Format(TEXT("COMM%d,BAUD:%d,%d,%d,%s,%d"),this->m_nCommNo+1,
		dwBaudRates[this->m_nBaut],this->m_nParity,
		btDataBits,strStop,this->m_nShakeHand);
	this->SetStatue(str);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CYsfTTYDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
	if (AfxIsDRAEnabled())
	{
		DRA::RelayoutDialog(
			AfxGetResourceHandle(), 
			this->m_hWnd, 
			DRA::GetDisplayMode() != DRA::Portrait ? 
			MAKEINTRESOURCE(IDD_YSFTTY_DIALOG_WIDE) : 
			MAKEINTRESOURCE(IDD_YSFTTY_DIALOG));
	}
}
#endif

void CYsfTTYDlg::OnMenuCommlink()
{
	// TODO: 在此添加命令处理程序代码
	PARITY parity;
	switch(this->m_nParity)
	{
	case 0:
		parity = PT_NONE;
		break;
	case 1:
		parity = PT_ODD;
		break;
	case 2:
		parity = PT_EVEN;
		break;
	default:
		parity = PT_NONE;
	}

	BYTE btDataBits;
	switch(this->m_nDataBits)
	{
	case 0:
		btDataBits = 8;
		break;
	default:
		btDataBits = 8;
	}
	STOPBITS stopbits;
	switch(this->m_nStopBits)
	{
	case 0:
		stopbits = SB_ONE;
		break;
	case 1:
		stopbits = SB_ONEPOINTFIVE;
		break;
	case 2:
		stopbits = SB_TWO;
		break;
	default:
		stopbits = SB_ONE;
	}
	FLOWCONTROL fc;
	switch(this->m_nShakeHand)
	{
	case 0:
		fc = FC_NONE;
		break;
	case 1:
		fc = FC_RTSCTS;
		break;
	case 2:
		fc = FC_XONXOFF;
		break;
	default:
		fc = FC_NONE;
	}
	this->m_bConnected = this->m_SerialMain.Comm_Open(this->m_nCommNo+1,
		dwBaudRates[this->m_nBaut],
		parity,
		btDataBits,
		stopbits,
		fc
		);
	if(this->m_bConnected)
	{
		this->m_SerialMain.Comm_SetWnd(this->m_hWnd);
		::EnableMenuItem(this->m_hMenu, ID_MENU_COMMLINK,MF_BYCOMMAND | MF_GRAYED);
		::EnableMenuItem(this->m_hMenu, ID_MENU_COMMUNLINK,MF_BYCOMMAND | MF_ENABLED);
		::EnableMenuItem(this->m_hMenu, ID_MENU_COMMSET,MF_BYCOMMAND | MF_GRAYED);
		this->GetDlgItem(IDC_BTN_COMMLINK)->EnableWindow(FALSE);
		this->GetDlgItem(IDC_BTN_COMMUNLINK)->EnableWindow(TRUE);
		this->GetDlgItem(IDC_BTN_COMMSET)->EnableWindow(FALSE);
		//生成串口线程
		if(::CreateThread(NULL,0,CommReadThread,&this->m_SerialMain,0,NULL)==NULL)
		{
			this->MessageBox(TEXT("生成串口线程失败!"));
			this->OnMenuCommunlink();
		}
		else
		{
			::CloseHandle(this->m_hCommThread);
		}
		this->m_nTimerCount = 0;
		
		CString str;
		CString strStop;
		switch(this->m_nStopBits)
		{
		case 0:
			strStop = TEXT("1");
			break;
		case 1:
			strStop = TEXT("1.5");
			break;
		case 2:
			strStop = TEXT("2");
			break;
		}
		str.Format(TEXT("COMM%d,BAUD:%d,%d,%d,%s,%d"),this->m_nCommNo+1,
					dwBaudRates[this->m_nBaut],this->m_nParity,
					btDataBits,strStop,this->m_nShakeHand);
		this->SetStatue(str);
	}
}

void CYsfTTYDlg::OnMenuCommunlink()
{
	// TODO: 在此添加命令处理程序代码
	this->m_SerialMain.Comm_Close();
	this->m_bConnected = FALSE;
	::Sleep(100);//等待串口读线程退出
	::EnableMenuItem(this->m_hMenu, ID_MENU_COMMUNLINK, MF_BYCOMMAND | MF_GRAYED);
	::EnableMenuItem(this->m_hMenu, ID_MENU_COMMLINK, MF_BYCOMMAND | MF_ENABLED);
	::EnableMenuItem(this->m_hMenu, ID_MENU_COMMSET, MF_BYCOMMAND | MF_ENABLED);
	this->GetDlgItem(IDC_BTN_COMMLINK)->EnableWindow(TRUE);
	this->GetDlgItem(IDC_BTN_COMMUNLINK)->EnableWindow(FALSE);
	this->GetDlgItem(IDC_BTN_COMMSET)->EnableWindow(TRUE);
	this->SetStatue(TEXT("串口关闭!"));
}

void CYsfTTYDlg::OnMenuCommset()
{
	// TODO: 在此添加命令处理程序代码
	CDlgCommSet dlgCommSet;
	dlgCommSet.init(this->m_nCommNo,this->m_nBaut,this->m_nParity,
		this->m_nDataBits,this->m_nStopBits,this->m_nShakeHand);
	if(dlgCommSet.DoModal() == IDOK)
	{
		dlgCommSet.GetConfig(this->m_nCommNo,this->m_nBaut,this->m_nParity,
			this->m_nDataBits,this->m_nStopBits,this->m_nShakeHand);
		BYTE btDataBits;
		switch(this->m_nDataBits)
		{
		case 0:
			btDataBits = 8;
			break;
		default:
			btDataBits = 8;
		}
		CString strStop;
		switch(this->m_nStopBits)
		{
		case 0:
			strStop = TEXT("1");
			break;
		case 1:
			strStop = TEXT("1.5");
			break;
		case 2:
			strStop = TEXT("2");
			break;
		}
		CString str;
		str.Format(TEXT("COMM%d,BAUD:%d,%d,%d,%s,%d"),this->m_nCommNo+1,
					dwBaudRates[this->m_nBaut],this->m_nParity,
		btDataBits,strStop,this->m_nShakeHand);
		this->SetStatue(str);
	}
}

void CYsfTTYDlg::OnUpdateMenuCommlink(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
}

void CYsfTTYDlg::OnUpdateMenuCommunlink(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
}

void CYsfTTYDlg::OnAppAbout()
{
	// TODO: 在此添加命令处理程序代码
	CDlgAbout dlg;
	dlg.DoModal();
}


void CYsfTTYDlg::OnBnClickedBtnCommlink()
{
	// TODO: 在此添加控件通知处理程序代码
	this->OnMenuCommlink();
}

void CYsfTTYDlg::OnBnClickedBtnCommunlink()
{
	// TODO: 在此添加控件通知处理程序代码
	this->OnMenuCommunlink();
}

void CYsfTTYDlg::OnBnClickedBtnCommset()
{
	// TODO: 在此添加控件通知处理程序代码
	this->OnMenuCommset();
}

LRESULT CYsfTTYDlg::OnMyRecv(WPARAM wParam,LPARAM lParam)
{
	BYTE btRecv;
	
	btRecv = LOBYTE(wParam);
	
	this->RecvShow(btRecv);

	return 0;
}
void CYsfTTYDlg::RecvShow(BYTE btRecv)
{
#define MAX_SUM_CHAR 1000
	static int nCountRecved = 0;

	this->m_szRecvShow += btRecv;
	nCountRecved++;
	if(btRecv == 0x0A)//NEW LINE
		nCountRecved = 0;
	if(nCountRecved >= 30)
	{
		nCountRecved = 0;
		this->m_szRecvShow += TEXT("\r\n");
	}

	if(this->m_szRecvShow.GetLength() >= MAX_SUM_CHAR)
	{
		nCountRecved = 0;
		this->m_szRecvShow.Empty();
	}
	//不能接收到一个字符就更新,会很耗费资源
}

void CYsfTTYDlg::OnBnClickedBtnClearrecv()
{
	// TODO: 在此添加控件通知处理程序代码
	this->m_szRecvShow.Empty();
	this->m_SerialMain.Comm_Clear();
	this->UpdateData(FALSE);
}

void CYsfTTYDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if(nIDEvent == 1)
	{
		this->m_nTimerCount++;
		if(this->m_szRecvShow.GetLength())
		{
			this->UpdateData(FALSE);
			CEdit* pEdit;
			pEdit = (CEdit*)this->GetDlgItem(IDC_EDT_RECV);
			pEdit->LineScroll(pEdit->GetLineCount(),0);
		}
	}
	CDialog::OnTimer(nIDEvent);
}

void CYsfTTYDlg::OnClose()
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	this->KillTimer(1);

	CDialog::OnClose();
}

void CYsfTTYDlg::SetStatue(LPCTSTR lpStr)
{
	this->GetDlgItem(IDC_STATUE_COMM)->SetWindowTextW(lpStr);
}

void CYsfTTYDlg::OnBnClickedBtnSend()
{
	// TODO: 在此添加控件通知处理程序代码
	this->UpdateData(TRUE);
#define MAX_SEND_CHAR	256
	char szByte[MAX_SEND_CHAR];
	
	/*这里返回值nSend总是比字符数多1,估计包括了字符串结尾\0*/
	/*也就是说nSend表示需要的缓冲大小,包括字符串结尾*/
	int nSend = ::WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,this->m_szSend,
		-1,szByte,sizeof(szByte),NULL,NULL);
	if(this->m_bAdd1310)
	{
		szByte[nSend-1] = '\r';
		szByte[nSend++] = '\n';
	}
	szByte[nSend] = '\0';

	DWORD nSended = 0;
	this->m_SerialMain.Comm_Write((BYTE*)szByte,nSend,&nSended);
}

void CYsfTTYDlg::OnBnClickedCheck1310()
{
	// TODO: 在此添加控件通知处理程序代码
	this->UpdateData(TRUE);
}

void CYsfTTYDlg::OnEnChangeEdtSend()
{
	// TODO:  如果该控件是 RICHEDIT 控件,则它将不会
	// 发送该通知,除非重写 CDialog::OnInitDialog()
	// 函数并调用 CRichEditCtrl().SetEventMask(),
	// 同时将 ENM_CHANGE 标志“或”运算到掩码中。

	// TODO:  在此添加控件通知处理程序代码
	this->UpdateData(TRUE);
}

⌨️ 快捷键说明

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