Forum: Mikrocontroller und Digitale Elektronik Teil eines byte Arrays in Variable


von Chr. M. (snowfly)


Lesenswert?

Hallo Forum,

ich hoffe hier ist jemand so nett mir weiterzuhelfen,
auch wenn es schon wieder eine blöde Frage zu Arduino
von einem der nichts kann ist.

Ich habe ein byte Array das gefüllt ist mit Daten die ich über die 
serielle Schnittstelle eingelesen habe und hätte gerne einen Teil daraus 
als Wert in einer Variablen.

Also im Array steht:
byte myArray[8] = {31,32,33,34,35,36,37,38}

und in der Variablen will ich z.B.:
Var_aus_myArray_1bis3 = 234

Ich hoffe das ist verständlich.

von Tom (Gast)


Lesenswert?

Wenn Du verrätst, wie du aus dem Array auf die 234 kommst, kann man dich 
bei der Umsetzung unterstützen.

von Chr. M. (snowfly)


Lesenswert?

Tom schrieb:
> Wenn Du verrätst

gerne doch.

Index[1] ist die 0x32 also ASCII "2"
Index[2] ist die 0x33 also ASCII "3"
Index[3] ist die 0x34 also ASCII "4"

Zusammengesetzt also "234"


Ich habe die letzten Stunden soviel im Netz gelesen dass ich vermutlich 
schon ein wenig Bertriebsblind bin..

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

Chr. M. schrieb:
> Ich hoffe das ist verständlich.

Nein

von Karl H. (kbuchegg)


Lesenswert?

Chr. M. schrieb:

> und in der Variablen will ich z.B.:
> Var_aus_myArray_1bis3 = 234
>
> Ich hoffe das ist verständlich.

Eventuell liege ich jetzt komplett daneben und dein Byte-Array ist in 
Wirklichkeit eigentlich ein String, bestehend aus den 'Buchstaben' '2', 
'3' und '4'.

Auf der anderen Seite hoffe ich auch, dass es verständlich ist, wenn du 
dir mal nahelegst, wie denn eigentlich die Zahl 234 aufgebaut ist.
234 das ist nichts anders als 200 + 30 + 4

wenn also die erste Zahl in deinem Array eine 2 ist, die zweite eine 3 
und die dritte eine 4, dann genügt es die erste Zahl mit 100 zu 
multiplizeren, die 2-te mit 10 und die dritte nimmst du so wie sie ist.
1
erste Zahl: 2        mal 100    ergibt    200
2
zweite Zahl: 3       mal 10     ergibt     30
3
dritte Zahl: 4       mal 1      ergibt      4
4
                                       -------
5
                       alles zusammen     234

und so hast du aus den einzelnen Ziffern 2,3 und 4 dir die 3 stellige 
Zahl 234 erzeugt.

von B. S. (bestucki)


Lesenswert?

Chr. M. schrieb:
> gerne doch.

Du willst also einen String in eine Zahl umwandeln:
http://www.cplusplus.com/reference/cstdlib/atoi/

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

int stoi (const string&  str, size_t* idx = 0, int base = 10);

?

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

Chr. M. schrieb:
> gerne doch.
>
> Index[1] ist die 0x32 also ASCII "2"
> Index[2] ist die 0x33 also ASCII "3"
> Index[3] ist die 0x34 also ASCII "4"
>
> Zusammengesetzt also "234"

Ok, das ist jetzt klar. Aber das ist so einfach, dass ich mich weigere 
das zu beantworten. Ich weiss. Das ist nicht nett. Aber ich bin auch 
nicht nett. So was sollte man lösen können, wenn man Programmieren als 
Hobby betreibt.

von H.Joachim S. (crazyhorse)


Lesenswert?

(Index[1] -0x30) *100 + (Index[2]-0x30)*10 + Index[3]-0x30

von Karl H. (kbuchegg)


Lesenswert?

Chr. M. schrieb:
> Tom schrieb:
>> Wenn Du verrätst
>
> gerne doch.
>
> Index[1] ist die 0x32 also ASCII "2"
> Index[2] ist die 0x33 also ASCII "3"
> Index[3] ist die 0x34 also ASCII "4"
>
> Zusammengesetzt also "234"

Damit hast du schon fast einen String. Häng hinten noch 1 Byte mit dem 
Code-Wert von 0 drann und du hast einen String. Auf den kannst du zb 
atoi loslassen und der rechnet dir die zugehörige Zahl in ihrer 
Binärform aus.


Du brauchst ein C Buch.
Ja, auch die mitgelieferten Funktionen der C Standard Library gehören zu 
C und man sollte sie (bzw. die meisten) kennen.

von Yvonne J. (laserlight)


Lesenswert?

(Index[1] -0x30) *100 + (Index[2]-0x30)*10 + Index[3]-0x30

ist top

Atoi ist doch der Killer, warum

Apropos:

es ist ein Unterschied ob du in c schreibst:

"1" oder '1'

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Yvonne J. schrieb:
> (Index[1] -0x30) *100 + (Index[2]-0x30)*10 + Index[3]-0x30

Aber dann schreibs bitte nicht so, sondern so
1
  (Index[1] - '0') *100 + (Index[2] - '0')*10 + Index[3]-'0'

läuft zwar auf genau das gleiche hinaus, aber kein Mensch muss sich 
fragen, ob es mit den 0x30 eine besondere Bewandtnis hat. Hier ist 
völlig klar, dass es sich bei dem Inhalt von Index[1] nur um ein Zeichen 
handeln kann, denn ansonsten würde man ja nicht das Zeichen '0' 
abziehen.

von H.Joachim S. (crazyhorse)


Lesenswert?

Jo, stimmt schon.
Ich machs aber schon immer so (ist sicher kein Argument für andere, das 
auch so zu machen).
Wenn -0x30 auftaucht, weiss ich sofort, was gemeint ist. Ich finds nicht 
unbedingt schlechter.

von B. S. (bestucki)


Lesenswert?

Yvonne J. schrieb:
> (Index[1] -0x30) *100 + (Index[2]-0x30)*10 + Index[3]-0x30
>
> ist top
>
> Atoi ist doch der Killer, warum

Warum sollte atoi der Killer sein? Diese Funktion macht nichts anderes, 
als du geschrieben hast, nur in einer Schleife.

H.Joachim S. schrieb:
> Wenn -0x30 auftaucht, weiss ich sofort, was gemeint ist. Ich finds nicht
> unbedingt schlechter.

Ich würde dazu eine Funktion mit geeignetem Namen benutzen. Dort ist 
dann egal, ob man '0' oder 0x30 schreibt, denn es ist aus dem Kontext 
ersichtlich, was gemacht wird.

von µCHater (Gast)


Lesenswert?

Chr. M. schrieb im Beitrag #4336734
> ich hoffe hier ist jemand so nett mir weiterzuhelfen,

> Also im Array steht:
> byte myArray[8] = {31,32,33,34,35,36,37,38}

was sollte 31 sein?
ein char als ascii code 31?
oder meintest du 0x31 für das char '1'

> und in der Variablen will ich z.B.:
> Var_aus_myArray_1bis3 = 234

dann mach:
1
byte myArray[8] = {0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38};
2
byte Var_aus_myArray_1bis3[3];
3
4
5
Var_aus_myArray_1bis3[0] = myArray[1];
6
Var_aus_myArray_1bis3[1] = myArray[2];
7
Var_aus_myArray_1bis3[2] = myArray[3];
8
9
printf ("mein Array 1-3 : %i%i%i", Var_aus_myArray_1bis3[0],
10
                                   Var_aus_myArray_1bis3[1],
11
                                   Var_aus_myArray_1bis3[2]);

von Irgendwer (Gast)


Lesenswert?

µCHater schrieb:
> byte myArray[8] = {0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38};

oder eher
1
char myArray[9] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x0};
oder
1
char myArray[9] = {'1', '2', '3', '4', '5', '6', '7', '8', 0};
oder
1
char myArray[] = {"12345678"};
oder
1
char *myArray = {"12345678"};

ist alles das gleiche, nur man sieht besser was eigentlich gemeint 
ist:-)

von anmerker (Gast)


Lesenswert?

Karl H. schrieb:
> Aber dann schreibs bitte nicht so, sondern so  (Index[1] - '0') *100 +
> (Index[2] - '0')*10 + Index[3]-'0'
>
> läuft zwar auf genau das gleiche hinaus, aber kein Mensch muss sich
> fragen, ob es mit den 0x30 eine besondere Bewandtnis hat. Hier ist
> völlig klar, dass es sich bei dem Inhalt von Index[1] nur um ein Zeichen
> handeln kann, denn ansonsten würde man ja nicht das Zeichen '0'
> abziehen.

ich bin zwar nicht der Typ, der sonst KHB verbessert/widerspricht, aber 
für den, der sich mit Programmieren und im Besonderen mit ASCII-Zeichen 
nicht besonders gut auskennt, für den ist es egal ob da '0', 0x30 oder 
gar 48 steht. Für den sind das alles Magic-Numbers.

Nur so angemerkt...;-)

von Eric B. (beric)


Lesenswert?

anmerker schrieb:
> für den, der sich mit Programmieren und im Besonderen mit ASCII-Zeichen
> nicht besonders gut auskennt, für den ist es egal ob da '0', 0x30 oder
> gar 48 steht. Für den sind das alles Magic-Numbers.

Für den ist ein C-Buch das geeignete Werkzeug sich dieser Magic zu 
demystifizieren.

Nur so angemerkt.

von snowfly (Gast)


Lesenswert?

Irgendwer schrieb:
>> byte myArray[8] = {0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38};
>char myArray[9] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x0};
>char myArray[9] = {'1', '2', '3', '4', '5', '6', '7', '8', 0};
>
> ist alles das gleiche, nur man sieht besser was eigentlich gemeint
> ist:-)

zwischen dem 1. Array und deinen gibt es doch einen signifikanten 
Unterschied.
Oder zaubert sich der Abschluss des char Arrays selbst dorthin?


Am Ende habe ich es jetzt so gelöst:
1
#define MSGBYTES 73
2
#define MSGBEGIN 64
3
#define MSGSTOP 70
4
5
byte myArray[MSGBYTES];
6
char distanceA[7];
7
unsigned long distance;
8
9
[...]
10
11
  for (int i=MSGBEGIN;i<MSGSTOP;i++) { 
12
    distanceA[i-MSGBEGIN] = myArray[i]; }
13
  distanceA[6] = '\0';  //Ende des String Arrays
14
  distance=(atoi(distanceA));
15
  Serial.println(distance);

Danke noch an die wenigen die mit was anderem als "ich bin so toll und 
du nicht" geantwortet haben.

von Peter II (Gast)


Lesenswert?

snowfly schrieb:
> unsigned long distance;
> distance=(atoi(distanceA));

atoi liefert dir aber kein unsigned Long, alles was größer als 32.768 
ist wird Probleme machen.

und was soll diese Merkwürdige Klammer um das atoi?

von Peter D. (peda)


Lesenswert?

1
#include <stdio.h>
2
3
sscanf( myArray+1, "%3d", &Var_aus_myArray_1bis3 );

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.