ich besitze Arduino Duemilanove + Ethernet-Shield und versuche, mit dem Gerät Daten über's Netz zu lesen.
Zum Testen möchte ich (z.B.) das WebServer-Beispiel der Ethernet-Library benutzen.
Die IP-Adresse ist passend konfiguriert, ich kann das Shield anpingen, und ein TCP-Connect auf Port 80 funktioniert auch.
Greife ich per Browser auf den Arduino zu, tut sich allerdings gar nichts.
Ich habe daher ein paar Debug-Ausgaben in den Webserver-Code hinzugefügt:
[...]
void loop()
{
Client client = server.available();
if (client) { Serial.print("Client connected. ");
// an http request ends with a blank line
boolean current_line_is_blank = true;
while (client.connected()) { Serial.print("Client still connected. ");
if (client.available()) { Serial.print("Data available. ");
char c = client.read(); Serial.print("Read one character. ");
// if we've gotten to the end of the line (received a newline
[...]
Wenn ich jetzt Daten an das Gerät schicke, sieht die Ausgabe auf dem Serialport so aus:
Client connected. Client still connected. Data available.
Danach kommt genau nichts mehr, Arduino/Shield scheinen im client.read()
zu hängen. Mit meinem Latein bin ich am Ende - hat vielleicht jemand eine Idee, woran's hapern könnte?
funktionieren die beispiele aus den ethernet libraries?
da sind drei drin...
einmal ein webserver
einmal ein web-poller
einmal ein chat-server
ich bin da im moment auch am basteln und hab alles nun endlich am laufen.
wenn du daten aus dem internet holen und parsen willst, dann brauchst du wahrscheinlich bald die "wstring" linrary...
bitte beachte, dass die ein memory leak hat!!! http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1241618944
das hat mich ein paar tage gekostet das ein zu grenzen und einen fix zu finden.
nun geht es aber stabil. und nicht nur ein paar minuten/stunden...
ich hab den "memory test" mit in meinem sketch eingebaut und gebe mir dessen ausgabe auch im web-aufruf an meinen webserver aus.. somit sehe ich im logfile immer wenn der speicher zur neige geht...
seit dem fix in der library bleibt der wert stabil.
o.g. Code-Snippet stammt aus dem WebServer-Beispiel der Ethernet-Library und ist nur ergänzt um die [color=#cc0000]Serial.print(...)[/color] - Statements.
Leider funktioniert bei mir das Beispiel eben nicht.
Langsam muss ich wohl von einem Hardware-Problem ausgehen.
Wenn ich zeitlich dazu komme, werde ich mal versuchen, auf dem Gerät lokalen Client gegen lokalen Server zu connecten - mal sehen, was dabei rauskommt.
mein erster arduino ist im moment fest im einsatz.. aber ein 2. ist bestellt...
wenn er da ist kann ich gerne mal deine sketches testen.
da ich bei mir nur den web-client gebraucht habe, habe ich den web-server nicht probiert.
hast du beim web-client oben auch noch die netzmaske mit rein.. die fehlt da nämlich...
(weiter unten beim starten musst dann auch noch die netzmaske mit starten)
also:
...
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192.168.1.10 }; // ip des arduinos
//byte gateway[] = { 192.168.1.1 }; // optional
byte subnet[] = { 255, 255, 255, 0 }; // netzmaske
...
...
//Ethernet.begin(mac, ip, subnet); // wenn ein gateway angegeben ist
Ethernet.begin(mac, ip, gateway, subnet); // wenn kein gateway angegeben ist
...
evtl mag dein browser deswegen nicht, weil die beiden in unterschiedlichen subnetzen broadcasten.
ohne netzmaske ist das beispiel meiner meinung nach unsinn.
das gateway ist optional.. aber eine netzmaske gehört zwingend zur ip!
Mit der Maske hast Du zwar grundsätzlich Recht, in der Doku steht aber, dass die Maske optional sei und einen Default-Wert bekommt, wenn man diese nicht angibt. Würden Client und Server durch eine nicht passende Netzmaske in unterschiedlichen Netzen liegen, würde auch nicht einmal ein Ping oder der TCP-Connect funktionieren, aber das klappt ja wunderbar.
ich geb alles korrekt an und basta.. LOL
bevor ich mich darauf verlassen muss, dass der standard wert der richtige ist.. neeee nix da.. meine fehler will ich schon selbst durch vertipper machen..
da brauche ich keine kreativen standardwerte die vielleicht passen, vielleicht aber auch nicht.. grins
tut ja net weh die zeile da mit an zu geben und ich bin mir 100% sicher dass es passt.
wenn aber der ping geht, dann sollte auch der rest gehen...
denn ich glaube nicht, dass es einen "hardware-defekt" gibt, der zwar icmp zulässt, aber tcp nicht.
Also, reproduzierbar ist inzwischen folgendes: programmiere ich den Arduino unter Linux, klappt's nie; benutze ich Windows oder OS X, klappt's immer.
/me kratzt sich am Kopf...