Forum: Mikrocontroller und Digitale Elektronik MSP430 Launchpad, String über UART lesen und analysieren.


von Valentin (Gast)


Lesenswert?

Hallo,
ich schreibe ein Programm, das 4 PWM-Signale erzeugt, die dann von PC 
aus über UART gesteuert werden müssen. Dafür muss eine Zeile in einer 
speziellen Format eingegeben werden, z.B. N1PW30, wobei die Zahl nach N 
die Nummer des zu ändernden Signals ist und die Zahl nach PW die 
gewünschte Weite ist.
Mit der PWM-Erzeugung war nicht so schwer, aber mit der Steuerung komme 
ich noch nicht klar. Ich bin C-Anfänger. Ich verstehe es so: ich lese 
die Zeile in ein Array ein und dann frage die Zeichen byteweise ab. So?
Im Internet habe ich das hier gefunden
1
char *UART_getChar()
2
  {
3
    int i= 0;
4
    char *buf;
5
    while (!(IFG2&UCA0TXIFG)) // wenn nix gerade gesendet wird
6
    {
7
    
8
     buf[i++] = UCA0RXBUF; // RX-Register in die buf einschreiben
9
    }
10
    return buf;
11
  }
Wie kann ich dann die Variable korrekt bearbeiten? Wenn ich versuche, 
einer Variable die Antwort der Funktion *UART_getChar() zuzuweisen, geht 
es nicht. Das ist wahrscheinlich eine falsche Denkweise, deswegen bin 
ich dann hier.

Gruß
Valentin

von Georg G. (df2au)


Lesenswert?

Valentin schrieb:
> char *UART_getChar()
>   {
>     int i= 0;
>     char *buf;

welchen Wert hat buf hier?

>     while (!(IFG2&UCA0TXIFG)) // wenn nix gerade gesendet wird
>     {

das kann sehr lange sein, entsprechend oft kommt die nächste Zeile dran
>
>      buf[i++] = UCA0RXBUF; // RX-Register in die buf einschreiben

buf ist undefiniert, du schreibst ins Nirwana. Und das sehr oft. Das 
zerhämmert deinen kompletten Speicher.

>     }
>     return buf;
>   }

von modern (Gast)


Lesenswert?


von Valentin (Gast)


Lesenswert?

Leute, ich habe jetzt Folgendes:

Die Funktion "getchar" liest die Zeichen ab und gibt immer "char" 
zurueck.
1
char getchar()
2
{
3
  while((IFG2 & UCA0RXIFG) == 0)
4
    ;
5
  return UCA0RXBUF;
6
}

Dann packe ich die Zeichen in ein Array ein.
1
char buffer[7];
2
ltoa((long) getchar(), buffer);

Dann erstelle ich einen Zeiger auf das Array und uebergebe diesen Zeiger 
einer Funktion, die die angekommene Zeile zeichenweise analysiert.
1
char const *a = 0;
2
3
analyse(buffer[a]);

Die Funktion bekommt als Argument einen Zeiger "char const *". Ich 
bekomme einen Fehler, wo steht "expression must have integral type". hat 
jemand eine Idee, was ich machen koennte??

von Karl H. (kbuchegg)


Lesenswert?

Valentin schrieb:

> Dann packe ich die Zeichen in ein Array ein.
>
1
> char buffer[7];
2
> ltoa((long) getchar(), buffer);
3
>

Nö.

Ein einzelnes Zeichen ist zuallererst mal kein String. Ein einzelnes 
Zeichen ist ein 'A' oder ein 'B' oder auch ein '5' oder ein '?'. Aber 
das ist noch lange kein String.

was du hier machst, das ist komplett undefiniert. Du castest dir die 
Dinge so lange zurecht, bis dein Compiler das irgendwie frisst und 
machst dabei das komplett falsche.

Erst mal musst du die einzelnen Zeichen sammeln (in dem Array, das du 
ruhig auch ein wenig größer machen kannst), bis du das Zeilenende vom 
Sender erhältst. Auch das Zeilenende ist ein Zeichen. Es schreibt sich 
in C als '\n'.

D.h. du sammelst erst mal
1
   index = 0;
2
3
   c = getchar();
4
   while( c != '\n' ) {
5
     buffer[index] = c;
6
     index++;
7
     c = getchar();
8
   }
9
10
   buffer[index] = '\0';

und erst jetzt hast du einen String, auf den du zb ltoa los lassen 
kannst, welches dir aus dem String "456" die Zahl 456 generiert.

>
1
> char const *a = 0;
2
> 
3
> analyse(buffer[a]);
4
>

Dazu brauchst du keinen extra Pointer. Du kannst ganz einfach buffer in 
diese Funktion hineingeben
1
   analyse( buffer );

: Bearbeitet durch User
von so hab ich s veretanden (Gast)


Lesenswert?

@KHB
Schau ganz oben. Der String ist konstant und muss nicht terminiert sein.

Mein Weg:
Auf N triggern, das nächste Zeichen als Kanalnummer speichern, die 
nächsten beiden Zeichen verwerfen (oder auf genau PW prüfen) und dann 
zwei Zeichen als PWM-Wert in %.

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.