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

📄 onboardsimuldlg.cpp

📁 帮助VC的初学者了解向导生成程序的整体结构 Visual C++串口通信
💻 CPP
字号:
// OnBoardSimulDlg.cpp : implementation file
//

#include "stdafx.h"
#include "OnBoardSimul.h"
#include "OnBoardSimulDlg.h"
#include "OnBoardSimulSerial.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

extern COnBoardSimulSerial g_OnBoardSimul; 

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COnBoardSimulDlg dialog

COnBoardSimulDlg::COnBoardSimulDlg(CWnd* pParent /*=NULL*/)
	: CDialog(COnBoardSimulDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(COnBoardSimulDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	nItem = 0;
}

void COnBoardSimulDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(COnBoardSimulDlg)
	DDX_Control(pDX, IDC_EDIT_CALLNUM, m_callnum);
	DDX_Control(pDX, IDC_LIST1, m_list1);
	DDX_Control(pDX, IDC_COMBO_SPEED, m_serialspeed);
	DDX_Control(pDX, IDC_COMBO_PORT, m_serialport);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(COnBoardSimulDlg, CDialog)
	//{{AFX_MSG_MAP(COnBoardSimulDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_PORT_OPEN, OnPortOpen)
	ON_BN_CLICKED(IDC_PORT_CLOSE, OnPortClose)
	ON_BN_CLICKED(IDC_CONNECT_REQ, OnConnectReq)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_DISCONNECT_REQ, OnDisconnectReq)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COnBoardSimulDlg message handlers

BOOL COnBoardSimulDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 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
	
	// TODO: Add extra initialization here
	m_serialport.InsertString(0, "COM1");
	m_serialport.InsertString(1, "COM2");
	m_serialport.InsertString(2, "COM3");
	m_serialport.InsertString(3, "COM4");
	m_serialport.SetCurSel(2);

	m_serialspeed.InsertString(0, "4800");
	m_serialspeed.InsertString(1, "9600");
	m_serialspeed.InsertString(2, "19200");
	m_serialspeed.SetCurSel(2);
	
	GetDlgItem(IDC_PORT_OPEN)->EnableWindow(TRUE);
	GetDlgItem(IDC_PORT_CLOSE)->EnableWindow(FALSE);
	GetDlgItem(IDC_CONNECT_REQ)->EnableWindow(FALSE);
	GetDlgItem(IDC_DISCONNECT_REQ)->EnableWindow(FALSE);

	DWORD extStyle;
	m_list1.ModifyStyle(0, LVS_REPORT);
	extStyle = m_list1.GetExtendedStyle();
	extStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
	m_list1.SetExtendedStyle(extStyle);
	m_list1.InsertColumn(0, "序号", LVCFMT_LEFT, 50);
	m_list1.InsertColumn(1, "时间", LVCFMT_LEFT, 100);
	m_list1.InsertColumn(2, "方向", LVCFMT_LEFT, 100);
	m_list1.InsertColumn(3, "业务原语", LVCFMT_LEFT, 80);
	m_list1.InsertColumn(4, "数据内容", LVCFMT_LEFT, 220);

	m_callnum.SetWindowText("92900002");
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void COnBoardSimulDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void COnBoardSimulDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR COnBoardSimulDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void COnBoardSimulDlg::OnPortOpen() 
{
	// TODO: Add your control notification handler code here
	
	CString SerialPort;
	CString SerialSpeed;
	SerialPort.Empty();
	SerialSpeed.Empty();

	m_serialport.GetWindowText(SerialPort);
	m_serialspeed.GetWindowText(SerialSpeed);
	int serialportnum=0;
	if(SerialPort=="COM1")
	{
		serialportnum=1;
	}
	else if(SerialPort=="COM2")
	{
		serialportnum=2;
	}
	else if(SerialPort=="COM3")
	{
		serialportnum=3;
	}
	else if(SerialPort=="COM4")
	{
		serialportnum=4;
	}
	int nSerialSpeed = atoi(SerialSpeed);
	if((g_OnBoardSimul.Start(serialportnum, nSerialSpeed)) != 1)
	{
		::AfxMessageBox("打开串口失败!");
		g_OnBoardSimul.End();
	}
	else
	{
		GetDlgItem(IDC_PORT_OPEN)->EnableWindow(FALSE);
		GetDlgItem(IDC_PORT_CLOSE)->EnableWindow(TRUE);
		GetDlgItem(IDC_COMBO_PORT)->EnableWindow(FALSE);
		GetDlgItem(IDC_COMBO_SPEED)->EnableWindow(FALSE);
		GetDlgItem(IDC_CONNECT_REQ)->EnableWindow(TRUE);
		GetDlgItem(IDC_DISCONNECT_REQ)->EnableWindow(TRUE);
	}
	
}

