TCP/IP STACK, bir sıkıntı var...

Başlatan RcALTIN, 24 Aralık 2011, 13:14:08

RcALTIN

microchip tcp/ip stack 'ın ccs versiyonunu kullanıyorum. ex13.c den yola çıkarak bir tcp client deneme uygulaması yaptım. ilk başlarda herşey güzel giderken, bir süre sonra TCPIsPutReady(socket) fonksiyonundan FALSE dönüyor ve çok uzun bir süre böyle devam ediyor, dolayısıyla uzun süre server programıma veri gönderemiyorum, sorun ne olabilir? buffer doluyor da temizlemek mi gerekiyor yoksa?

kodlarla örneklemek gerekirse,

ex13.c :
//////////////////////////////////////////////////////////////////////////////
//
// ex13.c - Example 13 from the Embedded Internet/Embedded Ethernet tutorial
//
// A TCP example, where the PIC acts as a TCP client.  Connects to a PC running
// the CCS provided example program TCPSERVER.EXE.  TCPSERVER.EXE listens to
// port 1000 for TCP connections.
//
// NOTE: You MUST change the code in ServerAddrInit() to specify the IP address
//       of the PC running TCPSERVER.EXE
//
// NOTE: Change the code in IPAddrInit() to your desired IP address, which
//       is based on your network.
//
//////////////////////////////////////////////////////////////////////////////

//use this example with the CCS provided TCPSERVER.EXE

#define STACK_USE_ICMP  1
#define STACK_USE_ARP   1
#define STACK_USE_TCP   1
#include "ccstcpip.h"

#if STACK_USE_CCS_PICENS
 #include "tcpip/mlcd.c"
#elif STACK_USE_CCS_PICEEC
 #include "tcpip/elcd.c"
#else
 #include "tcpip/dlcd.c"
#endif

//IP address of the PC running TCPSERVER.EXE
IP_ADDR server;

#define EXAMPLE_TCP_PORT   (int16)1000

//this function is called by MyTCPTask() when the specified socket is connected
//to the PC running the TCPSERVER.EXE demo.
//returns TRUE if BUTTON2 was pressed, therefore we must disconnect the socket
int8 TCPConnectedTask(TCP_SOCKET socket) {
   char c;
   static int8 counter;
   char str[20];
   static int8 button1_held;

   if (TCPIsGetReady(socket)) {
      printf(lcd_putc,"\n                 \n");
      while (TCPGet(socket, &c)) {
         lcd_putc(c);
      }
   }

//when button 1 is pressed: send message over TCP
//when button 2 is pressed: disconnect socket
   if (BUTTON1_PRESSED() && !button1_held && TCPIsPutReady(socket)) {
      button1_held=TRUE;
      sprintf(str,"BUTTON C=%U",counter++);
      TCPPutArray(socket,str,strlen(str));
      TCPFlush(socket);
   }
   if (!BUTTON1_PRESSED()) {
      button1_held=FALSE;
   }
  #if defined(BUTTON2_PRESSED())
   if (BUTTON2_PRESSED()) {
      return(TRUE);
   }
  #endif
   return(FALSE);
}

