Klar, fast unnötig Dir beizupflichten. Aber es geht natürlich auch anders.... den Pin also dauernd abfragen um das Startbit zu erkennen ... Mitte des Startbits finden ... darf nie durch eine andere Interruptroutine verzögert ...
Mein UART läuft (eigentlich bei allen Lösungen) auf Interrupt und schreibt in einen FIFO-Ringspeicher. Dann schaue ich im Vorbeigehen nachund WENN etwas im FIFO steht wird es abgeholtCode:if ( ! ukbhit0 () ) continue;und auf einen signifikanten Telegramm-Anfang abgefragt, der aus einem, einzigen ASCII-Zeichen besteht, das aber so in den Telegrammen natürlich nicht vorkommen darf (Buchstabe/n, oft natürlich #, * oder so)Code:zeichen_aus_fifo = ugetchar0();Dieses "Schlüsselzeichen" wiederum ergibt die Telegrammlänge. Die kann, z.B. im Beispiel "KOMMANDO_NORM" 1 sein und das ist das Kommandobyte alleine. Das Telegramm wird, wieder im Vorbeigehen, ausgelesen (in voller, aber eben nur für DIESES Telegramm festgelegten Länge) und ausgewertet. Dazwischen laufen mehrere andere Interrupts, die so wenig stören, dass ich im Standardfall Controller<->PC mit lesen und schreiben über UART-USB-Wandler locker 115k2 Bd schaffe, bei Controller-Controller-Kommunikation sogar die vollen Kanne mit 1,2 MBd (da beide Controller mit 20 MHz laufen, haben die den gleichen "Rechen-/Zeitfehler" beim UBRR. Zusätzlicher Vorteil natürlich zwei Kommunikationsrichtungen. Nachteil: Es ist KEIN Busverfahren.Code:if (zeichen_aus_fifo == KOMMANDO_APPS) // Fahre Anwendungsprogramme telegrammlaenge = KOMMANDO_APPS_LEN; // mit und ohne Parameter if (zeichen_aus_fifo == KOMMANDO_DATS) // Servo Daten von allen telegrammlaenge = KOMMANDO_DATS_LEN; // Servos anzeigen if (zeichen_aus_fifo == KOMMANDO_NORM) // Servo Normposition telegrammlaenge = KOMMANDO_NORM_LEN; // anfahren







Zitieren
Lesezeichen