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

📄 nmea_srdlg.cpp

📁 基于CAN总线的NMEA2000协议
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	unsigned char C_HEX=0;

	if(('0'<=ASCH)&&(ASCH<='9'))
	{
		ASCH=(ASCH-'0');
	}
	else if(('a'<=ASCH)&&(ASCH<='f'))
	{
		ASCH=(ASCH-'a'+10);
	}
	else if(('A'<=ASCH)&&(ASCH<='F'))
	{
		ASCH=(ASCH-'A'+10);
	}
	


	if(('0'<=ASCL)&&(ASCL<='9'))
	{
		ASCL=(ASCL-48);
	}
	else if(('a'<=ASCL)&&(ASCL<='f'))
	{
		ASCL=(ASCL-'a'+10);
	}
	else if(('A'<=ASCL)&&(ASCL<='F'))
	{
		ASCL=(ASCL-'A'+10);
	}
	
	
	ASCH=ASCH&0x0f;
	ASCL=ASCL&0x0f;
	C_HEX = (unsigned char)((ASCH <<4) +ASCL);
	return C_HEX;
}


/******发送区的发送按钮******/
void CNMEA_SRDlg::OnBtnSend() 
{
	// TODO: Add your control notification handler code here
	char data[9][2] ;
	char id_num[9], dlc_len[1],port1_state[3];
	PacketStruct SendPacket;
	char data_len,i;
	DWORD send_id=0;
	BYTE temp,temp1;
	

////////////////////////////////
	GetDlgItem(IDC_ESEND_DATALENGTH)->GetWindowText(dlc_len,2);
	data_len = dlc_len[0] -'0';
	SendPacket.len=data_len;
	

////////////////////////////////
	GetDlgItem(IDC_ESEND_ID)->GetWindowText(id_num,9);
	for(i=0;i<7;i++,i++)
	{
		temp = ASCII2HEX(id_num+i);
		temp1= temp;
		send_id = send_id<<8;
		send_id = send_id & 0xffffff00;
		send_id += temp;		
	}
	SendPacket.id = send_id;

////////////////////////////////
   	GetDlgItem(IDC_ESEND_DATA0)->GetWindowText(data[0],3);
	GetDlgItem(IDC_ESEND_DATA1)->GetWindowText(data[1],3);
	GetDlgItem(IDC_ESEND_DATA2)->GetWindowText(data[2],3);
	GetDlgItem(IDC_ESEND_DATA3)->GetWindowText(data[3],3);
	GetDlgItem(IDC_ESEND_DATA4)->GetWindowText(data[4],3);
	GetDlgItem(IDC_ESEND_DATA5)->GetWindowText(data[5],3);
	GetDlgItem(IDC_ESEND_DATA6)->GetWindowText(data[6],3);
	GetDlgItem(IDC_ESEND_DATA7)->GetWindowText(data[7],3);
	for(i=0;i<data_len;i++)
	{
		temp = ASCII2HEX(data[i]);
		SendPacket.data[i] = temp;
	}
	while(8>i)
	{
		SendPacket.data[i]=0;
		i++;
	}

/////////////////////写CAN卡状态信息
	SendPacket.mode=1;
	SendPacket.rtr=0;

	CAN_ActiveBoard(0);
	CAN_Status(0,1,&temp);
	port1_state[0] = HEX2ASCII_H(temp);
	port1_state[1] = HEX2ASCII_L(temp);
	port1_state[2] = '\0';

	
	GetDlgItem(IDC_ESEND_STATE)->SetWindowText(port1_state);

	if(0x0c==temp)
	{   i =0 ;
		i = CAN_SendMsg(0,1,&SendPacket);
		switch(i)
		{
			case 0:MessageBox("Send Successfully!");break;
			case 2:MessageBox("Broad is not Active!");break;
			case 3:MessageBox("Active Wrong!");break;
			case 4:MessageBox("Port NO. is Wrong!");break;
			default:MessageBox("Wrong!");break;
		}
	}
		

//	GetDlgItem(IDC_ERECV_ID)->SetWindowText(id_num);
//	GetDlgItem(IDC_ERECV_DATALENGTH)->SetWindowText(dlc_len);
//	GetDlgItem(IDC_ERECV_DATA)->SetWindowText(data[0]);
}


