Send struct serial port

Hello to all,

i have a problem.
I recive data via UDP and want to send them via serial port to a pc.

Therfor i made a struct

struct UDP_MESSAGE {
  UDP_CLIENT_ID sender;
  Quaternion q;
};

q i get from an other device via UDP and it is an float

Now i want to send the data to my pc via serial port
But i want to send the whole data at once

I tried

Serial.println(msg.q);

but its not working

Serial.println(msg.q.x);

was working.

here is the whole code:

/*

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <WiFiUdp.h>
#include "MPU6050_6Axis_MotionApps20.h"


const char *ssid = "ESPap";
const char *password = "thereisnospoon";

ESP8266WebServer server(80);

IPAddress unicastIPHand(192, 168, 4, 2);
IPAddress unicastIPUnderArm(192, 168, 4, 3);
IPAddress unicastIPUpperArm(192, 168, 4, 4);
constexpr uint16_t PORT = 8266;
//#define MAX_CLIENTS 8
WiFiUDP Udp;

void handleRoot() {
  server.send(200, "text/html", "<h1>You are connected</h1>");
  String addy = server.client().remoteIP().toString();
  Serial.println(addy);
}

enum UDP_CLIENT_ID {Hand, UnderArm, UpperArm};

struct UDP_MESSAGE {
  UDP_CLIENT_ID sender;
  Quaternion q;
};

enum UDP_CLIENT_OFFSET {Start};

struct UDP_MESSAGE_OFFSET {
  UDP_CLIENT_OFFSET offset;
};

UDP_MESSAGE msg;
UDP_MESSAGE_OFFSET msgoff;;
int pin = 0;
int start_count = 0;

/*===================================================================== */

void setup() {

  Serial.begin(115200);
  pinMode(D5, OUTPUT);
  pinMode(D6, INPUT);
  pinMode(D7, OUTPUT);
  Serial.println();
  Serial.print("Configuring access point...");
  WiFi.softAP(ssid, password);

  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  server.on("/", handleRoot);
  server.begin();
  Serial.println("HTTP server started");

  Serial.println("Starting UDP");
  Udp.begin(PORT);
  Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.softAPIP().toString().c_str(), PORT);
}

/*===================================================================== */

void loop() {
  server.handleClient();

  pin = digitalRead(D6);
  //Serial.print("Pin Status für if- Schleife: ");
  //Serial.println(pin);
  if (pin == LOW) {
    //Serial.printf("Anzahl der Verbundenen Geräte= %d\n", WiFi.softAPgetStationNum());
    int packetSize = Udp.parsePacket();
    if (packetSize) {
      while (Udp.read((uint8_t*)&msg, sizeof(msg)) == sizeof(msg))
      {
        digitalWrite(D7, LOW);
        digitalWrite(D5, HIGH);

        if (msg.sender == Hand)
        {
          //Serial.println("Hand sends: ");
          //Serial.println(msg.sender);
          //Serial.println(msg.q);
          //Serial.println(msg.q.x);
          //Serial.println(msg.q.y);
          //Serial.println(msg.q.z);
        }
        else if (msg.sender == UnderArm)
        {
          Serial.println("UnderArm sends: ");
          Serial.println(msg.q.w);
          Serial.println(msg.q.x);
          Serial.println(msg.q.y);
          Serial.println(msg.q.z);
        }
        else if (msg.sender == UpperArm)
        {
          Serial.println("UpperArm sends: ");
          Serial.println(msg.q.w);
          Serial.println(msg.q.x);
          Serial.println(msg.q.y);
          Serial.println(msg.q.z);
        }
      }
    }
  }
  else if (pin == HIGH) {
    
    start_count = 1;
    if (start_count == 1) {
      digitalWrite(D5, LOW);
      digitalWrite(D7, HIGH);

      Udp.beginPacket(unicastIPHand, PORT);
      UDP_MESSAGE_OFFSET msgoff;
      msgoff.offset = Start;
      Udp.write((uint8_t*)&msgoff, sizeof(msgoff));
      Udp.endPacket();
    }
    start_count = 0;
    pin = LOW;
    delay(2000);
  }
}

Maybe someone is so nice and can help me?

thanks and best regards

Offensichtlich nicht!
Denn float kennt keine x y z w Eigenschaften.

hallo, danke erst mal für die schnelle Antwort!
ok dann hab ich da was falsch verstanden.

Ich bekomme das q aus dem Code von Jeff Rowberg für MPU für die Quaternions-
Keine Ahnung ob du das kennst.
Soweit ich da nachgelesen habe sollten dei einzelenen q.x.... floats sein?

Hättest du einen Denkanstoß für mich oder sowas?

Danke

Und es sollte doch float sein da ich z.B msg.q.w mittels dtostrf konvertieren kann.
Oder liege ich da wieder falsch?

Sorry ist ein double!!!

Du könntest deine Quaternionen Printable machen.

Als Denkanstoß ... :wink:

Hallo,
eventuell hilft Dir ja das weiter.

da Du an einen PC senden willst macht es sicher mehr Sinn das als Text zu versenden und die einzelnen Werte mit einem Trennzeichen zu versehen damit Du sie wieder trennen kannst.

Heinz

Nicht wirklich.
Aber Datentypen, auch selbstgebastelte, grundsätzlich schon.
Darum war das ja auch so offensichtlich.

Was ist denn dein Begehr?
Denn, wie es geht, hast du ja schon....

Na gut, dann das fertige Ergebnis eines Denkanstoßes:

class Q { public: double w, x, y, z;}; // Pseudo-Quaternion Klasse
class PrintableQ : public Q, public Printable {
  public:
  PrintableQ(float x1, float x2, float x3, float x4) {w=x1; x=x2; y=x3; z=x4;}
  virtual size_t printTo( Print& p ) const {
    size_t len=5;
    p.write('{'); len += p.print(w);
    p.write('/'); len += p.print(x);
    p.write('/'); len += p.print(y);
    p.write('/'); len += p.print(z);
    p.write('}');
    return len;
  }
};

PrintableQ pq(2.5,2.6,2.7,2.8);  // ein Quaternion, das printable ist.

void setup() {
  Serial.begin(9600);
  Serial.println(pq);
}

void loop() {}

ドイツ語のフォーラムでは、ドイツ語はほんの少ししか書かれていません。

Wo liegt Dein Problem? Das ist eine Mehrfachvererbung.

Gruß Tommy

Edit: Die Übersetzung Deines Beitrags ergibt auch keinen Sinn:
In the German forum, only a few words are written in German.
oder:
Im deutschen Forum wird nur wenig Deutsch geschrieben.

Man muss es gar nicht über Vererbung tun....

#include <Streaming.h> // die Lib findest du selber ;-)
Stream &cout = Serial; // cout Emulation für "Arme"

class Q { public: double w, x, y, z;}; // Pseudo-Quaternion Klasse

inline Print &operator <<(Print &p, const Q &arg)
{
  p << '{' 
         <<  arg.w << '/' << arg.x <<'/' << arg.y<< '/' << arg.z
    << '}';
  return p; 
} 



Q pq {2.5,2.6,2.7,2.8};

void setup() 
{
  Serial.begin(9600);
  cout << F("Start: ") << F(__FILE__) << endl;
  cout << pq << endl;
  
}

void loop() 
{

}

Danke an alle mal für eure Antworten und Hilfe.

Ich werde das mal versuchen und dann zurück kommen falls ich noch Probleme habe.
Hab aber auch einen weg über

dtostrf
gefunden es als string zu senden und dazwischen "," als Trennzeichen einzufügen.

Aber denke das es nicht der richtige oder besste Weg ist :sweat_smile:
Danke!!!!!!

Aber trotzdem noch etwas, auch allgemein wie hängt das senden von daten egal ob serial port oder UDP oder.. mit den Datentypen zusammen?

Kennt jemand eine guter Erklärung dafür damit ich nicht immer blöd fragen muss oder wie ich mich da aufschlauen könnte?

Also wenn man jetzt weiß man hat z.B.: uint8_t oder int16_t oder... und will diese per serial port oder udp senden, wie überlegt man sich das bzw wie könnte ich da mal grundverständnis ausbauen?

danke für die antworten!

Wenn man etwas ausgeben will, dann muss die ausgebenden "Routine" Wissen darum haben, was überhaupt ausgegeben soll. Denn sie muss aus einer internen Repräsentation, eine machen, welche die Gegenseite (sei es Mensch oder auch Maschine) garantiert lesen kann.

Ok hab mir jetzt ein paar sachen durchelesen und bin etwas schaluer.

Hätte eine konkrete Frage an die keute die es interessiert und zeit haben mir zu helfen:

wenn ich ein int16_t Data[6] per UDP senden will, geht das und wenn ja wie könnte man da vorgehen?
Danke

Du suchst write(puffer,laenge)

Gruß Tommy

Es geht.
Dafür gibt es tausende Möglichkeiten.
ok- Tommy war wieder schneller :wink: - ich geh mal blinken... :slight_smile:

ok ich versuch da mal selber was zu schaffen sonst komme ich morgen mit meiner nächsten Frage.

Nochmals danke an alle die so nett waren eine Antwort zu geben!!

schönen Abend noch!