Hallo ich habe folgendes Problem: Meine Daten kommen im folgende Format vom Pc zum µC: !22§34234? oder !4§33? Ich möchte nun nur die Zahlen auslesen, also beim ersten String soll dann in das zweidimensonale Int-Array die Zahl 22 und 34234 geschrieben werden. Wie kann ich sowas lösen? Die Abfrage auf die Zeichen wie !, §, ? ist kein Problem aber wie bekomm ich die Zahlen in ein int bzw. in das int-Array?
Hallo, sicherlich benutzt Du einen Ringbuffer um deine Daten zu empfangen, dann kannst recht einfach per memcopy deine Nutzdaten in ein anderes Array schaufeln.
Ist das Protokoll vorgegeben oder kannst du das noch ändern? Ich würde dann die Daten nicht dezimal übertragen, sondern hexadezimal. Damit kann der µC auf Anhieb mehr anfangen. Ansonsten schau dir mal sscanf() an. Grüße Boxi
Aktuell hab ich es so gemacht:
1 | char data = UCA0RXBUF; |
2 | |
3 | |
4 | switch(data) { |
5 | case '!': start = 1; |
6 | break; |
7 | case '§': endefehler = 1; |
8 | break; |
9 | case '?': ende = 1; |
10 | break; |
11 | default: data = data; |
12 | }
|
13 | |
14 | if(start==1 || endefehler==0 || ende==0){ |
15 | fehlernr[pointer] = data; |
16 | pointer++; |
17 | //Lese Fehlernr.
|
18 | |
19 | }
|
20 | |
21 | if(start==1 || endefehler==1 || ende==0){ |
22 | fehlerzeitpunkt[pointer2] = data |
23 | pointer2++; |
24 | //Lese Fehlerzeitpunkt
|
25 | |
26 | }
|
27 | |
28 | //...........
|
Heißt also das ich beim auslösen des Interrupts nach dem Abschlusszeichen zb. folgendes stehen hab: fehlernr[] = "22" und fehlerzeitpunkt[] = "3422" Dies sind ja char-Array nun möchte ich die zahlen halt in ein int array haben
JOchen schrieb: > Dies sind ja char-Array nun möchte ich die zahlen halt in ein int array > haben #include <stdlib.h> int nArr[2]; nArr[0] = (int)strtol(fehlernr, NULL, 10); nArr[1] = (int)strtol(fehlerzeitpunkt, NULL, 10); mfg.
JOchen schrieb: > Heißt also das ich beim auslösen des Interrupts nach dem > Abschlusszeichen zb. folgendes stehen hab: fehlernr[] = "22" und > fehlerzeitpunkt[] = "3422" > Dies sind ja char-Array nun möchte ich die zahlen halt in ein int array > haben Wenn du sie schon als String vorliegen hast, dann ist atoi() oder strtol() die Funktion die du suchst. Aber: Du musst ja nicht unbedingt erst einen String zusammenstellen: Wenn nacheinander die Buchstaben '2' und '3' eintrudeln, dann kannst du die ja ganz leicht zu einer Zahl zusammensetzen. UM den Zahlenwert des 'Buchstabens' zu erhalten, ziehst du einfach vom ASCII Code den Code für '0' ab und schon wird aus '6' die Ziffer 6 und aus '2' wird die Ziffer 2. Jetzt musst du nur noch mathematisch beobachten, wie man eine eine bestehende Zahl, zb 372, eine nächste Ziffer, zb 8, 'hinten drann hängt'. Aus 372 und 8, soll also 3728 werden. Das ist aber nicht weiter schwer. Zahl = 10 * Zahl + Ziffer; oder in deinem Fall dann eben Zahl = 10 * Zahl + ( Buchstabe - '0' ); Und so kannst du dann, sobald eine Ziffer zu einer Zahl eintrifft, ganz einfach die Zahl mit dieser Ziffer ergänzen. Noch eine kleine Logik dazu, die feststellt zu welcher der beiden Zahlen die Ziffer gehört und du hast es. Der Vorteil den du hier hast besteht darin, dass du kein char-Array brauchst, welches du erst mal sinnvoll dimensionieren musst.
1 | ...
|
2 | switch(data) { |
3 | case '!': |
4 | first = 1; |
5 | Zahl1 = 0; |
6 | Zahl2 = 0; |
7 | break; |
8 | |
9 | case '§': |
10 | first = 2; |
11 | break; |
12 | |
13 | case '?': |
14 | first = 0; |
15 | break; |
16 | |
17 | default:
|
18 | if( first == 1 ) |
19 | Zahl1 = 10 * Zahl1 + ( data - '0' ); |
20 | else if( first == 2) |
21 | Zahl2 = 10 * Zahl2 + ( data - '0' ); |
22 | }
|
23 | |
24 | ...
|
ganz einfach und simpel.
Hi Ach so, Hochsprache... das ist ja langweilig. Um eine ASCII-Ziffer in eine Zahl zu wandeln, brauchst du doch nur die Funktion StrToInt oder sowas ähnliches aufzurufen. Es gibt in Hochsprachen doch diese netten Formatwandlerfunktionen. Schau mal in der Hilfe nach. Kannst allerdings auch selbst konvertieren. ASCCI-30hex ergibt den Integerwert der ZAhl. Dann nur noch die Stellen zusammenbasteln.... Gruß oldmax
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.