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

📄 nmea_srdlg.cpp

📁 基于CAN总线的NMEA2000协议
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// NMEA_SRDlg.cpp : implementation file
//

#include "stdafx.h"
#include "NMEA_SR.h"
#include "NMEA_SRDlg.h"
#include "can.h"


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

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

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()

/////////////////////////////////////////////////////////////////////////////
// CNMEA_SRDlg dialog

CNMEA_SRDlg::CNMEA_SRDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CNMEA_SRDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CNMEA_SRDlg)
		// 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);



	
}

void CNMEA_SRDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CNMEA_SRDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CNMEA_SRDlg, CDialog)
	//{{AFX_MSG_MAP(CNMEA_SRDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BTN_RECVCLEAR, OnBtnRecvclear)
	ON_BN_CLICKED(IDC_FRAME_STATE, OnFrameState)
	ON_BN_CLICKED(IDC_BTN_INIT, OnBtnInit)
	ON_BN_CLICKED(IDC_BTN_SEND, OnBtnSend)
	ON_BN_CLICKED(IDC_BTN_SENDCLEAR, OnBtnSendclear)
	ON_BN_CLICKED(IDC_BTN_GETGEOG, OnBtnGetgeog)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BTN_GETHEAD, OnBtnGethead)
	ON_BN_CLICKED(IDC_BTN_GETWAYP, OnBtnGetwayp)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNMEA_SRDlg message handlers

BOOL CNMEA_SRDlg::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	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CNMEA_SRDlg::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 CNMEA_SRDlg::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 CNMEA_SRDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CNMEA_SRDlg::OnFrameState() 
{
	// TODO: Add your control notification handler code here

}




/*以下是自己编写的*/


/**************  Function for HEX to ASCII H ****************/
/**************  IN : char   (1 BYTE )      ****************/
/**************  out : char ChangASCii      ****************/
/******在单节点调试时使用******/
char  HEX2ASCII_H(unsigned char onebyte)
{
	char  HEX_data = onebyte;
	char dataH, ASCII_data;

	dataH = HEX_data;
	dataH = dataH & 0x0f0;
	dataH = dataH >>4;
	dataH = dataH & 0x0f ;

	if(dataH>9)
	{
		dataH = (dataH +'A'-10);
	}
	else if(dataH<10)
	{
		dataH = (dataH + '0');
	}

	ASCII_data = dataH;
	return ASCII_data;
}

/**************  Function for HEX to ASCII L ****************/
/**************  IN : char   (1 BYTE )      ****************/
/**************  out : char ChangASCii      ****************/
/******在单节点调试时使用******/
char  HEX2ASCII_L(unsigned char onebyte)
{
	char  HEX_data = onebyte;
	char dataL, ASCII_data;

	dataL = HEX_data;
	dataL = dataL & 0x0f ;

	if(dataL>9)
	{
		dataL = (dataL +'A'-10);
	}
	else if(dataL<10)
	{
		dataL = (dataL + '0');
	}

	ASCII_data = dataL;
	return ASCII_data;
}

/******对应数据接收区的清除按钮******/
/******该按钮可以完成 接受 和 清除 任务******/
/******每点击后,按钮上的字会改变,功能也相应改变******/
void CNMEA_SRDlg::OnBtnRecvclear() 
{
	// TODO: Add your control notification handler code here
	CString str;
	int MsgCount;
	int Receive_ReturnCode;
	PacketStruct RecvPacket;
	char recv_datalen[2];
	DWORD recv_id;
	char rid[5][2];   //
	char recv_data[8];
	char rdata[9][2]; //
	char i;

	if(GetDlgItemText(IDC_BTN_RECVCLEAR,str),str=="clear")
	{
		SetDlgItemText(IDC_BTN_RECVCLEAR,"receive");
		//SetDlgItemText(IDC_FRAME_STATE,"data");
	}
	else
	{
		SetDlgItemText(IDC_BTN_RECVCLEAR,"clear");
		//SetDlgItemText(IDC_FRAME_STATE,"remote");
	
	}

	// 清除
	if(str=="clear")
	{
		CAN_ActiveBoard(0);
		CAN_ClearSoftBuffer(0,1);
		CAN_ClearDataOverrun(0,1);

		GetDlgItem(IDC_ERECV_ID)->SetWindowText("");
		GetDlgItem(IDC_ERECV_DATALENGTH)->SetWindowText("");
		GetDlgItem(IDC_ERECV_DATA)->SetWindowText("");
		
	}
	// 接收
	if(str=="receive")
	{
		CAN_ActiveBoard(0);

		MsgCount = CAN_RxMsgCount(0,1);
		if(MsgCount)
		{
			Receive_ReturnCode = CAN_ReceiveMsg(0,1,&RecvPacket);

			if(RecvPacket.rtr)
				SetDlgItemText(IDC_FRAME_STATE,"remote");
			else
				SetDlgItemText(IDC_FRAME_STATE,"data");


			/////////////////////////////////////  len
			recv_datalen[0] = RecvPacket.len;
			recv_datalen[0] = HEX2ASCII_L(recv_datalen[0]);
			recv_datalen[1] = '\0';

			///////////////////////////////////////   id
			recv_id = RecvPacket.id;
			rid[4][0] = (char)recv_id;
			rid[4][1] = (char)(recv_id>>8);
			rid[3][0] = (char)(recv_id>>16);
			rid[3][1] = (char)(recv_id>>24);

			rid[0][0] = HEX2ASCII_H(rid[3][1]);
			rid[0][1] = HEX2ASCII_L(rid[3][1]);

			rid[1][0] = HEX2ASCII_H(rid[3][0]);
			rid[1][1] = HEX2ASCII_L(rid[3][0]);

			rid[2][0] = HEX2ASCII_H(rid[4][1]);
			rid[2][1] = HEX2ASCII_L(rid[4][1]);

			rid[3][0] = HEX2ASCII_H(rid[4][0]);
			rid[3][1] = HEX2ASCII_L(rid[4][0]);

			rid[4][0] = (char)'\0';


			////////////////////////////////////////   data
			for(i=0; i<8;i++)
			{
				recv_data[i] = RecvPacket.data[i];
			}
		//	recv_data[1]=(char)0xda;		
			rdata[0][0] = HEX2ASCII_H(recv_data[0]);
			rdata[0][1] = HEX2ASCII_L(recv_data[0]);

			rdata[1][0] = HEX2ASCII_H(recv_data[1]);
			rdata[1][1] = HEX2ASCII_L(recv_data[1]);

			rdata[2][0] = HEX2ASCII_H(recv_data[2]);
			rdata[2][1] = HEX2ASCII_L(recv_data[2]);

			rdata[3][0] = HEX2ASCII_H(recv_data[3]);
			rdata[3][1] = HEX2ASCII_L(recv_data[3]);

			rdata[4][0] = HEX2ASCII_H(recv_data[4]);
			rdata[4][1] = HEX2ASCII_L(recv_data[4]);

			rdata[5][0] = HEX2ASCII_H(recv_data[5]);
			rdata[5][1] = HEX2ASCII_L(recv_data[5]);

			rdata[6][0] = HEX2ASCII_H(recv_data[6]);
			rdata[6][1] = HEX2ASCII_L(recv_data[6]);

			rdata[7][0] = HEX2ASCII_H(recv_data[7]);
			rdata[7][1] = HEX2ASCII_L(recv_data[7]);

			rdata[8][0] = (char)'\0';

		////  show the message
			GetDlgItem(IDC_ERECV_ID)->SetWindowText(rid[0]);
			GetDlgItem(IDC_ERECV_DATALENGTH)->SetWindowText(recv_datalen);
			GetDlgItem(IDC_ERECV_DATA)->SetWindowText(rdata[0]);

		}
		else
		{
			MessageBox("NO Message!");
		}
	}
}


/******窗口右下角的初始化按钮******/
void CNMEA_SRDlg::OnBtnInit() 
{
	// TODO: Add your control notification handler code here
		int Active_ReturnCode;
	int Reset_ReturnCode;
	int Init_ReturnCode;
	int Config_ReturnCode=0;
	ConfigStruct ConfigData={{0,0,0,0},{0xff,0xff,0xff,0xff},5,0,0};
	/******扩展帧,接收所有报文,设置在250kps******/

	CAN_ActiveBoard(0);

	Active_ReturnCode = CAN_BoardIsActive(0);
	if(Active_ReturnCode)			// 判断CAN卡 is active
	{
		Reset_ReturnCode = CAN_Reset(0,1);
		Init_ReturnCode = CAN_Init(0,1);
		Config_ReturnCode = CAN_Config(0,1,&ConfigData);

		if((!Reset_ReturnCode) && (!Init_ReturnCode) && (!Config_ReturnCode))
		{
			MessageBox("Active Successfully!");
		}
		else
		{
			MessageBox("Active unSuccessful!");
		}
	}
	else							// inactive
	{
		MessageBox("Active Wrong!");
	}

	SetTimer(1,10,NULL);	/******设置时间 为10ms******/
}

/******窗口右下角的退出按钮******/
void CNMEA_SRDlg::OnCancel() 
{
	// TODO: Add extra cleanup here
	int can_ReturnCode;
	can_ReturnCode = CAN_CloseBoard(0);
	if(!can_ReturnCode)
	{
		CDialog::OnCancel();
	}
	else
	{
		KillTimer(1);
		CAN_ActiveBoard(0);
		CAN_CloseBoard(0);
	}
	//CDialog::OnCancel();
}

/**************  Function for ASCII to HEX	**************/
/**************  IN : char * (two byte)		**************/
/**************  out : unsigned char (1 byte)  ***********/
/******在单节点调试时使用******/
unsigned char ASCII2HEX(char *str)
{
	char ASCH=*str;
	char ASCL=*(str+1);

⌨️ 快捷键说明

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