Go Down

Topic: 240x40 Array per Ethernet an PC übertragen? (Read 1 time) previous topic - next topic

mwyraz

#5
Feb 02, 2013, 08:59 pm Last Edit: Feb 02, 2013, 09:03 pm by mwyraz Reason: 1
Wenn die Daten sequentiell entstehen und nicht ins RAM passen, würde ich sie einfach sequentiell an den PC senden und da zusammenbauen.
So in der Art:

EthernetUDP Udp;
...
for (int zeile=0;zeile<240;zeile++) {
  Udp.beginPacket(remoteIP,remotePort);
  for (int spalte=0;spalte<40;spalte++) {
    Udp.write(wert_von(zeile,spalte));
  }
  Udp.endPacket();
}

So könntest du die Werte zeilenweise senden und auf dem PC wieder zusammenbauen. Es würde auch Integer-weise oder in anderer "Stückung" gehen :-)

PS: gerade gelesen, dass aus Performancegründen nicht alles einzeln geschickt werden soll - in dem Fall würde ich immer so viel senden, wie eben noch ins RAM passt. Also nach X Bytes einfach Udp.endPacket(); gefolgt von Udp.beginPacket(remoteIP,remotePort);
Bei Ethernet beträgt die MTU, also die maximale Größe eines einzelnen IP-Paketes, bevor es fragmentiert wird, 1500 Byte. D.h. es wird im Falle von UDP sowieso kaum weniger effizient, die Pakete zu splitten.

mkl0815

UDP ist für diesen Zweck ungeeignet, da es keinerlei Verbindungskontrolle gibt. Selbst die Reihenfolge der Pakete die beim PC ankommen muss nicht die gleiche sein, wie beim losschicken. Entweder man baut das in das eigene Protokoll mit ein (inkl. erneutes Übertragen von Paketen die nicht angekommen sind), oder man verwendet gleich TCP, da bekommt man das nämlich automatisch dazu.

Siehe auch:
http://leechuck.de/voip/node12.html
http://www.tcp-ip-info.de/tcp-ip-schulung/sld121.htm

Mario.

mwyraz

Wenn man Overhead und Latenzen gering halten möchte und im nicht zu sehr ausgelasteten LAN unterwegs ist, ist UDP nicht verkehrt. Package loss ist eher die Ausnahme, das Thema Reihenfolge kann man durch eine Sequenzummer lösen. Wenn ich recht verstehe, soll eine Kamera o.ä. ausgelesen werden, d.h. durch ein verlorenes Paket würde nur ein Teil des Bildes mal nicht aktualisiert...

DANINO24

Könnte mir jemand ein beispiel schreiben wie ich z.b. ein 1D Array mit sagen wir mal 3 Integer Werten im Ganzen per TCP oder UDP versenden kann?

Komme durch probieren nicht weiter.....

MfG

mkl0815


Ich habe schon zum Anfang ein Programm geschrieben das einen einfachen String mit dem Befehl UDP.Write an den PC sendet. Das klappt soweit!

Ein C-String ist doch auch blos ein char-Array.

Ansonsten für TCP:

Code: [Select]


byte server[] = {192,168,22,155 };
byte data[3] = {1,2,3};

EthernetClient client;

if (client.connect(server, 80)) {
    Serial.println("connected");
    for (int i=0; i<3;i++) {
        client.print(data[i]);
    }
    delay(50);  //etwas zeit für den Server die Daten zu empfangen
    client.stop() //verbindung trennen
  } else {
    Serial.println("connection failed");
  }
}

Go Up