www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik usart - stringauswertung


Autor: Floyd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: unbeschreiblicher Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...).

Autor: fieser Rahul (auch Oskar genannt) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.