TCP-Client, Empfangspuffer auslesen

Hallo,

ich nutze einen Arduino mit Ethernetshield als TCP-Client und bekomme vom Server ein 73 Byte großes Datenpaket geschickt (siehe Anhang).
Mit client.read() kann ich aber immer nur das erste Byte auslesen, deshalb habe ich gedacht, ich versuche es mal mit client.readBytes()

void loop()
{
    
     client.connect(server, 81);
     delay(1000);
     if (client.connected())
     {
       Serial.println("verbunden");
       byte bufferTX[] = { 0x62, 0xff, 0x03, 0xff, 0x00, 0x43, 0x5a, 0x00 };
       client.write(bufferTX, sizeof(bufferTX));

       Serial.println("frage ab...");
       delay(1000); 
       byte x = client.available();
       Serial.print(x);
       Serial.println(" Bytes empfangen");
       byte bufferRX[73];
       client.readBytes(bufferRX, 73);
       for(int i=0;i<73;i++)
       {
         Serial.print(bufferRX[i]); 
         Serial.print(" ");   
       }
     }
     else
     Serial.println("nicht verbunden");
     
     Serial.println();
     
     client.stop();
     delay(5000);
}

Aber da bekomme ich eine Fehlermeldung " invalid conversion from ‘byte*’ to ‘char*’ ". Wenn ich bufferRX als char definiere, kommt die Fehlermeldung nicht, dafür erhalte ich als Ergebnis nur “Müll” im Serial Monitor (siehe Anhang).
Kann mir jemand helfen, wie man die 73 Bytes richtig ausliest?

Vielen Dank und Grüße

Wieso machst du nicht so wie beim WebClient aus dem Beispiel-sketch?

void loop()
{
  // if there are incoming bytes available 
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

......

Und das "client.connect" hab ich eigentlich immer in der void setup()

Hallo hk007,

vielen Dank für den Hinweis. Manchmal sieht man vor lauter Herumprobieren den Wald vor lauter Bäumen nicht. Ich mache es jetzt so:

  if (client.available()) 
  {
    byte bufferRX[73];
    int i = 0;
    bufferRX[i] = client.read(); 
    Serial.print(bufferRX[i], HEX);
    Serial.print(" ");
    i++;
  }

"client.connect()" steht deswegen bei mir in void loop(), weil ich im endgültigen Programm zwei verschiedene Server abfragen will. Und da muss ich die einzelnen Verbindungen ja jeweils nacheinander aufbauen und wieder schließen. Oder liege ich da falsch?

Viele Grüße

Das Array und die Index Variable musst du wo anders deklarieren! So existierten die nur innerhalb der geschweiften Klammern.

Kann man mit dem Wiznet nicht gleichzeitig 4 Verbindungen aufbauen?

@ Serenifly Danke, habe ich auch gerade gemerkt, aber ich bin ja noch ganz am Anfang und probiere noch, ob meine einzelnen Programmteile grundsätzlich funktionieren.

@ hk007 Das werde ich einmal ausprobieren.

Schönen Sonntag noch

karl_napp: @ hk007 Das werde ich einmal ausprobieren.

Guckst du hier: http://arduino.cc/en/pmwiki.php?n=Main/ArduinoEthernetShield

... The Arduino Ethernet Shield allows an Arduino board to connect to the internet. It is based on the Wiznet W5100 ethernet chip (datasheet). The Wiznet W5100 provides a network (IP) stack capable of both TCP and UDP. It supports up to four simultaneous socket connections. Use the Ethernet library to write sketches which connect to the internet using the shield. The ethernet shield connects to an Arduino board using long wire-wrap headers which extend through the shield. This keeps the pin layout intact and allows another shield to be stacked on top. ....

Hallo hk007,

mir ist noch was nicht ganz klar zu Deinem Vorschlag die Verbindung in void.setup aufzubauen.

Kann man mit dem Wiznet nicht gleichzeitig 4 Verbindungen aufbauen?

In meinem Fall möchte ich zwei Server (Wechselrichter meiner PV Anlage) per TCP alle 15 Sekunden nach deren Betriebswerten abfragen. Wenn ich nun die beiden Verbindungen in void.setup herstelle und offenhalte, wie stelle ich dann in void.loop sicher, dass meine Anfragen den jeweils "richtigen" Server erreichen, bzw. stelle ich fest, von welchem Server die Antworten stammen?

Viele Grüße