/******发送区的清除按钮,清除CAN卡上的缓冲区******/
void CNMEA_SRDlg::OnBtnSendclear() 
{
	// TODO: Add your control notification handler code here
	CAN_ActiveBoard(0);
	CAN_ClearSoftBuffer(0,1);
	CAN_ClearDataOverrun(0,1);
}


/******获取坐标 按钮******/
/******发送远程帧******/
void CNMEA_SRDlg::OnBtnGetgeog() 
{
	// TODO: Add your control notification handler code here
	
	PacketStruct Sendremote;
	int i;
	unsigned char canstatus;
	Sendremote.mode = 1;
	Sendremote.id = 0x11111111;
	Sendremote.rtr = 1;
	Sendremote.len = 0;

	CAN_ActiveBoard(0);
	CAN_Status(0,1,&canstatus);
	    
		i = CAN_SendMsg(0,1,&Sendremote);
		switch(i)
		{
			case 0:MessageBox("Send Successfully!");break;
			case 2:MessageBox("Broad is not Active!");break;
			case 3:MessageBox("Active Wrong!");break;
			case 4:MessageBox("Port NO. is Wrong!");break;
			default:MessageBox("Wrong!");break;
		}		
}


/******时间相应函数******/
char F_data1[10],F_data2[10],F_data3[9];	/******获取坐标缓冲区******/
char S_data1[10],S_data2[11];				/******船首向缓冲区******/
char T_data1[10],T_data2[10],T_data3[9],T_data4[9];	/******航路点缓冲区******/
char T_data5[8],T_data6[4],T_data7[10];				/******航路点缓冲区******/
char port1_state[3];						/******CAN卡状态缓冲区******/
PacketStruct Recv_Packet;
void CNMEA_SRDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnTimer(nIDEvent);
	int i;
	BYTE temp;

	CAN_ActiveBoard(0);
	CAN_ClearSoftBuffer(0,1);
	CAN_ClearDataOverrun(0,1);
	

	CAN_ActiveBoard(0);
	CAN_Status(0,1,&temp);
	port1_state[0] = HEX2ASCII_H(temp);
	port1_state[1] = HEX2ASCII_L(temp);
	port1_state[2] = '\0';

	CAN_ActiveBoard(0);
	GetDlgItem(IDC_ESEND_STATE)->SetWindowText(port1_state);

	
	i=CAN_RxMsgCount(0,1);
	if(i)		
	{
		//MessageBox("have message");
		CAN_ReceiveMsg(0,1,&Recv_Packet);

/******地理坐标******/
		if(0x11111111 == Recv_Packet.id)
		{
			if(0x13 == Recv_Packet.data[0])
			{	
				F_data1[0] = Recv_Packet.data[1];
				F_data1[1] = Recv_Packet.data[2];
				F_data1[2] = 0x20;
				F_data1[3] = Recv_Packet.data[3];
				F_data1[4] = Recv_Packet.data[4];
				F_data1[5] = 0x20;
				F_data1[6] = Recv_Packet.data[5];
				F_data1[7] = Recv_Packet.data[6];
				F_data1[8] = Recv_Packet.data[7];
				F_data1[9] = '\0';
			GetDlgItem(IDC_EGEOG_LAT)->SetWindowText(F_data1);
			}

			if(0x23 == Recv_Packet.data[0])
			{
				F_data2[0] = Recv_Packet.data[1];
				F_data2[1] = Recv_Packet.data[2];
				F_data2[2] = Recv_Packet.data[3];
				F_data2[3] = 0x20;
				F_data2[4] = Recv_Packet.data[4];
				F_data2[5] = Recv_Packet.data[5];
				F_data2[6] = 0x20;
				F_data2[7] = Recv_Packet.data[6];
				F_data2[8] = Recv_Packet.data[7];
			
			}

			if(0x33 == Recv_Packet.data[0])
			{
				F_data2[9] = Recv_Packet.data[1];
				F_data2[10] = '\0';
			GetDlgItem(IDC_EGEOG_LONG)->SetWindowText(F_data2);	

				F_data3[0] = Recv_Packet.data[2];
				F_data3[1] = Recv_Packet.data[3];
				F_data3[2] = 0x3A;
				F_data3[3] = Recv_Packet.data[4];
				F_data3[4] = Recv_Packet.data[5];
				F_data3[5] = 0x3A;
				F_data3[6] = Recv_Packet.data[6];
				F_data3[7] = Recv_Packet.data[7];
				F_data3[8] = '\0';
					
			GetDlgItem(IDC_EGEOG_GMT)->SetWindowText(F_data3);
			
			}
		}
		/******船首向******/
		else if(0x02222222 == Recv_Packet.id)
		{
			if(0x12 == Recv_Packet.data[0])
			{	
				S_data1[0] = Recv_Packet.data[1];
				S_data1[1] = Recv_Packet.data[2];
				S_data1[2] = Recv_Packet.data[3];
			    S_data1[3] = Recv_Packet.data[4];
				S_data1[4] = Recv_Packet.data[5];
				S_data1[5] = Recv_Packet.data[6];
				S_data1[6] = Recv_Packet.data[7];
				S_data1[7] = '\0';
			GetDlgItem(IDC_EHEAD_TURE)->SetWindowText(S_data1);
			}

			if(0x22 == Recv_Packet.data[0])
			{
				S_data2[0] = Recv_Packet.data[1];
				S_data2[1] = Recv_Packet.data[2];
				S_data2[2] = Recv_Packet.data[3];
				S_data2[3] = Recv_Packet.data[4];
				S_data2[4] = Recv_Packet.data[5];				
				S_data2[5] = Recv_Packet.data[6];
				S_data2[6] = Recv_Packet.data[7];
				S_data2[7] = '\0';

			GetDlgItem(IDC_EHEAD_MAG)->SetWindowText(S_data2);
			
			}

		}
		/******航路点******/
		else if(0x13333333 == Recv_Packet.id)
		{
			if(0x16 == Recv_Packet.data[0])
			{	
				T_data1[0] = Recv_Packet.data[1];
				T_data1[1] = Recv_Packet.data[2];
				T_data1[2] = 0x20;
				T_data1[3] = Recv_Packet.data[3];
				T_data1[4] = Recv_Packet.data[4];
				T_data1[5] = 0x20;
				T_data1[6] = Recv_Packet.data[5];
				T_data1[7] = Recv_Packet.data[6];
				T_data1[8] = Recv_Packet.data[7];
				T_data1[9] = '\0';
			GetDlgItem(IDC_EWAYP_LAT)->SetWindowText(T_data1);
			}

			if(0x26 == Recv_Packet.data[0])
			{
				T_data2[0] = Recv_Packet.data[1];
				T_data2[1] = Recv_Packet.data[2];
				T_data2[2] = Recv_Packet.data[3];
				T_data2[3] = 0x20;
				T_data2[4] = Recv_Packet.data[4];
				T_data2[5] = Recv_Packet.data[5];
				T_data2[6] = 0x20;
				T_data2[7] = Recv_Packet.data[6];
				T_data2[8] = Recv_Packet.data[7];
			
			}

			if(0x36 == Recv_Packet.data[0])
			{
				T_data2[9] = Recv_Packet.data[1];
				T_data2[10] = '\0';
				GetDlgItem(IDC_EWAYP_LONG)->SetWindowText(T_data2);

				T_data3[0] = Recv_Packet.data[2];
				T_data3[1] = Recv_Packet.data[3];
				T_data3[2] = Recv_Packet.data[4];
				T_data3[3] = 0x2e;
				T_data3[4] = Recv_Packet.data[5];
				T_data3[5] = Recv_Packet.data[6];
				T_data3[6] = Recv_Packet.data[7];
				T_data3[7] = '\0';
				GetDlgItem(IDC_EWAYP_TB)->SetWindowText(T_data3);
			}

			if(0x46 == Recv_Packet.data[0])
			{
				T_data4[0] = Recv_Packet.data[1];
				T_data4[1] = Recv_Packet.data[2];
				T_data4[2] = Recv_Packet.data[3];
				T_data4[3] = 0x2e;
				T_data4[4] = Recv_Packet.data[4];
				T_data4[5] = Recv_Packet.data[5];
				T_data4[6] = Recv_Packet.data[6];
				T_data4[7] = '\0';
				GetDlgItem(IDC_EWAYP_MB)->SetWindowText(T_data4);
			
			}

			if(0x56 == Recv_Packet.data[0])
			{
				T_data5[0] = Recv_Packet.data[1];
				T_data5[1] = Recv_Packet.data[2];
				T_data5[2] = Recv_Packet.data[3];
				T_data5[3] = Recv_Packet.data[4];
				T_data5[4] = 0x2e;
				T_data5[5] = Recv_Packet.data[5];
				T_data5[6] = '\0';
				GetDlgItem(IDC_EWAYP_DISTANCE)->SetWindowText(T_data5);
			
				T_data6[0] = Recv_Packet.data[6];
				T_data6[1] = Recv_Packet.data[7];
			}
			if(0x66 == Recv_Packet.data[0])
			{
				T_data6[2] = Recv_Packet.data[1];
				GetDlgItem(IDC_EWAYP_IDNUM)->SetWindowText(T_data6);

				T_data7[0] = Recv_Packet.data[2];
				T_data7[1] = Recv_Packet.data[3];
				T_data7[2] = 0x3A;
				T_data7[3] = Recv_Packet.data[4];
				T_data7[4] = Recv_Packet.data[5];
				T_data7[5] = 0x3A;
				T_data7[6] = Recv_Packet.data[6];
				T_data7[7] = Recv_Packet.data[7];
				
				T_data7[8] = '\0';
				GetDlgItem(IDC_EWAYP_GMT)->SetWindowText(T_data7);
			
			}

		}
		else
		{
			MessageBox("id wrong");
			OnBtnRecvclear();
		}
		
	}
	
}

/******获取船首向 按钮******/
/******发送远程帧******/
void CNMEA_SRDlg::OnBtnGethead() 
{
	// TODO: Add your control notification handler code here
	PacketStruct Sendremote;
	int i;
	unsigned char canstatus;
	Sendremote.mode = 1;
	Sendremote.id = 0x22222222;
	Sendremote.rtr = 1;
	Sendremote.len = 0;

	CAN_ActiveBoard(0);
	CAN_Status(0,1,&canstatus);
	    
		i = CAN_SendMsg(0,1,&Sendremote);
		switch(i)
		{
			case 0:MessageBox("Send Successfully!");break;
			case 2:MessageBox("Broad is not Active!");break;
			case 3:MessageBox("Active Wrong!");break;
			case 4:MessageBox("Port NO. is Wrong!");break;
			default:MessageBox("Wrong!");break;
		}
}


/******获取航路点 按钮******/
/******发送远程帧******/
void CNMEA_SRDlg::OnBtnGetwayp() 
{
	// TODO: Add your control notification handler code here
	PacketStruct Sendremote;
	int i;
	unsigned char canstatus;
	Sendremote.mode = 1;
	Sendremote.id = 0x33333333;
	Sendremote.rtr = 1;
	Sendremote.len = 0;

	CAN_ActiveBoard(0);
	CAN_Status(0,1,&canstatus);
	    
		i = CAN_SendMsg(0,1,&Sendremote);
		switch(i)
		{
			case 0:MessageBox("Send Successfully!");break;
			case 2:MessageBox("Broad is not Active!");break;
			case 3:MessageBox("Active Wrong!");break;
			case 4:MessageBox("Port NO. is Wrong!");break;
			default:MessageBox("Wrong!");break;
		}
}

⌨️ 快捷键说明

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