📄 chuankoudlg.cpp
字号:
// ChuankouDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Chuankou.h"
#include "ChuankouDlg.h"
#include "SIPAPI.H"
#include "Baue.h"
#include "About.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define TASKBAR_ICON WM_USER+0x111
/////////////////////////////////////////////////////////////////////////////
// CChuankouDlg dialog
CChuankouDlg::CChuankouDlg(CWnd* pParent /*=NULL*/)
: CDialog(CChuankouDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CChuankouDlg)
m_16 = FALSE;
m_strRecv = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CChuankouDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CChuankouDlg)
DDX_Check(pDX, IDC_CHECK1, m_16);
DDX_Text(pDX, IDC_EDIT1, m_strRecv);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CChuankouDlg, CDialog)
//{{AFX_MSG_MAP(CChuankouDlg)
ON_BN_CLICKED(IDC_BUTTON_EXIT, OnButtonExit)
ON_BN_CLICKED(IDC_BUTTON_RESET, OnButtonReset)
ON_BN_CLICKED(IDC_BUTTON_SEND, OnButtonSend)
ON_BN_CLICKED(IDC_BUTTON_CLOSE, OnButtonClose)
ON_BN_CLICKED(IDC_BUTTON_OPEN, OnButtonOpen)
ON_BN_CLICKED(IDC_CHECK1, OnCheck1)
ON_EN_SETFOCUS(IDC_EDIT2, OnSetfocusEdit2)
ON_EN_KILLFOCUS(IDC_EDIT2, OnKillfocusEdit2)
ON_EN_SETFOCUS(IDC_EDIT5, OnSetfocusEdit5)
ON_EN_KILLFOCUS(IDC_EDIT5, OnKillfocusEdit5)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
ON_BN_CLICKED(IDC_BUTTON_SEND2, OnButtonSend2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CChuankouDlg message handlers
BOOL CChuankouDlg::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
CenterWindow(GetDesktopWindow()); // center to the hpc screen
ShowWindow(SW_MAXIMIZE);//全屏显示
//SW_HIDE 隐藏窗口,活动状态给令一个窗口
//SW_MINIMIZE 最小化窗口,活动状态给令一个窗口
//SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态
//SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
//SW_SHOWMAXIMIZED 最大化窗口,并将其激活
//SW_SHOWMINIMIZED 最小化窗口,并将其激活
//SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口
//SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口
//SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口
//SW_SHOWNORMAL 与SW_RESTORE相同
m_Cortrol1=false;
m_Cortrol2=false;
m_dis=false;
m_hComm1 = INVALID_HANDLE_VALUE;
m_hComm2 = INVALID_HANDLE_VALUE;
OnButtonReset();
/*
NOTIFYICONDATA nd ;
nd.cbSize = sizeof(NOTIFYICONDATA);
nd.hWnd = m_hWnd ;
nd.uID = 1 ;
nd.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ;
nd.uCallbackMessage = TASKBAR_ICON ;
nd.hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
lstrcpy(nd.szTip,_T("serial port"));
Shell_NotifyIcon(NIM_ADD,&nd);
// CAbout dlg;
// dlg.Create(IDD_DIALOG_ABOUT,NULL);
// dlg.GetWindowRect(&m_rect);
// CenterWindow();
// SetTimer(1,500,NULL);
*/ return TRUE; // return TRUE unless you set the focus to a control
}
void CChuankouDlg::OnButtonExit()
{
if(m_Cortrol1 && m_Cortrol2)
{
OnButtonClose();
}
CDialog::OnOK();
exit(1);
}
void CChuankouDlg::OnButtonReset()
{ con1=0;
m_len1=0;
con2=0;
m_len2=0;
//((CEdit*)GetDlgItem(IDC_EDIT1))->SetWindowText(_T(""));
//((CEdit*)GetDlgItem(IDC_EDIT2))->SetWindowText(_T(""));
((CEdit*)GetDlgItem(IDC_EDIT3))->SetWindowText(_T("0"));
((CEdit*)GetDlgItem(IDC_EDIT4))->SetWindowText(_T("0"));
((CEdit*)GetDlgItem(IDC_EDIT6))->SetWindowText(_T("0"));
((CEdit*)GetDlgItem(IDC_EDIT7))->SetWindowText(_T("0"));
}
void CChuankouDlg::OnButtonSend()
{
if(!m_Cortrol1)
{
AfxMessageBox(_T("串口没有打开!"));
return;
}
BYTE *pData;
UpdateData(true);
((CEdit*)GetDlgItem(IDC_EDIT2))->GetWindowText(m_strSend);
if(m_strSend==_T(""))
{
return;
}
if(m_16)
{
CByteArray hexdata;
int len=String2Hex(m_strSend,hexdata);
bufLen=len;
pData=new BYTE[len];
for(int k=0;k<len;k++)
{
pData[k]= hexdata[k];
}
}else{
bufLen = m_strSend.GetLength()*2;
pData = new BYTE(bufLen);
CopyMemory(pData,m_strSend.GetBuffer(m_strSend.GetLength()),bufLen);
}
con1+=bufLen;
if (!WritePort(m_hComm1,pData,bufLen))
{
AfxMessageBox(L"写串口失败\r\n\r请检查串口连接!");
ClosePort1();
return;
}
delete pData;
pData=NULL;
CString LEN;
LEN.Format(_T("%d"),con1);
((CEdit*)GetDlgItem(IDC_EDIT3))->SetWindowText(LEN);
//ReadPort();
}
/*
void CChuankouDlg::ReadPort()
{
BYTE *pData;
pData=new BYTE[bufLen];
if (!m_ceSeries.ReadPort(m_ceSeries.m_hComm,pData,bufLen))
{
AfxMessageBox(L"读串口失败\r\n\r请检查串口连接!");
m_ceSeries.ClosePort();
return;
}
CString str;
str.Format(_T("%s"),pData);
UpdateData(true);
if(m_16)
{
CByteArray hexdata;
int len=String2Hex(str,hexdata);
//bufLen=len;
pData=new BYTE[len];
for(int k=0;k<len;k++)
{
pData[k]= hexdata[k];
}
CString str1;
str1.Format(_T("%s"),pData);
str=str1;
}
((CEdit*)GetDlgItem(IDC_EDIT1))->SetWindowText(str);
delete pData;
pData=NULL;
return;
}
*/
void CChuankouDlg::OnButtonClose()
{
ClosePort1();
ClosePort2();
((CButton*)GetDlgItem(IDC_BUTTON_CLOSE))->EnableWindow(false);
((CButton*)GetDlgItem(IDC_BUTTON_OPEN))->EnableWindow(true);
m_Cortrol1=false;
m_Cortrol2=false;
}
void CChuankouDlg::OnButtonOpen()
{
CBaue dlg;
if (dlg.DoModal() == IDOK)
{
if (!OpenPort1(this,1,dlg.m_baud,0,8,0))
{
MessageBox(L"Open Series port1 failed!",L"error",MB_ICONEXCLAMATION);
return;
}
if (!OpenPort2(this,2,dlg.m_baud,0,8,0))
{
MessageBox(L"Open Series port2 failed!",L"error",MB_ICONEXCLAMATION);
return;
}
}
((CButton*)GetDlgItem(IDC_BUTTON_OPEN))->EnableWindow(false);
((CButton*)GetDlgItem(IDC_BUTTON_CLOSE))->EnableWindow(true);
m_Cortrol1=true;
m_Cortrol2=true;
// OpenThind(this);
}
int CChuankouDlg::String2Hex(CString str, CByteArray &senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.GetLength();
senddata.SetSize(len/2);
for(int i=0;i<len;)
{
TCHAR lstr,hstr=str.GetAt(i);
if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
// AfxMessageBox(str[i]);
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return hexdatalen;
}
char CChuankouDlg::ConvertHexChar(TCHAR ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10;
else return(-1);
}
void CChuankouDlg::OnSeriesRead1(CWnd* pWnd,BYTE* buf,int bufLen)
{
CString str,str1,str2;
//BYTE *pData;
CChuankouDlg *pDlg = (CChuankouDlg *)pWnd;
CEdit * pEdit;
pEdit = (CEdit*)pDlg->GetDlgItem(IDC_EDIT1);
CEdit * pEdit2;
pEdit2 = (CEdit*)pDlg->GetDlgItem(IDC_EDIT4);
CString strRecv;//
pDlg->m_len1+=bufLen;
if(pDlg->m_dis)
{
for(int k=0;k<bufLen;k++)
{
//if(k!=0 && k%8==0)
//{
//strRecv+=_T("\r\n");
//}
str1.Format(_T("%02x "),buf[k]);
strRecv+=str1;
}
AfxMessageBox(strRecv);
}
else{
strRecv = (char*)buf;
}
str2.Format(_T("%d"),pDlg->m_len1);
CString strOld;
pEdit->GetWindowText(strOld);
pEdit->SetWindowText(strOld + strRecv);
pEdit2->SetWindowText(str2);
delete[] buf;
}
void CChuankouDlg::OnSeriesRead2(CWnd* pWnd,BYTE* buf,int bufLen)
{
CString str,str1,str2;
//BYTE *pData;
CChuankouDlg *pDlg = (CChuankouDlg *)pWnd;
CEdit * pEdit;
pEdit = (CEdit*)pDlg->GetDlgItem(IDC_EDIT8);
CEdit * pEdit2;
pEdit2 = (CEdit*)pDlg->GetDlgItem(IDC_EDIT7);
CString strRecv;//
pDlg->m_len2+=bufLen;
if(pDlg->m_dis)
{
for(int k=0;k<bufLen;k++)
{
//if(k!=0 && k%8==0)
//{
//strRecv+=_T("\r\n");
//}
str1.Format(_T("%02x "),buf[k]);
strRecv+=str1;
}
AfxMessageBox(strRecv);
}
else{
strRecv = (char*)buf;
}
str2.Format(_T("%d"),pDlg->m_len2);
CString strOld;
pEdit->GetWindowText(strOld);
pEdit->SetWindowText(strOld + strRecv);
pEdit2->SetWindowText(str2);
delete[] buf;
}
BOOL CChuankouDlg::OpenPort1(CWnd* pPortOwner,
UINT portNo , /*串口号*/
UINT baud , /*波特率*/
UINT parity , /*奇偶校验*/
UINT databits , /*数据位*/
UINT stopbits /*停止位*/
)
{
DCB commParam;
TCHAR szPort[15];
// 已经打开的话,直接返回
if (m_hComm1 != INVALID_HANDLE_VALUE)
{
return TRUE;
}
ASSERT(pPortOwner != NULL);
ASSERT(portNo > 0 && portNo < 5);
//设置串口名
wsprintf(szPort, L"COM%d:", portNo);
//打开串口
m_hComm1 = CreateFile(
szPort,
GENERIC_READ | GENERIC_WRITE, //允许读和写
0, //独占方式(共享模式)
NULL,
OPEN_EXISTING, //打开而不是创建(创建方式)
0,
NULL
);
if (m_hComm1 == INVALID_HANDLE_VALUE)
{
// 无效句柄,返回。
TRACE(_T("CreateFile 返回无效句柄"));
return FALSE;
}
// 得到打开串口的当前属性参数,修改后再重新设置串口。
// 设置串口的超时特性为立即返回。
if (!GetCommState(m_hComm1,&commParam))
{
return FALSE;
}
commParam.BaudRate = baud; // 设置波特率
commParam.fBinary = TRUE; // 设置二进制模式,此处必须设置TRUE
commParam.fParity = TRUE; // 支持奇偶校验
commParam.ByteSize = databits; // 数据位,范围:4-8
commParam.Parity = NOPARITY; // 校验模式
commParam.StopBits = stopbits; // 停止位
commParam.fOutxCtsFlow = FALSE; // No CTS output flow control
commParam.fOutxDsrFlow = FALSE; // No DSR output flow control
commParam.fDtrControl = DTR_CONTROL_ENABLE;
// DTR flow control type
commParam.fDsrSensitivity = FALSE; // DSR sensitivity
commParam.fTXContinueOnXoff = TRUE; // XOFF continues Tx
commParam.fOutX = FALSE; // No XON/XOFF out flow control
commParam.fInX = FALSE; // No XON/XOFF in flow control
commParam.fErrorChar = FALSE; // Disable error replacement
commParam.fNull = FALSE; // Disable null stripping
commParam.fRtsControl = RTS_CONTROL_ENABLE;
// RTS flow control
commParam.fAbortOnError = FALSE; // 当串口发生错误,并不终止串口读写
if (!SetCommState(m_hComm1, &commParam))
{
TRACE(_T("SetCommState error"));
return FALSE;
}
//设置串口读写时间
COMMTIMEOUTS CommTimeOuts;
GetCommTimeouts (m_hComm1, &CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout = MAXDWORD;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 10;
CommTimeOuts.WriteTotalTimeoutConstant = 1000;
if(!SetCommTimeouts( m_hComm1, &CommTimeOuts ))
{
TRACE( _T("SetCommTimeouts 返回错误") );
return FALSE;
}
m_pPortOwner = pPortOwner;
//指定端口监测的事件集
SetCommMask (m_hComm1, EV_RXCHAR);
//分配设备缓冲区
SetupComm(m_hComm1,1024,1024);
//初始化缓冲区中的信息
PurgeComm(m_hComm1,PURGE_TXCLEAR|PURGE_RXCLEAR);
m_hReadCloseEvent1 = CreateEvent(NULL,TRUE,FALSE,NULL);
// m_hWriteCloseEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
//创建读串口线程
m_hReadThread1 = CreateThread(NULL,0,ReadThreadFunc1,this,0,&m_dwReadThreadID);
//创建写串口线程
// m_hWriteThread = CreateThread(NULL,0,WriteThreadFunc,this,0,&m_dwWriteThreadID);
TRACE(_T("串口打开成功"));
return TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -