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

📄 mainfrm.cpp

📁 串口收发工具
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "maintain.h"
#include "PreviewPane2.h"
#include "DataShowView.h"
#include "dlgacsii.h"
#include "MainFrm.h"
#include <afxcmn.h>

#include "manager.h"
#include "dlgacsii.h"
#include "BmpDlg.h"
#include "dlggroupaddr.h"
#include "dlgycpara.h"
#include "dlgyxpara.h"
#include "dlgykytpara.h"
#include "dlgalarmpara.h"
#include "dlgkeyboard.h"
#include "dlgacupara.h"
#include "dlgdcupara.h"
#include "dlgmsupara.h"
#include "dlgyxupara.h"
#include "dlglocalpara.h"
#include "dlgunicodechange.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
const char *ParityType[] ={"无","奇","偶"};
const char *BuadType[] = {"50","75","110","134","150","300","600","1200","1800","2400","4800","7200","9600","19200","38400","57600","115200","230400","460800","921600"};
const char *DataBitType[]={"5","6","7","8"};
const char *StopBitType[]={"1","2"};
static int nCount = 0;//计数
extern int ngyType;
extern int ngyTypeFlag;
static int nOpenComCount = 0;//程序启动时显示打开串口对话框

extern int nCurWorkStatus;
extern bool bShowData;
extern bool bSmsFlag;
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_COMMAND(ID_CALCULATOR, OnCalculator)
	ON_COMMAND(IDR_ASCII, OnAscii)
	ON_COMMAND(ID_OPENCOM, OnOpencom)
	ON_COMMAND(ID_CLOSECOM, OnClosecom)
	ON_UPDATE_COMMAND_UI(ID_OPENCOM, OnUpdateOpencom)
	ON_UPDATE_COMMAND_UI(ID_CLOSECOM, OnUpdateClosecom)
	ON_WM_SIZE()
	ON_COMMAND(IDR_GROUP, OnGroup)
	ON_WM_TIMER()
	ON_COMMAND(ID_DownCanshufile, OnDownCanshufile)
	ON_COMMAND(IDR_SETNEW_CHANGE, OnSetnewChange)
	ON_COMMAND(IDR_SETNEW_NEW, OnSetnewNew)
	ON_COMMAND(IDR_SETOLD_CHANGE, OnSetoldChange)
	ON_COMMAND(IDR_SETOLD_NEW, OnSetoldNew)
	ON_COMMAND(ID_UPLOADCANSHU_OLD, OnUploadcanshuOld)
	ON_COMMAND(ID_UPLOADCANSHU_NEW, OnUploadcanshuNew)
	ON_COMMAND(IDR_Upbmp, OnUpbmp)
	ON_COMMAND(IDR_Downbmp, OnDownbmp)
	ON_COMMAND(IDR_DownProgram, OnDownProgram)
	ON_COMMAND(IDR_DownMaintainprogram, OnDownMaintainprogram)
	ON_COMMAND(IDR_DownAcsii, OnDownAcsii)
	ON_COMMAND(IDR_DownChinese, OnDownChinese)
	ON_COMMAND(IDR_Down88, OnDown88)
	ON_COMMAND(IDR_Reset, OnReset)
	ON_COMMAND(IDR_NaturalStatus, OnNaturalStatus)
	ON_COMMAND(IDR_MaintainStatus, OnMaintainStatus)
	ON_COMMAND(IDR_KEYBOARD, OnKeyboard)
	ON_COMMAND(IDR_Clock, OnClock)
	ON_COMMAND(IDR_Yk, OnYk)
	ON_COMMAND(IDR_Yt, OnYt)
	ON_COMMAND(IDR_YcYx, OnYcYx)
	ON_COMMAND(IDR_ManualFrame, OnManualFrame)
	ON_COMMAND(IDR_UpdownLoad, OnUpdownLoad)
	ON_COMMAND(IDR_StopSend, OnStopSend)
	ON_COMMAND(IDR_GUIYUE_FDK, OnGuiyueFdk)
	ON_UPDATE_COMMAND_UI(IDR_GUIYUE_FDK, OnUpdateGuiyueFdk)
	ON_COMMAND(IDR_GUIYUE_CDT, OnGuiyueCdt)
	ON_UPDATE_COMMAND_UI(IDR_GUIYUE_CDT, OnUpdateGuiyueCdt)
	ON_COMMAND(IDR_GUIYUE_DF0420, OnGuiyueDf0420)
	ON_UPDATE_COMMAND_UI(IDR_GUIYUE_DF0420, OnUpdateGuiyueDf0420)
	ON_COMMAND(IDR_GUIYUE_DF0241, OnGuiyueDf0241)
	ON_UPDATE_COMMAND_UI(IDR_GUIYUE_DF0241, OnUpdateGuiyueDf0241)
	ON_COMMAND(IDR_GUIYUE_BUS, OnGuiyueBus)
	ON_UPDATE_COMMAND_UI(IDR_GUIYUE_BUS, OnUpdateGuiyueBus)
	ON_COMMAND(IDR_SMSSETUP, OnSmssetup)
	ON_COMMAND(IDR_UNICODE, OnUnicode)
	ON_COMMAND(IDR_SMSRESET, OnSmsreset)
	ON_COMMAND(IDR_GONGZHUANG, OnGongzhuang)
	ON_WM_DESTROY()
	ON_MESSAGE(MSG_GZWND_DESTROY,OnGzWndDestroy)
	ON_COMMAND(IDR_GUIYUE_JDXJ, OnGuiyueJdxj)
	ON_UPDATE_COMMAND_UI(IDR_GUIYUE_JDXJ, OnUpdateGuiyueJdxj)
	ON_WM_INITMENUPOPUP()
	ON_WM_MEASUREITEM()
	ON_WM_MENUCHAR()
	ON_COMMAND(ID_COMSET, OnComset)
	ON_COMMAND(IDR_QUERYALARM, OnQueryalarm)
	ON_COMMAND(IDR_ALARMERSETUP, OnAlarmersetup)
	//}}AFX_MSG_MAP
	ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnDropDown)
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_COMINFO,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
//	m_pwndTreeCtrl = NULL;
//	m_bDestroy = false;

	// TODO: add member initialization code here
	m_bOpened = FALSE;
