Teil eines byte Arrays in Variable

OP #4336734
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.
#4336754
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.
(Firma: CIA) #4336758
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.
#4336760
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.
#4336775
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.
#4336806
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.
Gast #4336862
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]);
Gast #4336931
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:-)
Gast #4336952
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...;-)
Gast #4338143
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.

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