📄 ysfttydlg.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 + -