Forum: Mikrocontroller und Digitale Elektronik RS232 Daten in Int-Array


von JOchen (Gast)


Lesenswert?

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?

von JOchen (Gast)


Lesenswert?

Programmiersprache ist (natürlich) C

von Dirk (Gast)


Lesenswert?

Hallo,

sicherlich benutzt Du einen Ringbuffer um deine Daten zu empfangen, dann 
kannst recht einfach per memcopy deine Nutzdaten in ein anderes Array 
schaufeln.

von Boxi (Gast)


Lesenswert?

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

von JOchen (Gast)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von oldmax (Gast)


Lesenswert?

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

von oldmax (Gast)


Lesenswert?

Mist... nicht schnell genug.....
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
Noch kein Account? Hier anmelden.