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

📄 main.c

📁 用MCS51 单片机的TCIP协议的测试,很基本的程序,对新手可能有帮助!
💻 C
📖 第 1 页 / 共 2 页
字号:
					send(i, &sio_buf[read], D_size);
				}
				else {
				memcpy(&temp_sio_buf[0], &sio_buf[read], tmp_cnt);
				memcpy(&temp_sio_buf[tmp_cnt], &sio_buf[0], wr_ptr);
				send(i, &temp_sio_buf[0], D_size);
					
				}
				read += D_size;
			}
			else {
				send(i, &sio_buf[read], D_size);
				read += D_size;
			}
			D_sendOK = 0;
			C_sendOK = 0;
			T_sendOK = 0;
		}
		
		if (T_sendOK == 1) {
			flag = Calc_dSize();
			if (flag == 2) return;
			if (flag) {
				memcpy(&temp_sio_buf[0], &sio_buf[read], tmp_cnt);
				memcpy(&temp_sio_buf[tmp_cnt], &sio_buf[0], wr_ptr);
				send(i, &temp_sio_buf[0], data_cnt);
				
				read = wr_ptr;
			}
			else {
				send(i, &sio_buf[read], data_cnt);
				read += data_cnt;
			}
			D_time_cnt = 0;
			T_sendOK = 0;
		}
	}
}

void Update_Status(u_char flag)
{
	if (flag) {		// connected : Low
		P1 &= 0xFB; 
	}else {			// not connected : High
		P1 |= 0x04; 
	}
}


