Arduino UIP und int8_t

Hallo Arduiner, ich arbeite momentan mit dem Mega2560 und der Arduino UIP Library ( Ethernet ). Und habe als Anfänger noch kleine Probleme den EchoServer Sketch zu begreifen.

Hauptsächlich um diesen Teil aus dem Sketch ( Zeile 3 ).

while((size = client.available()) > 0) 
            {
              uint8_t* msg = (uint8_t*)malloc(size);          // Zeile 3
              size = client.read(msg,size);
              Serial.write(msg,size);
              client.write(msg,size);
              free(msg);
            }

In der 3 Zeile wird "msg" als typ uint8_t ( 8 bit ) bzw als Zeiger dieses Typen definiert. Was dahinter passiert verstehe ich nicht. Malloc reserviert Speicher in der größe von Size ? Aber wieso (uint8_t*) davor ?

Ich würde gerne uint8_t in einem Char wandeln. Und auch umgekehrt ? Gibt es dafür eine einfache möglichkeit ?

Vielen Dank im voraus für alle möglichen Tips.

Hallo McFly,

mit malloc(size) wird ein Speicher dynamisch reserviert. Das soweit schon richtig. Bei der "Umwandlung" muss du aufpassen!

uint8_t (unsigned 8bit integer) = byte = 0...255 int8_t (signed 8bit integer) = char = -127 ... 127

Warum wollst du umwandeln?

malloc liefert einen Zeiger undefinerten Datentyps ( void * ). Mit (uint8_t*) sagst du, dass du das als Zeiger auf bytes weiterverarbeiten möchtest ( cast )

Genauso kannst du auch char * msg = (char*) malloc(size); schreiben.

Da es zwichen uint8_t* und char* nichts wirklich zu wandeln gibt, eher ein anders interpretieren der gleichen Daten, kannst du die cast Konstruktion hier beliebig verwenden.

Hallo Michael, was meist du mit ein anderes interpretieren? Die Wertespanne zwischen char* und uint8_t mag zwar identisch mit 8bit sein, aber hier kommen ganz andere Werte heraus. Was hier identisch mit dem uint8_t wäre, ist ein unsigned char.

Danke michael_x für die erklärung und

Danke sschultewolte für die Erklärung! Das wird mir weiter helfen :) Typenumwandlung wollte ich machen damit ich aus dem Byte wieder ein Buchstaben machen kann. Bzw zum debuggen. Kann ich den uint8_t wie einen unsigned Integer verwenden ?

grüße

Es gibt keinen größeren Unterschied zwischen "Byte" und "Buchstaben" abgesehen vom Vorzeichen. Den Datentyp "byte" gibt es in C eigentlich nicht. Das ist nur typedef der Arduino IDE auf unsigned char/uint8_t um es Anfängern einfach zu machen. Ob das wirklich eine Zahl oder ein Buchstabe ist, ist nur eine Interpretationssache.

Eine Stelle wo das relevant wäre ist der C++ Output Stream cout. Wenn man da char reinschreibt, aber eigentlich Zahlen meint, muss man vorher auf int casten. Das ist aber hier nicht relevant.

Die IDE kommt auch problemlos mit unsigned chars für Buchstaben zurecht. Ich habe ein Programm geschrieben indem ich char arrays unsigned definiert habe, weil der Zeichensatz im PROGMEM größer als 127 sein müsste, für die Umlaute. Das hatte ich erst übersehen, aber nachdem ich alles von char auf unsigned char umgestellt habe ging es.

Mit boolean hat man genauso getrickst. Das sollte eigentlich "bool" heißen. Funktionieren tut beides, aber den boolean typedef gibt es wahrscheinlich weil es in Java so heißt.

Kann ich den uint8_t wie einen unsigned Integer verwenden ?

Brauchst du nicht. Solche Casts sind implizit und automatisch bei der Zuweisung: http://de.wikipedia.org/wiki/Typumwandlung

Upps, da hab ich oben dann eine kleine Sache durcheinander gebracht.

uint8_T/char = 0...255; int8_t = -127...0...127

sschultewolter: Upps, da hab ich oben dann eine kleine Sache durcheinander gebracht. uint8_T/char = 0...255; int8_t = -127...0...127

uint8_t ist unsigned char :) (und int8_t fängt bei -128 an)

Das hatte ich auch in meinem Post erst übersehen.

Die eigentlichen ASCII chars sind natürlich signed. Der Zeichensatz geht bis 127. Aber man kann auch unsigned char für Buchstaben nehmen. Manche der String-Funktionen meckern da aber glaube ich ohne Casts. Macht normalerweise keinen Sinn, aber ich habe es wie gesagt für einen Font um PROGMEM gebraucht, der größer als der eigentliche ASCII Satz war.

Vielen Dank für die ausführliche und schnelle Erklärung! Ich hab es dank eurer Hilfe jetzt verstanden.

Grüße