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

📄 mainfrm.cpp

📁 一个很好的串口监视程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	else if(nID==ID_SCC_ASCSEND)	m_bAscSend=!m_bAscSend;
	else if(nID==ID_SCC_ADDENTER)	m_bAddEnter=!m_bAddEnter;
	else if(nID==ID_SCC_ADDSTX)		m_bAddStx=!m_bAddStx;
	else if(nID==ID_SCC_ADDETX)		m_bAddEtx=!m_bAddEtx;
	else if(nID==ID_SCC_ADDECHO)	m_bAddEcho=!m_bAddEcho;
	else if(nID==ID_SCC_PAUSE)		m_bPauseDis=!m_bPauseDis;
	else if(nID==ID_SCC_GONEXT)		m_bToNext=!m_bToNext;
	else if(nID==ID_SCC_READONLY)	GetView()->SetReadOnly(!GetView()->GetReadOnly());
	else if(nID==ID_SCC_SENDLINE)	
	{
		if(!SendLine(m_nCurCOM))	AfxMessageBox("报文格式不对!组合键Ctrl+Alt+P分析错误!");
	}
	else if(nID==ID_SCC_SET_OPTION)
	{
		if(IsCOMOpen())	return;
		SetCOMParam(NULL,2);
	}
	else if(nID==ID_SCC_CLEARDATA)
	{
		GetView()->ClearDatas();
		GetView()->SetMF();
	}
	else if(nID==ID_SCC_OPEN)
	{
		int nCOMNo=m_comboCOM.GetCurSel();
		if(m_ascc.IsCOMOpen(nCOMNo))
		{
			if(m_ascc.CloseCOM(nCOMNo))	EnableSCCBtn(1);
		}
		else
		{
			int nIndex=m_ascc.GetCOMIndex(nCOMNo);
			CSerialPort *psp;
			if(nIndex==-1)	psp=new CSerialPort;
			else			psp=m_ascc.GetCOM(nIndex);
			SetCOMParam(psp,0);
			if(m_ascc.OpenCOM(psp,this,nCOMNo))
			{
				EnableSCCBtn(0);
				m_nCurCOM=nCOMNo;
			}
			else
			{
				if(psp!=NULL)	delete psp;
				psp=NULL;
			}
			if(nIndex!=-1)	psp=NULL;
		}
		ReplaceBtnIcon(ID_SCC_OPEN,IsCOMOpen(nCOMNo)?m_nToolBtns+1:2);
	}
}

void CMainFrame::OnUpdateSCCCommon(CCmdUI* pCmdUI)
{
	if(pCmdUI->m_nID ==ID_VIEW_WRAP)	pCmdUI->SetCheck(GetView()->GetWrapMode());
	else if(pCmdUI->m_nID ==ID_VIEW_SCC_PORT)	pCmdUI->SetCheck(m_bSPort);
	else if(pCmdUI->m_nID ==ID_VIEW_SCC_SEND)	pCmdUI->SetCheck(m_bSSend);
	else if(pCmdUI->m_nID ==ID_VIEW_SCC_TIME)	pCmdUI->SetCheck(m_bSTime);
	else if(pCmdUI->m_nID ==ID_SCC_ASCRECV)		pCmdUI->SetCheck(m_bAscRecv);
	else if(pCmdUI->m_nID ==ID_SCC_ASCSEND)		pCmdUI->SetCheck(m_bAscSend);
	else if(pCmdUI->m_nID ==ID_SCC_GONEXT)		pCmdUI->SetCheck(m_bToNext);
	else if(pCmdUI->m_nID ==ID_SCC_READONLY)	pCmdUI->SetCheck(GetView()->GetReadOnly());
	else if(pCmdUI->m_nID ==ID_SCC_SENDLINE)	pCmdUI->Enable(IsCOMOpen());
	else if(pCmdUI->m_nID ==ID_SCC_SET_OPTION)	pCmdUI->Enable(!IsCOMOpen());
	else if(pCmdUI->m_nID ==ID_SCC_ADDENTER)
	{
		pCmdUI->Enable(m_bAscSend);
		pCmdUI->SetCheck(m_bAddEnter);
	}
	else if(pCmdUI->m_nID ==ID_SCC_ADDECHO)
	{
		pCmdUI->Enable(m_bAscSend);
		pCmdUI->SetCheck(m_bAddEcho);
	}
	else if(pCmdUI->m_nID ==ID_SCC_ADDSTX)		
	{
		pCmdUI->Enable(m_bAscSend);
		pCmdUI->SetCheck(m_bAddStx);
	}
	else if(pCmdUI->m_nID ==ID_SCC_ADDETX)		
	{
		pCmdUI->Enable(m_bAscSend);
		pCmdUI->SetCheck(m_bAddEtx);
	}
	else if(pCmdUI->m_nID ==ID_SCC_PAUSE)		
	{
		pCmdUI->SetCheck(m_bPauseDis);
		pCmdUI->SetText(m_bPauseDis?"继续报文监视(&P)":"暂停报文监视(&P)");
	}
	else if(pCmdUI->m_nID ==ID_SCC_OPEN)		
	{
		CString str;
		str.Format("COM%d",m_nCurCOM+1);
		if(IsCOMOpen())	str="关闭"+str+"(&O)";
		else	str="打开"+str+"(&O)";
		pCmdUI->SetText(str);
		str.Empty();
	}
}

void CMainFrame::DisplayStr(CString str, int nCOMIndex,BOOL bRecv,BOOL bEnter)
{
	if(m_bPauseDis)	return;
	if(!bRecv&&!m_bSSend)	return;
	if(m_dlgFilter.m_nFilter==1)
	{
		if(nCOMIndex!=m_nCurCOM)	return;
	}
	CString strtmp,str1;
	CSCCView* pView=GetView();
	if(m_bSTime)
	{
		_strtime( strtmp.GetBuffer(9) );
		strtmp.ReleaseBuffer();
	//	strtmp="["+strtmp+"] ";
		str1.Format(" %03.0d",(::GetTickCount()-m_dwMs)%1000);
		m_dwMs=::GetTickCount();
		strtmp="["+strtmp+str1+"] ";
		pView->AddString(strtmp,5);
	}
	if(m_bSPort)//↑↓
	{
		pView->AddString("COM",5);
		if(bRecv)	strtmp.Format("%d",nCOMIndex+1);
		else		strtmp.Format("%d",nCOMIndex+1);
		pView->AddString(strtmp,1);
		if(bRecv)	pView->AddString("↑",5);
		else		pView->AddString("↓",5);
	}
	strtmp.Empty();
	str1.Empty();
	str+='\n';
	pView->AddString(str,bRecv?3:4);
	pView=NULL;
}

void CMainFrame::CreateImagelist()
{
	CImageList* m_imgList1;
	m_imgList1=(m_wndToolBar.GetToolBarCtrl()).GetImageList();
	m_nToolBtns=m_imgList1->GetImageCount();
	CBitmap cbmp;
	BITMAP bmp;
//	m_imgList1.Create(IDB_BITMAP1,16,27,RGB (255, 0, 0));
	cbmp.LoadBitmap(IDR_TOOLBAR_SHELL);
	cbmp.GetBitmap(&bmp);
	m_imgList1->Add(&cbmp,RGB (192, 192, 192));
	(m_wndToolBar.GetToolBarCtrl()).SetImageList(m_imgList1);
	m_imgList1->Detach();
	m_imgList1=NULL;
	cbmp.DeleteObject();
}

void CMainFrame::ReplaceBtnIcon(UINT unID, int nNew)
{
	int nIndex=m_wndToolBar.CommandToIndex(unID);
//	m_imgList1=(m_wndToolBar.GetToolBarCtrl()).GetImageList();
//	m_imgList1->Replace(0,m_imgList1->ExtractIcon(2));
//	m_imgList1->Detach();
//	m_wndToolBar.Invalidate();
	m_wndToolBar.SetButtonInfo(nIndex,unID,TBBS_BUTTON,nNew);
/*
m_wndToolBar.LoadToolBar(IDR_MAINFRAME);
//调入新的工具栏后,调用Invalidate函数以确保使用新的位图图象重画工具栏;
m_wndToolBar.Invalidate();
CMenu cMenu;
//调用新的以IDR_NEWMENU表示的菜单资源;
cMenu.LoadMenu(IDR_MAINFRAME);
//将cMenu设置为当前菜单;
SetMenu(&cMenu);
//释放菜单句柄 cMenu.Detach();
//重画菜单条;
DrawMenuBar();
//重新绘制窗口区域;
RecalcLayout(TRUE);
	*/
}

BOOL CMainFrame::IsCOMOpen(int nCOMIndex)
{
	if(nCOMIndex==-1)	nCOMIndex=m_nCurCOM;
	int nIndex=m_ascc.GetCOMIndex(nCOMIndex);
	if(nIndex==-1)	return 0;
	return m_ascc.GetCOM(nIndex)->IsOpen();
}

CSerialPort* CMainFrame::GetCOM(int nCOMIndex)
{
	if(nCOMIndex==-1)	nCOMIndex=m_nCurCOM;
	int nIndex=m_ascc.GetCOMIndex(nCOMIndex);
	if(nIndex==-1)	return NULL;
	return m_ascc.GetCOM(nIndex);
}

void CMainFrame::RecvSCCMsg(WPARAM wParam, LPARAM lParam)
{
	LPBYTE lpbtBuffer = (LPBYTE)::GlobalLock((HGLOBAL)wParam);
	WORD lPortNo=LOWORD(lParam);
	WORD lLength=HIWORD(lParam);
	//======
	CString str;
	m_bFilter=0;
	if(m_bAscRecv)	
	{
		str=((CString)lpbtBuffer).Left (lLength);
		m_bFilter=1;
	}
	else	
	{
		if(IsFilterFrame(lpbtBuffer,lLength))
		{
			str=CSCCTools::HexToStr(lpbtBuffer,lLength);
			m_bFilter=1;
		}	
	}
	if(m_bFilter)	DisplayStr(str,lPortNo);

	Transmits(lPortNo,lpbtBuffer,lLength);
	if(m_bTrigger)
	{
		int nl=IsTriggerLine(str);
		if(nl!=-1)
		{
			if(m_dlgSend.m_unTrigger==0)	
				SendLine(lPortNo,m_dlgSend.Trigger[nl].unTrigger-1);
			else	
			{
				m_btTrigger=nl;
				m_btTriggerCOM=(BYTE)lPortNo;
				SetTimer(102,m_dlgSend.m_unTrigger,NULL);
			}
		}
	}
	str.Empty();
	::GlobalUnlock((HGLOBAL)wParam);
}