/*
********************************************************************************
* Description : Main 
* Arguments   : None
* Returns     : None
* Note        : 
********************************************************************************
*/
void main()
{
	SOCKET i;
	u_char j;
	u_char state;
	int len;
	u_char xdata addr[4];		// Variable to be used in network configuration and recvfrom()
	u_long xdata SpecifiedAddr;
	u_char xdata addrstr[16];
	u_int port;			// Variable to be used to store Destination Port in recvfrom()
	u_int RecvSize;			// Variable to be used to store received data size
	SOCKET s;      			// Variable to be used to designate channel of W3100A
	char IsFirstRecv = 0;		// Variable to be used to have been received data alreay. when it is set, Data is alreay received.
	
	EA = 0; 			// All interrupt disable
	
	Verify_RC2();		// 
	Verify_EEPROM();	// Check Valid EEPROM
	
	// Read MAC, DEBUG, DHCP option
	for (j = 0; j < 6; j++) Mac[j] = EEP_Read(EE_MAC1+j);
	Debug_Off = (bit)(EEP_Read(EE_DEBUG));
	DHCPisSet = (bit)(EEP_Read(EE_DHCP));
	
	Init_Interrupt(); 	// Init 8051 Interrupt
	
RESTART :
	// Init buffer pointer
	wr_ptr = 0;
	write = 0;
	read  = 0;
	
	// Init Flow control variable
	buffer_full = 0;	
	Stop_Sending = 0;
	
	closeOK = 0;
	I_time_cnt = 0 ;
	my_time = 0;
	DHCPisSuccess = 0;

	K_time = 0;	
	Enable_SP = 0;
	
	m_bSetted = 0; 
	m_bConnectSvr = 0;
	m_bConnectCli = 0;
	
	if (Flow_Ctrl == F_RTS) Loopback_CTS();
	Init_SerialInt();
	EA = 1;
	
	if (!Debug_Off) {
		PutString(" Ver. ");PutHTOA(SW_VERSION_H);PutByte('.');PutHTOA(SW_VERSION_L);
	}
	
	Init_Timer0();
	
	if (DHCPisSet) {
		Init_Net_Default();		// Init by 0.0.0.0
		Init_Net_DHCP();
	}else Init_Net();			// Init by EEPROM
	
	SetupOption();				// Init option
	
	if (!Debug_Off) PutString("\n\r> broad socket : ");
	s = 0; 				// Use channel #0 of W3100A
	socket(s,SOCK_DGRAM,3000,0);	// Open UDP channel
	socket(SOCK_CONFIG, SOCK_DGRAM, REMOTE_CLIENT_PORT, 0x80);
	if (!Debug_Off)	PutStringLn("OK..");
	
	Update_Status(0);
	
	i = SOCK_DATA;
	while (1) {
		if (Flow_Ctrl == F_RTS) Loopback_CTS();
		if ((DHCPisSet == 1) && (DHCPisSuccess == 1)) check_dhcp();
		
		if (Recv_ConfigMsg() == 1) break;
		
		if (Enable_SP) {
			if (select(i, SEL_SEND) == SSIZE[i]) {
				Send_KeepalivePacket(i);
			}
			Enable_SP = 0;
		}
		
		if (m_bSetted == 0)
		{
			init_sock(i);
			wait_10ms(10); 
		}
	while(1)									// Ping-Pong Service Routine
	{
		RecvSize = select(s,SEL_RECV);						// When received data from port #3000, read the size and send it to peer's port #3000
		if(RecvSize > 0)
		{
			RecvSize = recvfrom(s,(u_char xdata *)&sock_buf,RecvSize,addr,&port);
			if(-1 == RecvSize)						// Read data as size as buffer received
			{
				PutStringLn("\r\n<<<< Receive Fail >>>>");
			 	break;
			}
			if(!IsFirstRecv)
			{
				SpecifiedAddr = *((u_long*)addr);
				IsFirstRecv = 1;
			}
			inet_ntoa(addr,addrstr);
                        if(IsFirstRecv && SpecifiedAddr == *((u_long*)addr))		// it can receive data from another peer, but it can't send received data to the peer.
			{
				PutString(addrstr);PutString(" : Received Size = ");PutITOA(RecvSize);
				RecvSize = sendto(s,(u_char xdata *)&sock_buf,RecvSize,addr,port);
				if(RecvSize == -1)					// Loopback received data to destination : Ping-Pong
				{
					PutStringLn("\r\n<<<< Send Fail >>>>");
					break;
				}
				PutString(", Sended Size = ");PutITOA(RecvSize);PutStringLn("");
			}
			else	              						// if the board received data from another peer
			{
				PutString("Unknown peer send 'PING' to the board : ");PutString(addrstr);PutStringLn("");
			}
		}
	}
//		else
//		{
			if (m_bServer == 1) 
			{// Server Mode
			
				if ( m_bConnectSvr == 1 || m_bConnectCli == 1)
				{ 
					
					state = select(i, SEL_CONTROL);
					if ( closeOK == 0 && state == SOCK_ESTABLISHED )
					{	
						// Ethernet to Serial
						if ((len = select(i, SEL_RECV)) > 0) Ether2Serial(i, len);
						
						// Serial to Ethernet
						EA = 0;
							wr_ptr = write;
						EA = 1;
						
						if (wr_ptr == read) {
							if ((Flow_Ctrl == F_XON) && (buffer_full == 1)) {
								EA = 0;
									PutByte(XON);
								EA = 1;
								buffer_full = 0;
							}
						}else { // if there are data to send...
								Serial2Ether(i);
						}
					}
					else
					{
						if ((len = select(i, SEL_RECV)) > 0) 
						{
							Ether2Serial(i, len);
						}
					
						if (!Debug_Off) {
							PutStringLn("Listen socket CLOSED");
						}
						close(i);
						break;
					}
				}
				else
				{ 
					if (sock_state[i] == SOCK_LISTEN) {
						state = select(i, SEL_CONTROL);				
						if (state == SOCK_ESTABLISHED)
						{	
							if (!Debug_Off) PutStringLn("connected");
							sock_state[i] = SOCK_ESTABLISHED;		
							m_bConnectSvr = 1;
							
							Update_Status(1);
							
							EA = 0;
							closeOK = 0;
							I_time_cnt = 0;
							
							EA = 1;
						} 
						else if (state == SOCK_CLOSE_WAIT) 
						{		
							if (!Debug_Off) PutStringLn("Server socket CLOSED");
							close(i);
							break;
						}
						else if (state == SOCK_CLOSED)
						{	
							if (!Debug_Off) PutStringLn("Server socket CLOSED");
							break;
						}
					}
					
					if (m_bConnectSvr == 0)
					{
						EA = 0;
						wr_ptr = write;
						EA = 1;
						
						if (wr_ptr != read)
						{ 
							m_bSetted = 0;
							m_bConnectCli = 1;
						}
					}
				}
			}
			else
			{ // Client Mode
				if ( m_bConnectCli == 1)
				{ 
					state = select(i, SEL_CONTROL);
					if ( closeOK == 0 && state == SOCK_ESTABLISHED )
					{
						if ((len = select(i, SEL_RECV)) > 0) Ether2Serial(i, len);
						
						// Serial to Ethernet
						EA = 0;
							wr_ptr = write;
						EA = 1;
						
						if (wr_ptr == read) {
							if ((Flow_Ctrl == F_XON) && (buffer_full == 1)) {
								EA = 0;
									PutByte(XON);
								EA = 1;
								buffer_full = 0;
							}
						}else { // if there are data to send...
								Serial2Ether(i);
						}
					}
					else
					{
						if ((len = select(i, SEL_RECV)) > 0) 
						{
							Ether2Serial(i, len);
						}
						
						if (!Debug_Off) PutStringLn("Client socket CLOSED");
						close(i);
						break;
					}
				}
			} // client mode
//		}
	} // while 
	
	if (!Debug_Off) PutStringLn("\n\r RESTART ");
	
	Update_Status(0);
	
	close(i);
	goto RESTART;
}

/*
********************************************************************************
* Description : Re-initialization function for the disconnected channel.
* Arguments   : i - socket number
* Returns     : None
* Note        : 
********************************************************************************
*/
void init_sock(u_char i) 
{
	u_char val1, val2;
	u_int listenport;
	
	u_char j, PeerIP[4];
	u_int PeerPort;
	
	if (select(i, SEL_CONTROL) != SOCK_CLOSED) close(i);
	wait_10ms(1);

	if (m_bServer == 1 && m_bConnectCli == 0)
	{
		val1 = EEP_Read(EE_LPORTH);
		val2 = EEP_Read(EE_LPORTL);
		listenport = (u_int)((val1 << 8) + val2);
		
		if (!Debug_Off) PutString("listen : ");
		while ( socket(i, SOCK_STREAM, listenport, 0x80) == -1) ;
		NBlisten(i);
		if (!Debug_Off) PutStringLn("ok ...");
		sock_state[i] = SOCK_LISTEN;
		m_bSetted = 1;
	}
	else
	{
		val1 = EEP_Read(EE_SPORTH);
		val2 = EEP_Read(EE_SPORTL);
		PeerPort =  (val1 << 8) + val2;
		
		for (j = 0; j < 4; j++) {
			PeerIP[j] = EEP_Read(EE_SIA1 + j);
		}
		
		while ( socket(i, SOCK_STREAM, clientport++, 0x80) == -1) ;
		
		if (!Debug_Off) {
			PutITOA(clientport-1);
			PutString(" connect : ");
		}
		if (connect(i, PeerIP, PeerPort) == -1) {		
			m_bSetted = 0;
			m_bConnectCli = 0;
			EA = 0;
			wr_ptr = 0;
			write = 0;
			read  = 0;
			EA = 1;
			if (!Debug_Off) PutStringLn("connect fail");
		}
		else
		{
			m_bSetted = 1;
			m_bConnectCli = 1;
			
			Update_Status(1);
			
			EA = 0;
			closeOK = 0;
			I_time_cnt = 0;
			EA = 1;
			if (!Debug_Off) PutStringLn(" ok..");
		}
	}
}

⌨️ 快捷键说明

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