void MyTCPTask() {
   static TICKTYPE lastTick;
   static TCP_SOCKET socket=INVALID_SOCKET;
   static enum {
      MYTCP_STATE_NEW=0, MYTCP_STATE_ARP_REQ=1, MYTCP_STATE_ARP_WAIT=2,
      MYTCP_STATE_CONNECT=3, MYTCP_STATE_CONNECT_WAIT=4,
      MYTCP_STATE_CONNECTED=5, MYTCP_STATE_DISCONNECT=6,
      MYTCP_STATE_FORCE_DISCONNECT=7
   } state=0;
   static NODE_INFO remote;
   TICKTYPE currTick;
   int8 dis;

   currTick=TickGet();

   switch (state) {
      case MYTCP_STATE_NEW:
         memcpy(&remote.IPAddr, &server, sizeof(IP_ADDR));
         printf(lcd_putc,"\nARP REQUEST     ");
         state=MYTCP_STATE_ARP_REQ;

      case MYTCP_STATE_ARP_REQ:
         if (ARPIsTxReady()) {
            ARPResolve(&remote.IPAddr);
            lastTick=currTick;
            state=MYTCP_STATE_ARP_WAIT;
         }
         break;

      case MYTCP_STATE_ARP_WAIT:
         if (ARPIsResolved(&remote.IPAddr, &remote.MACAddr)) {
            state=MYTCP_STATE_CONNECT;
            printf(lcd_putc,"\nCONNECTING      ");
         }
         else if (TickGetDiff(currTick, lastTick) > (TICKS_PER_SECOND * 2)) {
            state=MYTCP_STATE_ARP_REQ;
         }
         break;

      case MYTCP_STATE_CONNECT:
         socket=TCPConnect(&remote, EXAMPLE_TCP_PORT);
         if (socket!=INVALID_SOCKET) {
            lastTick=TickGet();
            state=MYTCP_STATE_CONNECT_WAIT;
         }
         else {
            printf(lcd_putc,"\nSOCKET ERROR    ");
         }
         break;

      case MYTCP_STATE_CONNECT_WAIT:
         if (TCPIsConnected(socket)) {
            state=MYTCP_STATE_CONNECTED;
            printf(lcd_putc,"\nCONNECTED!      ");
         }
         else if (TickGetDiff(currTick, lastTick) > (TICKS_PER_SECOND * 10)) {
            state=MYTCP_STATE_FORCE_DISCONNECT;
         }
         break;

      case MYTCP_STATE_CONNECTED:
         if (TCPIsConnected(socket)) {
            dis=TCPConnectedTask(socket);
            if (dis) {
               state=MYTCP_STATE_DISCONNECT;
               lastTick=currTick;
            }
         }
         else {
            printf(lcd_putc,"\nDISCONNECTED    ");
            state=MYTCP_STATE_CONNECT;
         }
         break;

      case MYTCP_STATE_DISCONNECT:
         printf(lcd_putc,"\nDISCONNECTING   ");
         if (TCPIsPutReady(socket)) {
            state=MYTCP_STATE_FORCE_DISCONNECT;
         }
         else if (TickGetDiff(currTick, lastTick) > (TICKS_PER_SECOND * 10)) {
            state=MYTCP_STATE_FORCE_DISCONNECT;
         }
         break;

      case MYTCP_STATE_FORCE_DISCONNECT:
         TCPDisconnect(socket);
         state=MYTCP_STATE_CONNECT;
         break;
   }
}

void ServerAddrInit(void) {
   //IP address of the PC running TCPSERVER.EXE
   server.v[0]=192;
   server.v[1]=168;
   server.v[2]=100;
   server.v[3]=112;
}

void main(void) {
   printf("\r\n\nCCS TCP/IP TUTORIAL, EXAMPLE 13 (TCP CLIENT)\r\n");

   MACAddrInit();
   IPAddrInit();

   ServerAddrInit();

   init_user_io();

   lcd_init();

   printf(lcd_putc,"\fCCS TCP TUTORIAL\nINIT");

   StackInit();

   while(TRUE) {
      StackTask();
      MyTCPTask();
   }
}


deneme projemden ilgili kısım:
int8 TCPConnectedTask(TCP_SOCKET socket) {
   char tagID[8];
   char c;
   
   if (TCPIsGetReady(socket)) {
      printf(lcd_putc,"\t                 \t");
      while (TCPGet(socket, &c)) {
         lcd_putc(c);
      }
   }
   
   lcd_putc("\v<SEEKING FOR TAG...>");
   if(sm130_GetTagID(tagID)) {
      printf(lcd_putc,"\vID:%2X.%2X%2X%2X%2X%2X%2X%2X",tagID[0],tagID[7],tagID[6],tagID[5],tagID[4],tagID[3],tagID[2],tagID[1]);
      delay_ms(500);
      while(!TCPIsPutReady(socket)){
         lcd_putc("\t<PUT IS NOT READY! >");
      }
      TCPPutArray(socket,tagID,sizeof(tagID));
      TCPFlush(socket);
      memset(tagID, 0, 8);
   }
   return(FALSE);
}
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

fryrmnd

hocam kusura bakmayın sorunuza cevap değil ama microchipin ccs ce  için tcp\ıp stack ı mı var?

RcALTIN

Alıntı yapılan: fryrmnd - 24 Aralık 2011, 13:31:21
hocam kusura bakmayın sorunuza cevap değil ama microchipin ccs ce  için tcp\ıp stack ı mı var?

