Teil eines byte Arrays in Variable

OP #4336734
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.
OP #4336751
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..
#4336754
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
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
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
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
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
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
µ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
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...;-)
#4337032
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.
Gast #4338143
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

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.