Char Array splitten und umformatieren

Moin aus Bremen liebe Arduino Freunde!

Ich habe folgendes Problem. Ich lese mit dem EthernetShield per UDP Protokoll den Buffer aus, dieser ist als char array wie folgt definiert:

char packetBuffer[UDP_TX_PACKET_MAX_SIZE];

Zur Laufzeit wird der Datenstrom des UDP Protokolls nun diesen PacketBuffer füllen.
In meinem Fall immer mit einem Packet der Größe 9. Ich sende immer die Zeichenfolge: bt0010001

Nun möchte ich diese Zeichenfolge auf dem Arduino in seine Bestandteile zerlegen.
"bt" soll dabei ein String ergeben, welchen ich per IF Schleife mit einem anderen String vergleichen kann

"001" und "0001" sollen Nummern vom Typ integer sein.

Mein bisheriger Ansatz sieht wie folgt aus:

void update (int packageSize, char packageBuffer[], IPAddress ipadress, int port)
{
    char convertType[] = {packageBuffer[0],packageBuffer[1]};
    char convertID[] = {packageBuffer[2],packageBuffer[3],packageBuffer[4]};  
    char convertValue[] = {packageBuffer[5],packageBuffer[6],packageBuffer[7],packageBuffer[8]};    
    
    String Type = String(convertType);
    
    Serial.print("Buffer:");
    for (int i = 0; i < packageSize; i++)
    {
      Serial.print(packageBuffer[i]);
    }
    
    Serial.print(" - Packetsize: ");
    Serial.print(packageSize);
    
    Serial.print(" - Type: ");
    Serial.print(Type);

    Serial.print(" - ID: ");
    Serial.print(atoi(convertID));
    ID = atoi(convertID);

    Serial.print(" - Value: ");
    Serial.println(atoi(convertValue));
    Value = atoi(convertValue);    
}

Leider funktioniert es so nicht wie ich dasmir vorstelle, kann bitte bitte jemand helfen?

Du schreibst umfangreich - geht es Dir darum, den 9 Bytes langen String dreigeteilt zu behandeln?

Beispiel:

// Voraussetzung: Immer 9 Bytes Daten
// UDP_TX_PACKET_MAX_SIZE muss aber mind. 10 sein, es kommt nachher noch der
// Stringterminator 0x00 rein!

char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; 

// angenommen, da steht jetzt "bt0010001" drin, Du möchtest
// - "bt" vergleichen (Byte 0-1)
// - "001" als Zahl1 sowie "0001" als Zahl2 extrahieren als integer

// Der Vergleich mit "strncmp" braucht keinen Stringterminator, da wir
// die Länge (= 2 Bytes) selbst bestimmen:
if (strncmp(packetBuffer, "<dein2ByteVergleichsString>", 2) == 0) {
  // Beide Bytes stimmen überein
}

// Jetzt erst um die 2.te Zahl kümmern (Byte 5-8), für "atoi" String 
// erst sauber abschliessen:
packetBuffer[9] = 0x00;
int Zahl2 = atoi(&packetBuffer[5]);

// Jetzt 1. Zahl (Byte 2-4) umwandeln: Zahl2 haben wir schon, deshalb
// kann man deren erste Stelle jetzt kaputt machen :)
packetBuffer[5] = 0x00;
int Zahl1 = atoi(&packetBuffer[2]);

So sollte es halbwegs effizient laufen - vorausgesetzt, ich habe Dein Problem richtig verstanden und es ging in erster Linie um diese 3-Teilung.

Nicht vergessen, daß für alle Stringfunktionen die Strings immer mit einem 0-Byte abgeschlossen sein müssem, sonst wird es nichts! :wink:

Viel Erfolg und Gruß,
mmi

Hallo mmi!

Vielen Dank für die Hilfe, da hab ich grad mächtig was gelernt. Diese Vorgehensweise war mir noch nicht bekannt. Aber gut man lernt an seinen Projekten :slight_smile:

Eine letzte Frage habe ich dennoch, ist meine Vorgehensweise um "bt" in einen String zu extrahieren den richtig oder muss ich immer eine Kopie des Originals machen und dann per 0x00 den String abschließen.
Idealerweise würdest du mir bitte nochmal 0x00 erläutern, ist das Hex schreibweise? Wofür steht das genau (sprich vernichtet das Speicherstellen)?
Vielleicht kannst du mir das besser als google erklären.

VIELEN VIELEN DANK!
Gruß aus Bremen,
Godsplan

Gute Grundkenntnisse sind wichtig - ein brauchbares Buch zum Herunterladen:

http://download2.galileo-press.de/openbook/galileocomputing_c_von_a_bis_z.zip

0x00 ist ein Zeichen wie jedes andere auch, es belegt ebenso ein Byte (siehe auch ASCII-Zeichensatztabelle). 0x00 oder '\x0' ist die hexadezimale Schreibweise, genauso gut kannst du dezimal '\0' schreiben.

Der Ansatz in Deinem Programm ist in vielerlei Hinsicht so nicht brauchbar, etwas Grundkenntnisse solltest Du Dir anlesen und am besten am PC erst in kleinen Schritten testen.