void COnBoardSimulDlg::OnPortClose() 
{
	// TODO: Add your control notification handler code here
	g_OnBoardSimul.End();
	GetDlgItem(IDC_PORT_CLOSE)->EnableWindow(false);
	GetDlgItem(IDC_PORT_OPEN)->EnableWindow(true);
	GetDlgItem(IDC_COMBO_PORT)->EnableWindow(true);
	GetDlgItem(IDC_COMBO_SPEED)->EnableWindow(true);
	GetDlgItem(IDC_CONNECT_REQ)->EnableWindow(false);
	GetDlgItem(IDC_DISCONNECT_REQ)->EnableWindow(false);
}

void COnBoardSimulDlg::OnConnectReq() 
{
	// TODO: Add your control notification handler code here
	unsigned char ConnectReqFrm[50];
	memset(ConnectReqFrm, 0, 50);
	int nConnectFrmLen = FormConnectFrm(ConnectReqFrm);
	g_OnBoardSimul.SendData((char *)ConnectReqFrm, nConnectFrmLen);
	Display(ConnectReqFrm, nConnectFrmLen, 0x11);

}

int COnBoardSimulDlg::FormConnectFrm(unsigned char *pTempFrm)
{
	unsigned char *pMove;
	pTempFrm[0] = FLAG1;
	pTempFrm[1] = FLAG2;
	pTempFrm[2] = FLAG3;

	pMove = pTempFrm + 3;
	*pMove = 0x1E;
	pMove++;
	*pMove = 0x11; //原语标识
	pMove++;
//	*pMove = 0x14;
//	pMove++;

	CString strTemp;
	strTemp.Empty();
	m_callnum.GetWindowText(strTemp);
	int nTemplen = strTemp.GetLength();
	memcpy(pMove, &nTemplen, 1);
	pMove++;

	char cTempNum[20];
	memset(cTempNum,0,20);
	strcpy(cTempNum, strTemp);
	memcpy(pMove, cTempNum, 20);
	pMove+=20;

	//被叫方标识
	*pMove = 0x04;
	pMove++;
	*pMove = 0x05;
	pMove++;
	*pMove = 0x06;
	pMove++;
	//主叫方标识
	*pMove = 0x01;
	pMove++;
	*pMove = 0x02;
	pMove++;
	*pMove = 0x03;
	pMove++;
	//应用类型
	*pMove = 0x01; 
	pMove++;
	//服务等级
	*pMove = 0x01;
	pMove++;
	//临时CRC
	*pMove = 0;
	pMove++;
	*pMove = 0;
	pMove++;

	return( pMove- pTempFrm);

}

void COnBoardSimulDlg::OnDisconnectReq() 
{
	// TODO: Add your control notification handler code here
	unsigned char DisconReqFrm[50];
	memset(DisconReqFrm, 0, 50);
	int nDisconReqLen = FormDisconnetFrm(DisconReqFrm);
	g_OnBoardSimul.SendData((char *)DisconReqFrm, nDisconReqLen);
	Display(DisconReqFrm, nDisconReqLen, 0x31);
}