ccs'in kitleri için zamanında çevirmişler microchip stack'ını (sanırım v3.75 microchip stack'dan). c18'e alışkın olmadığımdan stack olayına önce ccs ile başlamak istedim...

bu arada sıkıntıyı kendim çözer gibi oldum:
int8 TCPConnectedTask(TCP_SOCKET socket) {
   char tagID[8];
   char c;
   
   if (TCPIsGetReady(socket)) {
      printf(lcd_putc,"\t                 \t");
      while (TCPGet(socket, &c)) {
         lcd_putc(c);
      }
   }
   
   lcd_putc("\v<SEEKING FOR TAG...>");
   if(sm130_GetTagID(tagID)) {
      printf(lcd_putc,"\vID:%2X.%2X%2X%2X%2X%2X%2X%2X",tagID[0],tagID[7],tagID[6],tagID[5],tagID[4],tagID[3],tagID[2],tagID[1]);
      delay_ms(500);
      while(!TCPIsPutReady(socket)){
         lcd_putc("\t<PUT IS NOT READY! >");
         StackTask();
      }
      TCPPutArray(socket,tagID,sizeof(tagID));
      TCPFlush(socket);
      memset(tagID, 0, 8);
   }
   return(FALSE);
}


while içinde StackTask(); ı çağırmayınca güncelleme olmadığından hiç TRUE dönmüyor tabi, şimdi 1-2 saniye içinde TRUE dönüyor fakat 1-2 saniye beklemesinin nedeni ne? şuan kafamı meşgul eden sorun bu...
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

frederic

rc_altın hocam bu stack kullanımı hakkında sıkıntı yaşamaktayım,rehber niteliğinde bu stackı nasıl kullanabileceğimizi görebileceğimiz bir örnek paylaşabilirmisiniz acaba?

RcALTIN

Alıntı yapılan: frederic - 25 Nisan 2012, 00:36:43
rc_altın hocam bu stack kullanımı hakkında sıkıntı yaşamaktayım,rehber niteliğinde bu stackı nasıl kullanabileceğimizi görebileceğimiz bir örnek paylaşabilirmisiniz acaba?

son mesajı gönderdiğim günden beri derslerimden dolayı artık ilgilenemiyorum ne projelerimle ne de hobilerimle.(dikey geçişli öğrenciyim, dönem başına en kazıklarından 10 dersim var :) ) üst mesajlarda bahsettiğim example dosyalarını inceleyerek fikir sahibi olmuştum ben, siz de inceleyin. fakat yine son mesajımda bahsettiğim gibi en son 1-2 saniyeliğine iletişim kopması(veri gönderememe) gibi bir sıkıntı vardı, çözmek için daha fazla araştırma zamanım olmadı...
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

frederic

Allah yardım etsin hocam o zaman hayırlısıyla geçersiniz İnşAllah derslerinizi,dediğiniz gibi bakıp çalışmaya devam artık,selametle.

alemali

bu işi c# la cihaz arasında bağlantı kurarak yapan var mı acaba.
mesela 1kB lik blok byte diziyi  bilgiyi 18f4620 ye ardı ardına gönderip hızını ölçmek isterim..
bundan sonraki aşama PCI veri yolu ama onunla ilgili pek bişe yok. c de portlara erişim vardıda c# ta nasıl bilmiyorum..
kolay helsin.. ;)

emre salman

hocam sizin bahsettiğiniz ex13.c örneğini bulamadım benyada ccs c nin tcp ile ilgili bir örneğini bulamadım hiç sadece pic wizzardın içinde var

gokhangokcen

#8
selamlar cümleten, tcpip client uygulaması ile alakalı bir sorunum var.

#include <main.h>

#use rs232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7,BITS=8,PARITY=N,STOP=1)

int1 g_MyHttpSending = FALSE;
char g_MyHttpResponse[254];


long i=0;
int deger;

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

/* The CCS HTTP Client library is very flexible in the manners of which
data can be sent to the remote HTTP server an how to read response
data from the remote HTTP server. See the ccs_http_client.h file for
a full documentation of this API. */
void MyHttpSend(void)
{
   // there are also non-ROM versions of these functions if you want to
   // dynamically control the parameters.
   HttpClientSetHostNameROM((rom char*)"192.168.1.106");
   HttpClientSetUrlROM((rom char*)"/a.asp");
   HttpClientSetHostPort(80);
//   HttpClientSetCustomHeadersROM((rom char*)"text/html\r\ncharset=ISO-8859-1");
   HttpClientSetResponseBuffer(g_MyHttpResponse,sizeof(g_MyHttpResponse));

   HttpClientStart();
}

