ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
2 июля
315933
sylvan (19.03.2012 12:43, просмотров: 1164)
помогите сделать простейший TCP сервер на кейловском TCP стеке (LPC1768) Задача: на любой вопрос TCP клиента (отправляю с браузера) ответить буквально несколькими байтами. Самый-самый простой случай. Но в связи с тем, что я не нашел исходника сервера с использованием кейловского стека, приходится выдумывать.... Если посмотреть на main, там есть довольно подозрительное tcp_listen() в бесконечном цикле. Его быть не должно. Думаю, раз я в процедуре send_data_tcp() делаю tcp_close(), то потом я должен опять открыть сокет на прослушку. В общем, как-то заработало, но иногда виснет. Отрисовка на TFT длится около 0,5 сек. Если убрать, но не виснет никогда. Но что-то метод не научный совсем. Хотелось бы не угадывать, а узнать как надо. Буду рад любому совету. Спасибо.
/**************************************************************************//**
//TCP test
//CPU: LPC1768
//Compiler: uVision v.4.21, RTL v.4.13
******************************************************************************/

#include "LPC17xx.h"
#include "RTL.h"	     	     
#include "lcd.h"
#include "timer.h"	   	 
#include <string.h>

U8 tcp_soc;		         //socket name
U8 buff_recieve[1024];	 //receive buffer
U8 *sendbuf;	         //buffer to be sent
U32 global_i = 0;
U32 flag_receive = 0;      


unsigned char GetResponse[] =              			// 1st thing our server sends to a client
{
  "HTTP/1.0 200 OK\r\n"                          	// protocol ver 1.0, code 200, reason OK
  "Content-Type: text/html\r\n"                  	// type of data we want to send
  "\r\nStatus=OK_res_"                              // indicate end of HTTP-header
};


void  send_data_tcp (void)
{
 	U16 maxlen;										//max size
	U16 len=0;

	if (tcp_check_send (tcp_soc) == __TRUE) {		//is it ready to send?
	
		maxlen = tcp_max_dsize (tcp_soc);	   		
		sendbuf = tcp_get_buf (maxlen);		   		
	
		memcpy (sendbuf,GetResponse,sizeof(GetResponse)-1);
		len=sizeof(GetResponse)-1;
	
		*(sendbuf+len) = (global_i)/1000 + 0x30; 			len++;
		*(sendbuf+len) = ((global_i)%1000)/100 + 0x30; 		len++;
		*(sendbuf+len) = ((global_i)%100)/10 + 0x30; 		len++;
		*(sendbuf+len) = (global_i++)%10 + 0x30; 			len++;	
		
		tcp_send (tcp_soc, sendbuf,len);	  		//send data
		tcp_close(tcp_soc);							//close the connection
	}
}  


U16 tcp_callback(U8 soc, U8 evt, U8 *ptr, U16 par){	// This function is called by the TCP module on TCP event 
													// Check the 'Net_Config.h' for possible events.         
	switch (evt) {
	case TCP_EVT_DATA:								// TCP data frame has arrived
									    										      
		memcpy(&buff_recieve, ptr, par);			// data length is par2. Allocate buffer to send reply. 	
		flag_receive = 1;
		break;
	case TCP_EVT_CONREQ:							// Remote peer requested connect, accept it 
		return (1);
	case TCP_EVT_CONNECT:							// The TCP socket is connected 
		return (1);
	}
	return (0);
}

				
int main (void)
{  
	SystemInit (); 						//Init system
	
	LCD_Init();	 						// Init Lcd
   	BACK_COLOR = Blue;
	LCD_Clear(Blue);
	LCD_ShowString(10,10,"TCP test:");

	init_TcpNet();
	tcp_soc = tcp_get_socket (TCP_TYPE_SERVER, 0, 30, tcp_callback);

	if (tcp_soc != 0) {
    	tcp_listen (tcp_soc, 80);	 	//Start listening on TCP port 80 
  	}

	while (1)
	{  
		main_TcpNet();
		send_data_tcp(); 				//send!
		
		if (tcp_soc != 0) {
			tcp_listen (tcp_soc, 80);	// listening on TCP port 80 
	  	} 

		if (flag_receive != 0) { 
			LCD_ShowString(100,10,buff_recieve);   // exec time is about 0.5sec!!!
			flag_receive = 0;
		}
	} 			                     					
}