µC Arduino uint8_t to char

OP #3054346
Lesenswert?

Hallo,

ich versuche mich gerade in der µC programmierung und bin auf ein 
Problem gestoßen, welches ich mir nicht erklären kann.

Ich habe einen Array der größe 8 des types uint8_t und möchte diesen in 
einen Array aus chars umwandeln.

Mein versuch sieht wie folgt aus:
1
char * addressToString(uint8_t * deviceAddress) {
2

3
  char * acc = (char *) malloc(16 * sizeof(char));
4

5
  for(int i=0; i<16;) {
6

7
    acc[i++] = intToChar(deviceAddress[i]/16);
8

9
    acc[i++] = intToChar(deviceAddress[i]%16);
10

11
  }
12

13
  return acc;
14

15
}
16

17
char intToChar(int i) {
18

19
 if(i<=9) return '0'+i;
20

21
 else return 'A'+i-10;
22

23
}

Dann habe ich versucht diesen array rein zu schicken

{ 0x28, 0x3E, 0x59, 0x58, 0x4, 0x0, 0x0, 0xDC }

mit der Erwartung

{2,8,3,E,5,9,5,8,0,4,0,0,0,0,D,C}

Raus zu bekommen jedoch bekam ich

{2,E,5,8,0,0,0,C,0,0,0,0,1,2,4,1}
Seht ihr was ich falsch gemacht habe?

Danke im voraus
Gast #3054368
Lesenswert?

>   for(int i=0; i<16;) {
>
>     acc[i++] = intToChar(deviceAddress[i]/16);
>
>     acc[i++] = intToChar(deviceAddress[i]%16);

sollte sein:
   for(int i=0; i<16;) {

     acc[i++] = intToChar(deviceAddress[i>>1]>>4);

     acc[i++] = intToChar(deviceAddress[i>>1]&15);
#3054376
Lesenswert?

Wenn du hier

   acc[i++] = intToChar(deviceAddress[i]/16);
       ****

nach dem Abspeichern in acc das i bereits erhöhst, dann greifst du hier, 
bei der 2.ten Anweisung

    acc[i++] = intToChar(deviceAddress[i]%16);
                                      ***

bereits auf das nächste Element deines deviceAddress Arrays zu.

Du kannst dich auch mal fragen, wie es eigentlich sein kann, dass dein i 
von 0 bis 15 läuft, du mittels deviceAddress[i] auf die Originaldaten 
zugreifst und dort aber nur 8 Werte gespeichert sind. Schon alleine 
deswegen sollte klar sein, dass dein Weg so nicht funktionieren wird.

1
  for(int i=0; i<8; i++) {
2
    acc[2*i + 0] = intToChar(deviceAddress[i]/16);
3
    acc[2*i + 1] = intToChar(deviceAddress[i]%16);
4
  }

(Ist nur eine Möglichkeit. Es gibt noch andere. Versuch mal, ob du noch 
andere Alternativen findest)
OP #3054554
Lesenswert?

Hallo,

danke erstmal für die Tipps, da hätt ich auch drauf kommen können :) Das 
Ganze funktioniert allerdings nur halb, merkwürdigerweise habe ich jetzt 
noch viele viele Zeichen hinten dran gehangen (wenn ich es über 
Serial.prinln() ausgebe).

http://pastebin.com/JfWeA0w2

Obwohl ja nur 283E5958040000DC rauskommen sollte. Woran liegt das?

MFG
Frederic

PS: Entschuldigt bitte das newbie Zeug, ich komme von Java da muss ich 
mich nicht um so etwas kümmern :)
Gast #3054572
Lesenswert?

Der String muss mit \0 beendet werden.

Hinweis: lern erstmal C und mach erst dann Arduino. In Java gibts nicht 
mal Zeiger... da hast du dann spätestens die nächsten Probleme - das 
garantiere ich dir. Es ist ja toll, sich mit Mikrocontrollern und 
Arduino zu beschäftigen aber dazu sollte man einigermaßen C können. C 
ist nun mal leider eine Sprache, die viel erlaubt und jegliche Fehler 
ignoriert. Wenn man diese Fehler direkt auf einen uC überträgt, weiß man 
am Ende gar nicht mehr, warum es hängt.

offtopic @eingefleischte User:
JETZT weiß ich, warum ihr allergisch auf Arduino seid... Das sind 
C-Probleme keine µC-Probleme...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren