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

📄 netconfig.c

📁 用MCS51 单片机的TCIP协议的测试,很基本的程序,对新手可能有帮助!
💻 C
字号:
#include "socket.h"
#include "init.h"
#include "remote.h"
#include "eeprom.h"
#include "serial.h"
#include "netconfig.h"
#include <string.h>

//#define NETCONFIG_DEBUG

unsigned int  xdata NET_DOWN_SIZE 	_at_ 0x07ffb;
unsigned char xdata W_TEST1 		_at_ 0x07FFD;									
unsigned char xdata W_TEST2 		_at_ 0x07FFE;									
unsigned char xdata W_TEST3 		_at_ 0x07FFF;									

IGM_INFO xdata ConfigMsg 			_at_ 0x6000;
IGM_INFO xdata Shadow_Msg; // copy of ConfigMsg

extern u_char xdata sock_buf[MAX_BUF_SIZE];
extern u_char xdata Mac[6]; // main.c
extern bit Debug_Off;

int Net_Upgrade(void);


void Update_ConfigMsg(void)
{
	u_char i;
	
	for(i = 1; i <= EEPROMVALUE; i++) {
		ConfigMsg.c[3+i] = EEP_Read(i);
	}
}

/*
********************************************************************************
* Description : Save current setting to EEPROM
* Arguments   : None
* Returns     : None
* Note        : 
********************************************************************************
*/
void SaveConfig(void)
{
	u_char i;
	
   if ( (Shadow_Msg.s.Mac[0] == Mac[0])	&& 
   		(Shadow_Msg.s.Mac[1] == Mac[1]) && 
   		(Shadow_Msg.s.Mac[2] == Mac[2])	&& 
   		(Shadow_Msg.s.Mac[3] == Mac[3]) && 
   		(Shadow_Msg.s.Mac[4] == Mac[4])	&& 
   		(Shadow_Msg.s.Mac[5] == Mac[5]) ) {
   			
		for(i = 7; i <= EEPROMVALUE; i++) 
			EEP_Write(i, ConfigMsg.c[3+i]);
   		}
}