//	m_wndProgress = NULL;
	nGroupNo = 1;
	nAddrNo =1;
	nExtFunc = 0;
	nSerialNo = 0;
	nCurRecDataLen = 0;
	nSendFileCount = 0;
	m_view = NULL;
	modbus.start_addr = 0;
	modbus.yccount = 1;
	modbus.yxcount = 1;
	m_bSkinned = false;
	dlgGongzhuang = NULL;
	bGzWndShow = false;
	bAlarm_InfWndShow = false;
}


CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this
		, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}
	//m_wndToolBar.SetButtonInfo(3, IDM_GY, TBSTYLE_BUTTON | TBSTYLE_DROPDOWN, 3);

		// 设置工具条属性

	m_wndToolBar.GetToolBarCtrl().SetButtonWidth(32, 100);
	m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
	/*
	CImageList img;
	img.Create(IDB_BITMAP1, 32, 0, RGB(255, 0, 255));
	m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);
	img.Detach();
	img.Create(IDB_BITMAP1, 32, 0, RGB(255, 0, 255));
	m_wndToolBar.GetToolBarCtrl().SetImageList(&img);
	img.Detach();
	m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT);
	m_wndToolBar.SetButtons(NULL, 14);
	
	// 创建每个按钮
	CString str;
	m_wndToolBar.SetButtonInfo(0, ID_OPENCOM, TBSTYLE_DROPDOWN, 0);
	m_wndToolBar.SetButtonInfo(1, IDI_ICON_2, TBSTYLE_BUTTON, 1);
	m_wndToolBar.SetButtonInfo(2, IDI_ICON_3, TBSTYLE_BUTTON, 2);
	m_wndToolBar.SetButtonInfo(3, IDI_ICON_4, TBSTYLE_BUTTON, 3);
	m_wndToolBar.SetButtonInfo(4, IDI_ICON_5, TBSTYLE_BUTTON , 4);

CRect rectToolBar;
	// 设置工具条按钮大小
	m_wndToolBar.GetItemRect(0, &rectToolBar); //rectToolBar反应了按钮大小
	m_wndToolBar.SetSizes(rectToolBar.Size(), CSize(32,32));
*/


	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);

	return 0;
}

