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.
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..
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.
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.
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.
(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ß
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.
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.
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.
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:
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...;-)
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.
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
bytemyArray[MSGBYTES];
6
chardistanceA[7];
7
unsignedlongdistance;
8
9
[...]
10
11
for(inti=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.
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?