Forum: Mikrocontroller und Digitale Elektronik µC Arduino uint8_t to char


von Frederic B. (germinator)


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

von Stefan E. (sternst)


Lesenswert?

Frederic Branczyk schrieb:
> Seht ihr was ich falsch gemacht habe?

Du inkrementierst 'i' zu früh.

von Chris (Gast)


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);

von Karl H. (kbuchegg)


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)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Warnungen beachten!!
1
<stdin>: In function 'addressToString':
2
<stdin>:12:10: warning: operation on 'i' may be undefined [-Wsequence-point]
3
     acc[i++] = intToChar(deviceAddress[i]/16);
4
          ^
5
<stdin>:14:10: warning: operation on 'i' may be undefined [-Wsequence-point]
6
     acc[i++] = intToChar(deviceAddress[i]%16);
7
          ^

von Frederic B. (germinator)


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 :)

von Brater (Gast)


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...

von Cyblord -. (cyblord)


Lesenswert?

Brater schrieb:

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

Ich höre ja dauernd das Argument dass Arduino was für Leute sei die eben 
fit im Programmieren aber nicht so fit in der Hardware sind. Sieht man 
hier ja sehr schön.

gruß cyblord

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.