void CMainFrame::OnGzWndDestroy()
{
	bGzWndShow = false;
}


BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	cs.style &=~FWS_ADDTOTITLE;
//	cs.lpszClass = AfxRegisterWndClass(0, NULL, NULL,
//		AfxGetApp()->LoadIcon(IDR_MAINFRAME));
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers


BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(!m_wndSplitter1.CreateStatic(this,1,2))
	{
		MessageBox("Create Static Window Error!");
		return 0;
	}

	if (!m_wndSplitter1.CreateView(0, 0,
		pContext->m_pNewViewClass, CSize(300,0), pContext))
	{
		TRACE0("Failed to create first pane\n");
		return FALSE;
	}
	if(!m_wndSplitter2.CreateStatic(&m_wndSplitter1,2,1,WS_VISIBLE|WS_CHILD|WS_BORDER,m_wndSplitter1.IdFromRowCol(0,1)))
	{
		MessageBox("Create Static Window Error!");
		return 0;
	}
	
	//数据接收窗口
	if (!m_wndSplitter2.CreateView(0, 0,
			RUNTIME_CLASS(CDataShowView), CSize(0,340),pContext))
	{
		TRACE0("Failed to create second pane\n");
		return FALSE;
	}
	//数据处理窗口
	if (!m_wndSplitter2.CreateView(1, 0,
			RUNTIME_CLASS(CPreviewPane2), CSize(200,0),pContext))
	{
		TRACE0("Failed to create second pane\n");
		return FALSE;
	}
	
	// 激活窗口
	SetActiveView((CMaintainView*)m_wndSplitter1.GetPane(0,0));
//	return CFrameWnd::OnCreateClient(lpcs, pContext);
	return TRUE;
}

void CMainFrame::OnCalculator() 
{
	::ShellExecute(m_hWnd,"open","calc.exe",NULL,NULL,SW_SHOWNORMAL);
}

void CMainFrame::OnAscii() 
{
	// TODO: Add your command handler code here
	CDlgAcsii m_dlgAscii;
	m_dlgAscii.DoModal();
}

void CMainFrame::OnOpencom() 
{
	// TODO: Add your command handler code here
	CPropertySheet comSheet("串口参数",this);
	CDlgComset	dlgComSet(m_pDoc->GetSerialLineInfo());
	comSheet.AddPage(&dlgComSet);
	
	if(IDCANCEL == comSheet.DoModal())
		return;
	if(!m_pDoc->SetSerialLineInfo(&dlgComSet.m_SerialLineInfo))
	{
		  MessageBox(_T("打开串口失败!"),"提示",MB_OK|MB_ICONSTOP);
		  m_pDoc->CloseComm();
		  return;
	}
	SetComParaToStatusBar(1);
}
//1-打开串口 0-关闭
void CMainFrame::SetComParaToStatusBar(int open)
{
	int ComNo,Baut,DataBit,StopBit,Parity;
	m_pDoc->GetCommOption(ComNo,Baut,DataBit,StopBit,Parity);

	int i;
	switch(Parity)
	{
	case P_NONE://无
		i = 0;
		break;
	case P_EVEN://偶
		i = 2;
		break;
	case P_ODD://奇
		i = 1;
		break;
	default:
		i = 0;
		break;
	}

	CString Text;
	if(open)
	{
		Text.Format("串口%d:%s,%s,%s,%s",ComNo,
			BuadType[Baut],
			ParityType[i],
			DataBitType[DataBit],
			StopBitType[StopBit?1:0]
			);
		m_bOpened = TRUE;
	}
	else
	{
		Text="串口关闭";
		m_bOpened = false;
	}
	m_wndStatusBar.SetPaneText(1,Text);
}

void CMainFrame::ShowSendData(BYTE *pData, int nLen)
{
	((CMaintainView*)m_wndSplitter1.GetPane(0,0))->ShowData(pData,nLen);
}
void CMainFrame::ShowRecData(BYTE *pData, int nLen)
{
	((CDataShowView*)m_wndSplitter2.GetPane(0,0))->ShowData(pData,nLen);
}

//接收到返回数据
void CMainFrame::ReceiveData(BYTE *pData, int nLength)
{
	CString strTemp;
		
	if(nExtFunc <= 0)//不是维护功能转发
	{
		((CMaintainView*)m_wndSplitter1.GetPane(0,0))->AddRecDataToBuf(pData,nLength);
		return;
	}

	if((nCurRecDataLen+nLength)>1024)
		nCurRecDataLen = 0;

	WaitForSingleObject(hEvent1, INFINITE);
	memcpy(&byRecBuf[nCurRecDataLen],pData,nLength);
	nCurRecDataLen+=nLength;
	SetEvent(hEvent1);

	switch(nCurRecDataLen)
	{
	case CANSHU_UP_DATA://参数上装返回
		SetActionExpain(5,GOING);
		if((byRecBuf[0]==0x01)&&(byRecBuf[1]==0x01)&&(byRecBuf[2]==0x02)&&(byRecBuf[3]==0x02))
		{
			KillTimer(1);
			nCount = 0;
			WaitForSingleObject(hEvent1, INFINITE);
			memcpy(&dataBuf[nSerialNo*CANSHU_FRAME_LEN],&byRecBuf[7],CANSHU_FRAME_LEN);
			SetEvent(hEvent1);
			if(ValidateParity())
				nSerialNo++;
			WaitForSingleObject(hEvent1, INFINITE);
			nCurRecDataLen = 0;
			SetEvent(hEvent1);
			if(nSerialNo < nCanshuUploadFlag)
				OrganiseData(nExtFunc,nSerialNo);
			else
			{			
				nSerialNo = 0;
				CreateParaFile();
				SetActionExpain(5,END);
				nExtFunc = 0;
				
				WaitForSingleObject(hEvent1, INFINITE);
				nCurRecDataLen = 0;
				SetEvent(hEvent1);
			}
		}
		
		break;
	case BMP_UP_DATA://图像上装返回
		SetActionExpain(5,GOING);
		if((byRecBuf[0]==0x01)&&(byRecBuf[1]==0x59)&&(byRecBuf[2]==0x02)&&(byRecBuf[3]==0x02))
		{
			KillTimer(1);
			nCount = 0;
			WaitForSingleObject(hEvent1, INFINITE);
			memcpy(&dataBuf[nSerialNo*BMP_FRAME_LEN],&byRecBuf[7],BMP_FRAME_LEN);
			SetEvent(hEvent1);
			if(ValidateParity())
				nSerialNo++;
			WaitForSingleObject(hEvent1, INFINITE);
			nCurRecDataLen = 0;
			SetEvent(hEvent1);
			if(nSerialNo < BMP_SEND_COUNT)
				OrganiseData(nExtFunc,nSerialNo);
			else
			{
				nSerialNo = 0;
				CreateBMP();
				SetActionExpain(5,END);
				nExtFunc = 0;

				WaitForSingleObject(hEvent1, INFINITE);
				nCurRecDataLen = 0;
				SetEvent(hEvent1);
			}
		}
		
		break;
	case NAK://返回错误
		nRtn = IsNAK();
		if(nRtn > 0)
		{
			WaitForSingleObject(hEvent1, INFINITE);
			nCurRecDataLen = 0;
			SetEvent(hEvent1);
			switch(nRtn)
			{
			case 0x01://无效命令
				strTemp = _T("返回无效命令,系统重发...");
				break;
			case 0x02://校验错误
				strTemp = _T("返回校验错误,系统重发...");
				break;
			case 0x04://键码错误
				strTemp = _T("返回键码错误,系统重发...");
				break;
			case 0x08://地址错误
				strTemp = _T("返回地址错误,系统重发...");
				break;
			default:
				strTemp = GOING;
				break;
			}
			SetActionExpain(5,strTemp);
		}
		break;
	case ACK://返回正确
		SetActionExpain(5,GOING);
		if(IsACK())
		{
			KillTimer(1);
			nCount = 0;
			if(ValidateParity())
				nSerialNo++;
			nCurRecDataLen = 0;
			if(nSerialNo < nSendFileCount)
				OrganiseData(nExtFunc,nSerialNo,strFileName);
			else
			{
				nSerialNo = 0;
				SetActionExpain(5,END);
				nExtFunc = 0;

				WaitForSingleObject(hEvent1, INFINITE);
				nCurRecDataLen = 0;
				SetEvent(hEvent1);

⌨️ 快捷键说明

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