/*
********************************************************************************
* Description : Message parsing routine
* Arguments   : s - socket, length - data size
* Returns     : None
* Note        : 
********************************************************************************
*/
u_char ParseConfigMsg(SOCKET s, u_int length)
{
	u_int serverport = 0;
	u_int len = 0;
	u_char type = 0;
	u_char serverip[4];

	len = recvfrom(s,(u_char xdata *)&Shadow_Msg, length, serverip, &serverport);
	
	if (serverport == REMOTE_SERVER_PORT)
	{
		if (!Debug_Off)	PutStringLn("> ConfigMsg received");
		
#ifdef NETCONFIG_DEBUG		
		PutStringLn("> ConfigMsg received");
#endif		

		if ( (Shadow_Msg.s.op[0] == 'F') && (Shadow_Msg.s.op[1] == 'I') && (Shadow_Msg.s.op[2] == 'N') && (Shadow_Msg.s.op[3] == 'D') )
		{

			Update_ConfigMsg(); // Read EEPROM and Write configmsg
			
			Shadow_Msg = ConfigMsg;	// copy
			
			Shadow_Msg.s.op[0] = 'I';
			Shadow_Msg.s.op[1] = 'M';
			Shadow_Msg.s.op[2] = 'I';
			Shadow_Msg.s.op[3] = 'N';
			
			// DST IP : BroadCasting
			serverip[0] = 0xFF;	
			serverip[1] = 0xFF;	
			serverip[2] = 0xFF;	
			serverip[3] = 0xFF;	
			serverport = REMOTE_SERVER_PORT;
			
			sendto(s, (u_char*)&Shadow_Msg, CONFIG_MSG_SIZE, serverip, serverport);
			
			wait_10ms(1);
			type = REMOTE_FIND;
		}
		else if ( (Shadow_Msg.s.op[0] == 'S')&& (Shadow_Msg.s.op[1] == 'E')&& (Shadow_Msg.s.op[2] == 'T')&& (Shadow_Msg.s.op[3] == 'T') )
		{

			if ( (Shadow_Msg.s.Mac[0] == Mac[0])	&& (Shadow_Msg.s.Mac[1] == Mac[1])&& (Shadow_Msg.s.Mac[2] == Mac[2])
				&& (Shadow_Msg.s.Mac[3] == Mac[3]) && (Shadow_Msg.s.Mac[4] == Mac[4])	&& (Shadow_Msg.s.Mac[5] == Mac[5]) )
			{

				Shadow_Msg.s.op[0] = 'S';
				Shadow_Msg.s.op[1] = 'E';
				Shadow_Msg.s.op[2] = 'T';
				Shadow_Msg.s.op[3] = 'C';
				
				// DST IP : BroadCasting
				serverip[0] = 0xFF;	
				serverip[1] = 0xFF;	
				serverip[2] = 0xFF;	
				serverip[3] = 0xFF;	
				serverport = REMOTE_SERVER_PORT;
				
				sendto(s, (u_char*)&Shadow_Msg, SETC_MSG_SIZE, serverip, serverport);
				wait_10ms(1); //
				
				ConfigMsg = Shadow_Msg;
				
				type = REMOTE_SETT;
			}
		}
		else if ( (Shadow_Msg.s.op[0] == 'F')&& (Shadow_Msg.s.op[1] == 'I')&& (Shadow_Msg.s.op[2] == 'R')&& (Shadow_Msg.s.op[3] == 'S') )
		{

			if ( (Shadow_Msg.s.Mac[0] == Mac[0])	&& (Shadow_Msg.s.Mac[1] == Mac[1])&& (Shadow_Msg.s.Mac[2] == Mac[2])
				&& (Shadow_Msg.s.Mac[3] == Mac[3]) && (Shadow_Msg.s.Mac[4] == Mac[4])	&& (Shadow_Msg.s.Mac[5] == Mac[5]) )
			{
				if (Net_Upgrade() == 0) {
#ifdef NETCONFIG_DEBUG					
					PutString("\n\r> Download Error ");
#endif					
					if (!Debug_Off)	PutStringLn("> ConfigMsg received");

					return(0); // error
				}
				
			}
		}
		
	}
	return type;
}

/*
********************************************************************************
* Description : Receive config message throuth Ethernet
* Arguments   : None
* Returns     : 
* Note        : 
********************************************************************************
*/
u_char Recv_ConfigMsg(void)
{
	int len;
	u_char type;
	
	// waiting FIND Msg 
	if ( (len = select(SOCK_CONFIG, SEL_RECV)) > 0) 
	{
		if (len > MAX_BUF_SIZE - 8) len = MAX_BUF_SIZE - 8;
		type = ParseConfigMsg(SOCK_CONFIG,len);
		// send IMIN Msg
		if (type == REMOTE_SETT)  {
			SaveConfig();
			close(SOCK_DATA);	// Close Data channel
			
			// Reboot
			W_TEST1 = 0xAA; W_TEST2 = 0xFF; W_TEST3 = 0xAA;
			((void (code *)(void)) BOOT_ADDR)();
			while (1);				  
			}
	}
	return(0);
}

