Double über tcp mit client.write() senden

Hallo,

ich will double values (Beschleunigung und Eulerwinkel) über TCP /IP senden. Hardware ist ein ESP8266 und benutze die Funktion client.write() aus WiFiClient.h aus der ESP8266WiFi Library.

Verbindung steht und funktioniert. Chars wie auch int8_t kann ich senden.

Nun ist meine Frage wie ich am besten double Werte senden könnte. Habe überlegt die bytes aus dem double in int8_t (da gleiche Größe) umzuwandeln. Dann mit der client.write() Funktion als int senden, was möglich ist und auf der Serverseite wieder zurückwandeln.

Wie kann ich das am besten in C++ bewerkstelligen ? Hat einer Tipps oder womöglich sogar einen besseren Lösungsweg ?

Funktion client.write:

size_t WiFiClient::write(const uint8_t *buf, size_t size)
{
    if (!_client || !size)
    {
        return 0;
    }
    _client->setTimeout(_timeout);
    return _client->write((const char*)buf, size);
}

size_t WiFiClient::write(Stream& stream)
{
    // (this method is deprecated)

    if (!_client || !stream.available())
    {
        return 0;
    }
    // core up to 2.7.4 was equivalent to this
    return stream.sendAll(this);
}

Das hier hat schonmal nicht funktioniert. Laut Wireshark wurden 8Bytes zwar gesendet aber die Werte haben absolut nicht gepasst.

      if (sFlag)
      {
        readSensorData();
        double test =  acc_z;
        /*char buffer[6];

        dtostrf(test, 4, 2, buffer);
        
        client.write(test, 6);*/

        uint8_t *array = reinterpret_cast<uint8_t*>(&test);

        client.write(array,sizeof(double));
        
        client.flush();

        Serial.println(*array);
        sFlag = false;

        //startStopTransmission();
      }

Vielen Dank.

Haben Sie es versucht ?

double test = 123.456;
client.write((uint8_t*) & test, sizeof(double));

(Auf der empfangenden Seite müssen Sie memcpy() verwenden, um den Puffer wieder in ein Double umzuwandeln)

Was haben Sie in Wireshark gesehen und was war der double Wert?

1 Like

Erstmal vielen Dank für die Antwort.

Habe den Fehler gefunden ! Habe beim client in Matlab typecast vergessen. typecast wandelt das ganze wieder zu nem double.

Jedoch wäre die fortgeschrittene Aufgabe nun ein Array mit mehreren double werten zu senden. Hätten Sie vielleicht da eine Idee dazu ?

Sozusagen *double Array[2] = {acc_x acc_y acc_z};

Ich muss das ganze in einem TCP Packet senden, das bedeutet mehrmals client.write() zu nutzen ist keine Option.

Vielen Dank.

in der gleichen Weise :wink:

double myValues[] = {1.23, 2.34, 3.45, 4.56};
client.write((uint8_t*) & myValues, sizeof myValues);
1 Like

Vielen Dank !

Habe noch bischen Probleme bei der Zeigerarithmetik .. :smiley:

Beziehungsweise mit allem was mit * zu tun hat.

:wink:
Viel Spaß!