int COnBoardSimulDlg::FormDisconnetFrm(unsigned char *pTempFrm)
{			
	unsigned char *pMove;
	pTempFrm[0] = FLAG1;
	pTempFrm[1] = FLAG2;
	pTempFrm[2] = FLAG3;
	pMove = pTempFrm + 3;
	*pMove = 0x02;
	pMove++;
	*pMove = 0x31;
	pMove++;
//	*pMove = 0x01;//TCEPID??
//	pMove++;
	*pMove = 0x00; //正常拆连
	pMove++;
	//临时CRC
	*pMove = 0;
	pMove++;
	*pMove = 0;
	pMove++;

	return (pMove - pTempFrm);
}

void COnBoardSimulDlg::Display(unsigned char *pCmdContent, int nLen, BYTE type)
{
	CString strTemp;
	CString strCmdName;
	CString strDirec;
	CString strContent; //数据内容



	strTemp.Empty();
	strCmdName.Empty();
	strDirec.Empty();
	strContent.Empty();

	strTemp.Format("%d", nItem);
	m_list1.InsertItem(nItem, strTemp, -1);

	strTemp.Format("%d", nItem+1);
	m_list1.SetItemText(nItem, 0, strTemp);

	CTime t = CTime::GetCurrentTime();
	strTemp.Format("%02d-%02d %02d:%02d:%02d", t.GetMonth(), t.GetDay(), 
		t.GetHour(), t.GetMinute(), t.GetSecond());
	m_list1.SetItemText(nItem, 1, strTemp);

	//到RTM仿真机:--->
	//RTM仿真机到:<---
	switch(type) 
	{
	case 0x11:
		strCmdName = "连接请求";
		strDirec = "车载设备->RTM仿真机";
		break;
	case 0x12:
		strCmdName = "连接证实";
		strDirec = "RTM仿真机<-车载设备";
		break;
	case 0x13:
		strCmdName = "连接指示"; //由RBC发起
		strDirec = "接入服务器->车载设备";
		OnAutoSendRespFrm();
		break;
	case 0x14:
		strCmdName = "连接响应"; //给RBC发回
		strDirec = "车载设备->接入服务器";
		break;
	case 0x31:
		strCmdName = "正常拆连请求";
		strDirec = "车载设备->RTM仿真机";
		break;
	case 0xaa:
		strCmdName = "GSMR响应帧";
		strDirec = "GSMR->车载设备";
		break;
	default:
		break;
	}

	m_list1.SetItemText(nItem, 2, strDirec);
	m_list1.SetItemText(nItem, 3, strCmdName);
	
	char szTemp[2];
	memset(szTemp, 0, 2);
	for (int i=0; i<nLen; i++)
	{
		sprintf(szTemp, "%02X ", (BYTE)(*pCmdContent++));
		strContent += szTemp;
	}
	m_list1.SetItemText(nItem, 4, strContent);

	m_list1.EnsureVisible(nItem, TRUE);
	if (nItem > 300)
	{
		m_list1.DeleteAllItems();
		nItem = 0;
	}
	else
	{
		nItem++;
	}


}

void COnBoardSimulDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnClose();
}

void COnBoardSimulDlg::OnAutoSendRespFrm()
{
	unsigned char AutoSendRespFrm[50];
	memset(AutoSendRespFrm, 0, 50);
	int nRespFrmLen = FormRespFrm(AutoSendRespFrm);
	g_OnBoardSimul.SendData((char *)AutoSendRespFrm, nRespFrmLen);
}

int COnBoardSimulDlg::FormRespFrm(unsigned char *pTempFrm)
{
	unsigned char *pMove;
	pTempFrm[0] = FLAG1;
	pTempFrm[1] = FLAG2;
	pTempFrm[2] = FLAG3;
	pMove = pTempFrm + 3;

	*pMove = 0x05;
	pMove++;
	*pMove = 0x14;
	pMove++;
	*pMove = 0x01; //TECPID ??
	pMove++;
	//相应方标识
	*pMove = 0x01;
	pMove++;
	*pMove = 0x02;
	pMove++;
	*pMove = 0x03;
	pMove++;

	return (pMove - pTempFrm);
}

⌨️ 快捷键说明

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