void IPAddressInit(void)
{
   //MAC address of this unit
   MY_MAC_BYTE1=MY_DEFAULT_MAC_BYTE1;
   MY_MAC_BYTE2=MY_DEFAULT_MAC_BYTE2;
   MY_MAC_BYTE3=MY_DEFAULT_MAC_BYTE3;
   MY_MAC_BYTE4=MY_DEFAULT_MAC_BYTE4;
   MY_MAC_BYTE5=MY_DEFAULT_MAC_BYTE5;
   MY_MAC_BYTE6=MY_DEFAULT_MAC_BYTE6;

   //IP address of this unit
   MY_IP_BYTE1=MY_DEFAULT_IP_ADDR_BYTE1;
   MY_IP_BYTE2=MY_DEFAULT_IP_ADDR_BYTE2;
   MY_IP_BYTE3=MY_DEFAULT_IP_ADDR_BYTE3;
   MY_IP_BYTE4=MY_DEFAULT_IP_ADDR_BYTE4;

   //network gateway
   MY_GATE_BYTE1=MY_DEFAULT_GATE_BYTE1;
   MY_GATE_BYTE2=MY_DEFAULT_GATE_BYTE2;
   MY_GATE_BYTE3=MY_DEFAULT_GATE_BYTE3;
   MY_GATE_BYTE4=MY_DEFAULT_GATE_BYTE4;

   //subnet mask
   MY_MASK_BYTE1=MY_DEFAULT_MASK_BYTE1;
   MY_MASK_BYTE2=MY_DEFAULT_MASK_BYTE2;
   MY_MASK_BYTE3=MY_DEFAULT_MASK_BYTE3;
   MY_MASK_BYTE4=MY_DEFAULT_MASK_BYTE4;
}

void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_comparator(NC_NC_NC_NC);
setup_wdt(WDT_OFF);
setup_ccp1(CCP_OFF);

set_tris_a(0b00000010);
set_tris_b(0x00);
set_tris_c(0b10010000);
set_tris_d(0x00);
set_tris_e(0x00);

output_a(0x00);
output_b(0x00);
output_c(0x00);
output_d(0x00);
output_e(0x00);

   IPAddressInit();
   TickInit();
   enable_interrupts(GLOBAL);
   StackInit();


   while(TRUE)
   {

      StackTask();

      StackApplications();
      


      if (!input(PIN_A1))    // todo: specify action condition, like a button press
      {
         g_MyHttpSending = TRUE;
         MyHttpSend();
         output_high(PIN_B1);
         puts(g_MyHttpResponse);
         delay_ms(1000);
         output_low(PIN_B1);
         deger=HttpClientGetResult();
         putc(deger);
      }
      else if (!HttpClientIsBusy() && g_MyHttpSending)
      {
         g_MyHttpSending = FALSE;

         // todo: if you want to see the pass/fail of the request,
         //       use HttpClientGetResult()

         // todo: if you want to see the data read from the server,
         //       look at the g_MyHttpResponse[] string
      }

      //TODO: User Code
      i++;
      if(i>=1000)
      {
      output_toggle(PIN_B0);
      i=0;
      }
      
      if(g_MyHttpResponse[0]=='O')
      {output_high(PIN_B3);}
      else{output_low(PIN_B3);}
   }

}


#include <18F4620.h>
//#device ADC=10

#fuses hs,nowdt,nolvp,nodebug,noprotect,nomclr
#define STACK_USE_CCS_HTTP_CLIENT
/*
TCP/IP Stack enabled.
Many TCP/IP configuration settings (servers enabled, ports used,
etc) are defined in TCPIPConfig.h.
Many hardware configuration settings (SPI port and GPIO pins used)
are defined in HardwareProfile.h.
*/

#include "tcpip/p18cxxx.h"
//#use delay(clock=40MHz,crystal=10MHz)
#use delay(clock=10M)


#define MIN(a,b)  ((a > b) ? b : a)

#include <stdint.h>
#include "tcpip/StackTsk2.h"
#include "tcpip/TCPIPConfig.h"
#include "tcpip/HardwareProfile.h"

typedef struct
{
   BYTE vSocketPurpose;
   BYTE vMemoryMedium;
   WORD wTXBufferSize;
   WORD wRXBufferSize;
} TCPSocketInitializer_t;

#if TCP_CONFIGURATION > 0
   TCPSocketInitializer_t TCPSocketInitializer[TCP_CONFIGURATION] =
   {
      #if defined(STACK_USE_CCS_HTTP2_SERVER)
         {TCP_PURPOSE_HTTP_SERVER, TCP_ETH_RAM, STACK_CCS_HTTP2_SERVER_TX_SIZE, STACK_CCS_HTTP2_SERVER_RX_SIZE},
      #endif
      #if defined(STACK_USE_SMTP_CLIENT)
         {TCP_PURPOSE_DEFAULT, TCP_ETH_RAM, STACK_CCS_SMTP_TX_SIZE, STACK_CCS_SMTP_RX_SIZE},
      #endif
      #if defined(STACK_USE_MY_TELNET_SERVER)
         {TCP_PURPOSE_TELNET, TCP_ETH_RAM, STACK_MY_TELNET_SERVER_TX_SIZE, STACK_MY_TELNET_SERVER_RX_SIZE},
      #endif
      #if defined(STACK_USE_CCS_HTTP_CLIENT)
         {TCP_PURPOSE_GENERIC_TCP_CLIENT, TCP_ETH_RAM, STACK_MY_HTTPC_TX_SIZE, STACK_MY_HTTPC_RX_SIZE},
      #endif
   };
#else
   #undef TCP_CONFIGURATION
   #define TCP_CONFIGURATION 1
   TCPSocketInitializer_t TCPSocketInitializer[TCP_CONFIGURATION] =
   {
      {TCP_PURPOSE_DEFAULT, TCP_ETH_RAM, 250, 250}
   };
#endif

#include "tcpip/StackTsk2.c"


sıkıntım ise şöyle, devre ile bilgisayardaki asp,php,htm,html uzantılı bir dosyaya sorgu atmak içindeki verileri okumak. Fakat işlemci sorgu atıyor geriye cevap dönmüyor. Dönen hata kodu ise 0x05 yani help dosyasından baktığımda
   // HTTP server didn't respond with HTTP/1.x yyy status code
   HTTP_CLIENT_EC_NO_HTTP_STATUS_CODE = 5,


şeklinde bir bilgi var. Gelen veriyi seri porta yansıttığımda ise dönen veri;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/

şeklinde. bilgisayara tcpip üzerinden gelen paketleri inceleyen program kurdum. Programın loglarına baktığımda ise devre bağlanmaya çalışmış ama "bad request" bilgisi geri göndermiş. Bir türlü işin içinden çıkamadım. Kodları koydum ekstradan kütüphane ihtiyacı olursa oradakileride ekleyebilirim. İnclude dosyalarında bir sorun olacağını düşünmüyorum.
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

iyildirim

Dönen sayfanın en başına HTTP headerlarını eklemeniz gerek.

gokhangokcen

hocam biraz daha açıklar mısınız olayı kavrayamadım mümkünse örnekle desteklesek daha iyi olacak
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

iyildirim

Dönen bilgide ilk olarak HTTP headerları olur hocam.
Aşağıdaki gibi. 
HTTP/1.1 200 OK seti
Content-type: text/html;charset=iso-8859-9
Content-length: 825
Date: Thu, 03 Nov 2011 03:27:53 GMT
Connection: close


Buna göre tarayıcı sayfa bulundu, bulunamadı, dönen bilgi içeriği HTML mi,  jpeg resim mi, hangi karakter seti , dönen bilgi uzunluğu kaç bayt vs. gibi bilgileri yorumlayabilir.
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

gokhangokcen

hocam asp kısmında çok bilgim yok örnek bir asp tabanlı kod verebilme şansınız var mı ? ayrıca kart internete bağlı olduğu için weather.com gibi sitelerden hava durumu çekmeye çalıştım onlarda da aynı hatayı aldım. json tabanlı veri çekmeye çalıştım ondada dönen hata aynı idi
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

iyildirim

Hocam,  asp deyince bi daha baktım da, siz PC de ki asp sayfasını okumaya çalışıyorsunuz. Header eklemeniz gerekli derken web sunucunun PIC üzerinde olduğunu düşünerek  cavep vermiştim. Kusuruma bakmayın.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/

kısmı header dan temizlenmiş hali.

Mümkünse header ile olan, native dönen cevaba paylaşın. Birde Request olarak header da dahil ne gönderdiğinizi.
Diğer sitelerde de aynı hatayı alıyorsanız istek gönderirken birşeyi kaçırıyorsunuz.

 

gokhangokcen

<%

Response.write "OK"
Response.end
Connection: close

%>
hocam sanırım bu koddan bahsettiniz?  asp dosyası bu
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.