Forum: Mikrocontroller und Digitale Elektronik usart - stringauswertung


von Floyd (Gast)


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

von unbeschreiblicher Rahul (Gast)


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...).

von fieser Rahul (auch Oskar genannt) (Gast)


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.


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.