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

📄 chuankoudlg.cpp

📁 自己做的EVC下串口调试软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -