INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Alternative Ethernet Library
01.07.2014, 19:58 (Dieser Beitrag wurde zuletzt bearbeitet: 01.07.2014 20:00 von itsy.)
Beitrag #1
Alternative Ethernet Library
Hallo,

ich habe das Problem, dass sich bei häufigen Webanfragen das Ethernetshield aufhängt.

Im Netz habe ich auch schon einige Beiträge dazu gefunden und bin immer wieder auf diese Ethernet-Library gestoßen: klick

Diese soll das Problem lösen.

Die Lib soll kompatibel mit der Standard-Lib sein, sodass ein Sketch ganz einfach weiter genutzt werden kann. Leider funktioniert es aber nicht. Nun habe ich gesehen, dass die originale Lib ein Änderungsdatum von 2012 hat, die Lib aus dem Link jedoch 2009 erstellt wurde. Daher wird sie wohl nicht mehr kompatibel sein.

Ist mit der Änderung von 2012 das Problem in der originalen Lib behoben worden und ich muss den Fehler woanders suchen oder muss ich meinen Sketch umschreiben?

Oder wäre vielleicht die neue Lib für den W5200 kompatibel?

Vielen Dank
itsy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.07.2014, 20:29
Beitrag #2
RE: Alternative Ethernet Library
Hi,
hast Du das Ethernet Shield mit SD Einschub? Wenn ja, dann setze mal Pin 4 explizit auf OUTPUT und HIGH.
Gruss,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.07.2014, 20:31
Beitrag #3
RE: Alternative Ethernet Library
Hallo itsy,

nimm mal bitte aus dem Ordner der Standard Ethernet Lib die Datei client.cpp raus und kopiere diese dafür ein: http://www.etracer.net/arduino/ethernet/Client.cpp

Dann mach mal einen Test.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.07.2014, 20:43
Beitrag #4
RE: Alternative Ethernet Library
Hallo Ihr beiden,

vielen Dank für Eure Antworten.
Jep, es ist das Shield mit SD-Karte und den Pin4 habe ich nun explizit auf HIGH gesetzt.

Ricardo, Deinen Link kann ich leider nicht öffnen ...

Der Test und meine Antwort wird dann leider auf sich warten lassen ...
Zum einen weil der Fehler erst zwischen 1-4 Tagen auftritt und zum anderen, weil ich nächste Woche nicht im Lande bin (vorher möchte ich aber zumindest die neue Version fertig bekommen ;-) ).

Viele Grüße
itsy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.07.2014, 09:34 (Dieser Beitrag wurde zuletzt bearbeitet: 02.07.2014 09:34 von rkuehle.)
Beitrag #5
RE: Alternative Ethernet Library
Hallo itsy,

ich habe den Code für die client.cpp noch woanders finden können.

Grüße Ricardo
Code:
// patch by etracer
// Re: Problem with multpile (fast) client-requests (Eth)

extern "C" {
  #include "types.h"
  #include "w5100.h"
  #include "socket.h"
  #include "string.h"
}

#include "WProgram.h"

#include "Ethernet.h"
#include "Client.h"
#include "Server.h"

uint16_t Client::_srcport = 0;

Client::Client(uint8_t sock) {
  _sock = sock;
}

Client::Client(uint8_t *ip, uint16_t port) {
  _ip = ip;
  _port = port;  
  _sock = 255;
}

uint8_t Client::connect() {

  uint8_t socketStatus;
  uint8_t i=3;

  _sock = 255;

  while ((i < MAX_SOCK_NUM) && (_sock == 255)) {
    socketStatus = getSn_SR(i);
    if ((socketStatus == SOCK_CLOSED) || (socketStatus == SOCK_FIN_WAIT) || (socketStatus == SOCK_CLOSE_WAIT)  || (socketStatus == SOCK_ESTABLISHED)) {
      _sock = i;
    } else {
      i++;
    }
  }
  
  if (_sock == 255)
    return 0;
    
  _srcport++;

  if (_srcport > 64511)
    _srcport = 0;
    
  socket(_sock, Sn_MR_TCP, 1024 + _srcport, 0);
  
  if (!::connect(_sock, _ip, _port))
    return 0;
    
  while (status() != SOCK_ESTABLISHED) {
    if (status() == SOCK_CLOSED)
      return 0;
  }
  
  return 1;
}


void Client::write(uint8_t b) {
  if (_sock != 255)
    send(_sock, &b, 1);
}

void Client::write(const char *str) {
  if (_sock != 255)
    send(_sock, (const uint8_t *)str, strlen(str));
}

void Client::write(const uint8_t *buf, size_t size) {
  if (_sock != 255)
    send(_sock, buf, size);
}

int Client::available() {
  if (_sock != 255)
    return getSn_RX_RSR(_sock);
  return 0;
}

int Client::read() {
  uint8_t b;
  if (!available())
    return -1;
  recv(_sock, &b, 1);
  return b;
}

void Client::flush() {
  while (available())
    read();
}

void Client::stop() {
  if (_sock == 255)
    return;
  
  // attempt to close the connection gracefully (send a FIN to other side)
  disconnect(_sock);
  unsigned long start = millis();
  
  // wait a second for the connection to close
  while (status() != SOCK_CLOSED && millis() - start < 1000)
    delay(1);
    
  // if it hasn't closed, close it forcefully
  if (status() != SOCK_CLOSED)
    close(_sock);
  
  EthernetClass::_server_port[_sock] = 0;
  _sock = 255;
}

uint8_t Client::connected() {
  if (_sock == 255) {
    return 0;
  } else {
    uint8_t s = status();
    return !(s == SOCK_LISTEN || s == SOCK_CLOSED || s == SOCK_FIN_WAIT ||
      (s == SOCK_CLOSE_WAIT && !available()));
  }
}

uint8_t Client::status() {
  if (_sock == 255) {
    //return SOCK_CLOSED;
    return getSn_SR(3);
  } else {
    //return getSn_SR(_sock);
    return getSn_SR(3);
  }
}

// the next three functions are a hack so we can compare the client returned
// by Server::available() to null, or use it as the condition in an
// if-statement.  this lets us stay compatible with the Processing network
// library.

uint8_t Client::operator==(int p) {
  return _sock == 255;
}

uint8_t Client::operator!=(int p) {
  return _sock != 255;
}

Client::operator bool() {
  return _sock != 255;
}

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.07.2014, 21:07
Beitrag #6
RE: Alternative Ethernet Library
Hallo Ricardo,

hab vielen lieben Dank für die Mühe :-)

Ich wollte grade die Client.cpp austauschen, da habe ich erst gesehen, dass ich gar keine Datei mit diesem Namen im Ordner Ethernet habe.

Es gibt nur eine EthernetClient.cpp - soll ich diesen Namen für de Austauschdatei wählen?

Vielen Dank
itsy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.07.2014, 08:51
Beitrag #7
RE: Alternative Ethernet Library
Hallo itsy,

ich habe mich gerade selbst belehren müssen. Der Code der modifizierten client.* files soll wohl schon in der aktuellen Ethernet-Library mit drin sein.
Generell scheint es ein Problem zu sein,was einerseits das Timing zwischen aufeinanderfolgenden cleint.print()-Aufrufen betrifft und andererseits den Rückgabewert von client.stop() betrifft.
Hier gibts nochmal ein paar Hinweise wie man feststellen kann welcher der beiden Punkte den Fehler verursacht und wie man für diese einen workaround setzen kann:
http://forum.arduino.cc/index.php/topic,28084.0.html

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.07.2014, 19:25
Beitrag #8
RE: Alternative Ethernet Library
Hallo Ricardo,

hab vielen Dank :-) Na das ist ja ne Hausaufgabe - vor allem, wenn man noch die Links der Links der Links durchliest ;-)

Habe schon ein paar Sachen gefunden, die ich jetzt mal testen werde.

So habe ich z.B. client.flush() nach einem close eingefügt und beim Connect habe ich immer client.println("Connection: close"); vergessen. Letzteres scheint hierfür nicht ausschlaggebend zu sein, aber ein Versuch ist es wert ;-)

Viele Grüße
itsy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Library unter Linux Mint installieren atmel900 1 78 22.11.2016 14:12
Letzter Beitrag: rkuehle
  Arduino UNO und Ethernet Shield 2 POE und Fritzbox 3272 tr3 2 151 19.11.2016 10:46
Letzter Beitrag: tr3
  Dallas Temp Library und LiquidCrystal_i2c relay 20 463 27.10.2016 12:20
Letzter Beitrag: hotsystems
  Problem mit SD Card Library BennIY 4 186 06.10.2016 18:38
Letzter Beitrag: Bitklopfer
  Ethernet Modul Enc28j60 Pin13 LED Schalten BennIY 16 498 27.09.2016 20:30
Letzter Beitrag: BennIY
  Wo kann ich hier noch Code spahren? (SPI-,Ethernet-,SD-,GSM-Library) avoid 4 377 05.06.2016 14:16
Letzter Beitrag: avoid
  [Suche] Library Programmierer/in für privates Projekt avoid 8 577 19.05.2016 15:01
Letzter Beitrag: avoid
  PID ohne Library MeisterQ 5 526 01.05.2016 09:23
Letzter Beitrag: MeisterQ
  Daten per Ethernet Shield 2 senden Mark79 3 860 22.03.2016 19:29
Letzter Beitrag: Mark79
  Problem mit Pin Change Interrupt in Library Retian 0 319 10.02.2016 23:37
Letzter Beitrag: Retian

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste