String to unit8_t

Hallo liebe Leute,

hoffe es geht allen gut!

Hätte mal wieder eine Frage und bitte um Hilfe!

Grundsätzlich habe ich Daten die int16_t sind, welche ich zu einem String zusammenfüge und diesen String würde ich gerne zu unit8_t konvertieren.

Leider bekomme ich das nicht hin.

Vlt hat jemand eine Idee/ Erklärung für mich?
Danke!!

int16_t  actoffset[6];
String id_name= "UH"

String off = id_name + "," +  String(actoffset[0]) + "," + String(actoffset[1]) + "," + String(actoffset[2]) + "," + String(actoffset[3]) + "," + String(actoffset[4]) + "," + String(actoffset[5]) + "," + String(actoffset[6]);

byte buf[51];
off.toCharArray(buf, 50);

Bekommen diesen Fehler:

invalid conversion from 'byte*' {aka 'unsigned char*'} to 'char*' [-fpermissive]

Wenn jemand so nettv wäre mir zu Helfen?

Danke an alle schon mal!

Schönen Tag!

mfg

off.toCharArray((char)buf, 50);

Hallo, danke erst mal für deine schnelle Antwort.

Bekomme nun einen anderen Fehler:

cast from 'byte*' {aka 'unsigned char*'} to 'char' loses precision [-fpermissive]

Hättest du noch eine Idee?
Danke

mfg

Eigentlich sollte das eine "Warnung" und kein "Fehler" sein.

@aarg meint in Wirklichkeit

Richtig, ich habe meinen Morgenkaffee noch nicht beendet...

Oh danke und wenn ich das zurück wandeln wollen würde?

bzw gibt es eine bessere methode das zu machen um UDP zu senden?
Hab das letztens nebenbei in einem Post gefragt aber bis jetzt nicht geschafft..

würde gerne das machen..

String off = ofst + "," + id_name + "," + String(actoffset[0]) + "," + String(actoffset[1]) + "," + String(actoffset[2]) + "," + String(actoffset[3]) + "," + String(actoffset[4]) + "," + String(actoffset[5]) + "," + String(actoffset[6]);
  Serial.println(off);
  
  byte buf[51];
  off.toCharArray((char *)buf, 50);
  Serial.println(buf[1]);
  UdpTwo.begin(PORTOFF);
  UdpTwo.beginPacket(unicastIP, PORTOFF);
  UdpTwo.write((uint8_t*)&buf, sizeof(buf));
  //Udp.print(text);
  UdpTwo.endPacket();

aber es kommt beim empfangen nichts an..

int packetSize1 = UdpTwo.parsePacket();

        if (packetSize1)

        {
         int len = UdpTwo.read((uint8_t*)&buf, sizeof(buf));

          if (len > 0) packetBuffer[len] = 0;

          Serial.println("Contents:");

          Serial.println(buf[1]);
        }

mfg

Da wird nichts gewandelt. Dieser cast sagt dem Compiler nur, dass es Absicht ist, den char* als byte* zu behandeln.
char* cp = char c[] {"Hello"};
byte* bp = (byte*) cp;

ah ok dann kann ich das einfach umdrehen auch um aus dem byte wieder char zu machen?

Hättest di ein kurzes Bsp?

danke!!!!!!

byte wird per default als Dezimalzahl 0 .. 255 dargestellt
Warum willst du ausgerechnet den zweiten Buchstaben von buf als Zahl auf Serial ausgeben?

In C++ ist ein Array und ein Zeiger fast dasselbe

UdpTwo.write(buf, sizeof(buf)); // schreibt auf jeden Fall 51 Bytes

Hallo,
warum lässt Du denn die String Objekte nicht ganz weg und nutzt sprintf()

int16_t offset[6] = {101, 102, 103, 104, 105};
char off[50];

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  sprintf(off, "UH,%i,%i,%i,%i,%i", offset[0], offset[1],
          offset[2], offset[3], offset[4], offset[5]);
  Serial.println(off);

}

void loop() {
  // put your main code here, to run repeatedly:

}

beim Empfänger kommt dann eine Zeichenkette an , so wie Du sie auf dem Monitor auch siehst. Die musst Du zerlegen und das Komma als Trennzeichen filtern. Dazu gibt es strtok() damit bekommst Du Teilzeichenketten die Du mit atoi wider in integer wandeln kannst.