/******************************************************************************/
int Net_Upgrade(void)
{
	int xdata len;
	u_char xdata state;
	u_int xdata j;
	u_long xdata size;
	u_char xdata * xdata sram_addr;
	
	bit flag = 0;
	u_int xdata checksum;
	u_char xdata header[6];
	u_int xdata recv_size = 0;
	
	u_char xdata check[2];
	
#ifdef NETCONFIG_DEBUG	
	PutString("\n\r> Net-Upgrade ");
#endif	
	if (!Debug_Off)	PutString("\n\r> Net-Upgrade ");

	Init_Net();	
	
	socket(SOCK_CONFIG, SOCK_STREAM, REMOTE_UPDATE_PORT, 0);
	NBlisten(SOCK_CONFIG);
	
	while(1) {
		state = select(SOCK_CONFIG, SEL_CONTROL);				
		if (state == SOCK_ESTABLISHED)
		{	
			size = 0;
			sram_addr = (u_char volatile xdata *)0x0000;
			checksum = 0;
			break;
		}
	}

	while (1) {
			state = select(SOCK_CONFIG, SEL_CONTROL);				
			if (state == SOCK_ESTABLISHED) {
				if (flag == 0) {
					if (select(SOCK_CONFIG, SEL_RECV) >= 10) {
						recv(SOCK_CONFIG, (u_char xdata *)&size, 4);
						#ifdef NETCONFIG_DEBUG	
							PutString("\n\r>1. size : ");PutITOA(size);
						#endif	
						recv(SOCK_CONFIG, header, 6);
						if (header[0] != 'W') return(0);
						if (header[1] != 'i') return(0);
						if (header[2] != 'z') return(0);
						if (header[3] != 'n') return(0);
						if (header[4] != 'e') return(0);
						if (header[5] != 't') return(0);
						#ifdef NETCONFIG_DEBUG	
							PutString("\n\r>Header : ");
							for (j=0;j<6;j++) {
								PutByte(header[j]);
							}
							PutStringLn("");
						#endif	
					flag = 1;
					}
				}else if ((len = select(SOCK_CONFIG, SEL_RECV)) > 0) {
					len = recv(SOCK_CONFIG, sock_buf, len);
					#ifdef NETCONFIG_DEBUG
						//PutString("len = ");PutITOA(len);
						//PutString("1.sock_buf = ");PutITOA(sock_buf);
						//PutStringLn("");
					#endif
					
					for (j = 0; j < len; j++) {
						
						*sram_addr++ = sock_buf[j];
						
						/*
						PutString(" Addr : ");PutITOA((u_int)sram_addr);
						PutString(" buf : ");PutHTOA(sock_buf[j]);
						PutStringLn("");						
						*/
						//PutHTOA(sock_buf[j]);PutByte(' ');
						//if ((j+1)%16 == 0) PutStringLn("");
						
					}
					recv_size += len;
					
						//PutString("2.sock_buf = ");PutITOA(sock_buf);
						//PutStringLn("");
					
					
					#ifdef NETCONFIG_DEBUG
						//PutString(" recv_size : ");PutITOA(recv_size);
						//PutString(" Addr : ");PutITOA((u_int)sram_addr);PutStringLn("");
					#endif
					
					
					// checksum
					if (recv_size == (u_int)(size - 6)) {
						#ifdef NETCONFIG_DEBUG	
							PutStringLn("\n\rCalculate CheckSum ");
						#endif
												
						sram_addr = (u_char volatile xdata *)0x0000;
						for(j = 0; j < (size-8); j++) {
							checksum += *sram_addr++;
						#ifdef NETCONFIG_DEBUG
							//PutString("\n\rChecksum : ");PutITOA()
						
						#endif
							
						}
						check[0] = *sram_addr++;
						check[1] = *sram_addr++;
						
						if ((u_char)((checksum &0xff00) >> 8) != check[0]) {
							
							#ifdef NETCONFIG_DEBUG
								PutStringLn("\n\r Checksum Error 1");
							#else
								return(0);
							#endif
						}
						
						
						if ((u_char)((checksum &0x00ff)) != check[1]) {
							
							#ifdef NETCONFIG_DEBUG
								PutStringLn("\n\r Checksum Error 2");
							#else
								return(0);
							#endif
						}
						
				
						//#ifdef NETCONFIG_DEBUG	
							if (!Debug_Off)	{
							PutString("\n\r> Checksum : ");PutITOA(checksum);
							}
						//#endif
						
						COMMAND(SOCK_CONFIG) = CCLOSE;                               // CLOSE
						break;
					}
				}
				
			}
	} // while
	
	NET_DOWN_SIZE = size - 8; // write file size;
	
	#ifdef NETCONFIG_DEBUG	
		PutString("\n\rSize : ");PutITOA(NET_DOWN_SIZE+8);
		PutString("\n\rAll data Received !");
	#endif
	if (!Debug_Off)	PutString("\n\rAll data Received !");
	
	// Jump to Boot
	W_TEST1 = 0xAA; W_TEST2 = 0xFF; W_TEST3 = 0x55;
	
	((void (code *)(void)) BOOT_ADDR)();
	while (1);				  
}

⌨️ 快捷键说明

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