usart - stringauswertung

Gast #470297
Lesenswert?
• ▲
▼
hallo zusammen!
aus matlab schicke ich 4 strings, die wie folgt aussehen:
"1 xxx_"
"2 xxx_"
"3 xxx_"
"4 xxx_"
die erste zahl steht für die aktorennummer, xxx für den pwm-wert und _ 
ist mein definiertes stringendezeichen.

bis jetzt sieht mein code so aus:

///////////////////////////////////////////////////////////////////
//einlesen
//////////////////////////////////////////////////////////////////
// Einlesen von 8 empfangenen Bits
unsigned char USART_RX(void)
{
  while(!(UCSRA&(1<<RXC)))
    ;
  return UDR;
}

// Rufe USART_RX solange auf, bis das definierte Stringendezeichen "_" 
auftritt.
void uart_gets( char* Input )
{
  char c = USART_RX();

  while( c != '_' )
  {
    *Input = c;
    Input++;
    c = USART_RX();
  }
  *Input = '\0';
}

/////////////////////////////////////////////////////////////////
// auswerten
////////////////////////////////////////////////////////////////
// Die Aktuatornummer nummerisch machen
AktuatorNr = Buffer[0] - '0';
// Den PWM Wert umrechnen lassen
PWM1 = atoi(&Buffer[2]);

leider bin ich in c nicht so fit und würde mich an dieser stelle über 
eure unterstützung freuen. es wäre schön, wenn ich nur einen string 
verschicken müßte - z.b. "1 xxx; 2 xxx; 3 xxx; 4 xxx_", aus dem dann die 
folgenden zuweisungen erfolgen pwm1=xxx, pwm2=xxx, etc.

erst einmal vielen dank denjenigen, die bis zu dieser zeile gelesen 
haben und natürlich auch vielen dank für eure antworten.

gruß
  Floyd
Gast #470308
Lesenswert?
• ▲
▼
>"1 xxx; 2 xxx; 3 xxx; 4 xxx_"

Da hast du doch schon 2 "Stringendezeichen" drin...
Für eine einfache Umsetzung sollte man das Protokoll erweitern (und 
vielleicht auch noch Endezeichen wie "CR" benutzen).

Erweiterung: "P1=xxx"+CR


Für solche Sachen bieten sich Statemachines an:
Die einzelnen Stati werden hochgezählt.
Status 0:
Du empfängst ein Zeichen. Wenn dieses Zeichen ein "P" ist, wird der 
Status um  1 erhöht, ist es ein anderes, passiert nichts.
Status 1:
Du empfängst ein Zeichen. Wenn dieses Zeichen eine "Ziffer" 
(ASCII-Zeichen) zwischen 1 und 4 ist, wird der Status um  1 erhöht, ist 
es ein anderes, wird der Status auf 0 zurückgesetzt (und der Fehler 
behandelt...).
Status 2:
Du empfängst ein Zeichen. Wenn dieses Zeichen ein "=" ist, wird der 
Status um  1 erhöht, ist es ein anderes, wird der Status auf 0 
zurückgesetzt (und der Fehler behandelt...).
Status 3,4,5 und 6:
Du empfängst ein Zeichen. Wenn dieses Zeichen eine Ziffer ist, wird der 
Status um  1 erhöht, ist es "CR" wird der Status auf 7 gesetzt, ist ein 
anderes, wird der Status auf 0 zurückgesetzt (und der Fehler 
behandelt...).
Status 7:
Dein String wurde komplett empfangen und kann ausgewertet werden...
So ist es möglich, die PWM-Einstellung unabhängig von der Reihenfolge 
einzustellen. Wenn man alle "gleichzeitig" ändern will, muß man das 
entsprechend berücksichtigen (und ein Trennzeichen definieren...).
Gast #471556
Lesenswert?
• ▲
▼
>motor1 = xxx, motor2 = xxx

Du willst also "einfach" die in ASCII-Zeichen übertragenen Zahlen als 
Wert an deine PWM übertragen?

Dazu brauchst du nur die Ziffer (i), die bei Status 1 empfangen hast als 
Index für ein Feld "motor" nehmen.

Bei der Abfrage 3,4 und 5 setzt du dann
motor[i] = motor[i]*10+Ziffer solange, bis CR angekommen ist.
Vorteil "meines" Protokolls ist übrigens, dass eine Synchronisation zu 
Beginn eines Datenrahmens stattfindet.
Dein Protokoll hätte das Problem, dass es bei einem Übertragungsfehler 
(z.B.: ein Byte wurde aus welchen Gründen auch immer nicht empfangen) 
Fehler produiziert.

Der obige Ablauf ist eigentlich nur das Vorgehen, um Fehler zu 
entdecken.
Dass man dabei auch noch mehr machen kann, hatte ich vorrausgesetzt.

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.