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
>"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...).
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.