https://www.cplusplus.com/reference/cstring/strtok/?kw=strtok

https://www.cplusplus.com/reference/cstdlib/atoi/?kw=atoi

hier ein Ausschnitt wie man das für float machen kann

void CStringToWert(char *instr) {
  // füllt daten aus einem C-String in Daten
  int devAdress = atoi(strtok(instr, ";"));

  if (devAdress == 1) {
    temp = atof(strtok(NULL, ";"));
    hum = atof(strtok(NULL, ";"));
    pres = atof(strtok(NULL, ";"));
    VCC = atof(strtok(NULL, ";"));
  }
}

Heinz

Das problem was ich habe ist das bei mir auf der empfänger seite einfach nichts angezeigt wird.

Senden tu ich so:

String off = ofst + "," + id_name + "," + String(actoffset[0]) + "," + String(actoffset[1]) + "," + String(actoffset[2]) + "," + String(actoffset[3]) + "," + String(actoffset[4]) + "," + String(actoffset[5]) + "," + String(actoffset[6]);
  Serial.println(off);
  
  char buf[51];
  off.toCharArray((char *)buf, 50);
  Serial.println(buf[1]);
  Serial.println(buf[48]);
  Serial.println(sizeof(buf));
  Serial.println(String(buf[1]));
  //Serial.println(itoa(buf, buffer, 10));
  UdpTwo.begin(PORTOFF);
  UdpTwo.beginPacket(unicastIP, PORTOFF);
  UdpTwo.write(buf, sizeof(buf));
  //Udp.print(text);
  UdpTwo.endPacket();

und beim empfangen mache ich das:

char packetBuffer[51];

int packetSize1 = UdpTwo.parsePacket();

        if (packetSize1) {
          int len = UdpTwo.read(packetBuffer, sizeof(packetBuffer));

          if (len > 0) packetBuffer[len] = 0;

          Serial.println("Contents:");

          Serial.println(packetBuffer);
        }

aber ich bekomme einfach nichts am Serial monitor angezeigt?

Vlt lönntest du mir weiterhelfen

mfg

Hallo,

danke für deine Antwort.

Habe nochmal mein PÜroblem gepostet, vlt verändert das was.

danke

mfg

Hallo,

lade dir mal das Tool Paketsender runter. Damit kannst Du das dann einzeln testen und am PC simulieren. Dann kämpfst du nur auf einer Baustelle.

Heinz

Auch nicht "Contents:"
Dann liefert also udpTwo.parsePacket() eine 0 zurück. Da müsstest du in der Lib oder deren Beispielen schauen, was das bedeutet.

Stattdessen würde ich einfach Serial.println(buf); beim Sender als Testausgabe einbauen.

Hallo,
ich vermute hier was siehe Komentar.

aus meiner Bastelkiste

//-------------- send UDP Daten----------------
void sendUDP() {
  char sendPack[100];
  sprintf(sendPack, "%4d;%4.2f;%4.2f;%4.2f;%4.2f", devAdress, temp, hum, pres, Vcc);
  int len = strlen(sendPack);
  // Serial.println(len);
  // Serial.println(localPort);
  // Serial.println(hostPort);
  Serial.println(sendPack);

  Udp.begin(localPort);

  Udp.beginPacket(hostIP, hostPort);
  Udp.write(sendPack, len);
  Udp.endPacket();
  Udp.stop();

}

also wenn ich nur

UdpTwo.write("Hallo");

sende dann funktioniert alles

Also muss es doch an

 UdpTwo.write(buf, sizeof(buf));

liegen

Hättest jemand noch eine Idee was da nicht in Ordnung ist?

mfg

letzte Post von mir der Fehler den ich lokalisieren konnte, vlt hättest du noch eine Idee?`

Danke schon mal bis jetzt für deine Antworten!

Hab einen neuen Post mit der Frage aufgemacht, damit andere das Problem beim Sichen leichter finden, da es in diesem Post/ Frage um etwas anderes ging.

Danke an alle für eure Hilfe und wenn Ihr noch Hilfestellungen für mich hab, dann bitte im anderen Post schreiben
hier der Link:

UDP.write sendet nicht/ UDP.parsePacket() ist 0

Danke an alle für die Antworten und einen schönen Tag!!!!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.