µ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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.