MSP430 Launchpad, String über UART lesen und analysieren.

Gast #4401905
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
#4402031
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;
>   }
Gast #4405236
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??
#4405248
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 );
Gast #4405286
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 %.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.