int CMainFrame::AscSendAdd(CString &str)
{
	if(m_bAscSend)	
	{
		if(m_bAddStx)	str=(TCHAR)0x02+str;
		if(m_bAddEtx)	str+=(TCHAR)0x03;
		if(m_bAddEnter)	str+='\r';//str+=(TCHAR)0x0D;
		if(m_bAddEcho)	str+='\n';
	}
	return str.GetLength();
}

BOOL CMainFrame::SendLine(int nCOMIndex, int nLineIndex)
{
	if(!IsCOMOpen(nCOMIndex))	return 1;
	CString str;
	int nlength=m_wndSF.m_xrec.GetLineStr(str,nLineIndex);
	if(str.IsEmpty())	
	{
//		AfxMessageBox("空行!");
		m_wndSF.m_xrec.SetFocus();
		return 0;
	}
	if(m_bAscSend)
	{
		AscSendAdd(str);
		DisplayStr(str,nCOMIndex,0);
		GetCOM(nCOMIndex)->WriteData(str);
		if(m_bToNext)	m_wndSF.m_xrec.GotoLine(1,nLineIndex);
		return 1;
	}
	if(!m_wndSF.m_xrec.IsHexFormat(str) )
	{
//		AfxMessageBox("格式不对!组合键Ctrl+Alt+P分析错误!");
		m_wndSF.m_xrec.SetFocus();
		return 0;
	}
		BYTE btData[MAX_SCC_SEND_LEN];
		int nBytes=m_wndSF.m_xrec.StrToHex(str,btData);
		DisplayStr(str,nCOMIndex,0);
		GetCOM(nCOMIndex)->WriteData(btData,nBytes);	
		if(m_bToNext)	m_wndSF.m_xrec.GotoLine(1,nLineIndex);
		return 1;
}

void CMainFrame::OnSCCCS(UINT nID)
{
	if(nID==ID_CS_ADDSUM)		m_wndSF.m_xrec.CheckSum(4);
	if(nID==ID_CS_ADDSUMWORD)	m_wndSF.m_xrec.CheckSum(5);
	if(nID==ID_CS_MODBUS)		m_wndSF.m_xrec.CheckSum(0);
	if(nID==ID_CS_CRC_CCITT16)	m_wndSF.m_xrec.CheckSum(1);
	if(nID==ID_CS_CRC_CCITT8)	m_wndSF.m_xrec.CheckSum(2);
	if(nID==ID_CS_CRC_ANSI16)	m_wndSF.m_xrec.CheckSum(3);

}

void CMainFrame::OnUpdateSCCCS(CCmdUI* pCmdUI)
{
	pCmdUI->Enable(m_wndSF.IsVisible());
}

BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	switch(pMsg->message)
	{
	case WM_KEYDOWN:
		if(IsCASDown(4))//ctrl+alt
		{
			switch (pMsg->wParam)
			{  
			case 'C':
				m_comboCOM.SetFocus();
				return TRUE;
			case 'S':
				m_wndSF.m_xrec.SetFocus();
				return TRUE;
			}
		}
		break;
	}
	
	return CGuiFrameWnd::PreTranslateMessage(pMsg);
}

BOOL CMainFrame::IsCASDown(int nFlag)
{
	if(nFlag==0)		return (::GetKeyState(VK_CONTROL) < 0);
	else if(nFlag==1)	return (::GetKeyState(VK_MENU) < 0);
	else if(nFlag==2)	return (::GetKeyState(VK_SHIFT) < 0);
	else if(nFlag==3)	
	{
		return	(::GetKeyState(VK_CONTROL) < 0)&&(::GetKeyState(VK_MENU) >= 0)
			&&(::GetKeyState(VK_SHIFT) >= 0);
	}
	else if(nFlag==4)	
	{
		return	(::GetKeyState(VK_CONTROL)<0)&&(::GetKeyState(VK_MENU)  <  0)
			&&(::GetKeyState(VK_SHIFT) >= 0);
	}
	return 0;
}

void CMainFrame::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	switch(nIDEvent)
	{
	case 101:
		{
			int nLine=-1;
			if(m_dlgSend.m_nCycMode==0)
			{
				if(m_dlgSend.m_nCycSel==1)	nLine=m_dlgSend.m_unLine-1;
			}
			else
			{
				nLine=m_unMulti-1;
				m_unMulti++;		
				if(m_unMulti>m_dlgSend.m_unEnd)	m_unMulti=m_dlgSend.m_unStart;
			}
			if(!SendLine(m_nCurCOM,nLine))
			{
				KillTimer(m_unCycTimer);

⌨️ 快捷键说明

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