Hallo, ich möchte daten vom PC in den µC schreiben... sagen wir mal 101 Bytes wobei das 1. Byte die Speicher-Startadresse für die 100 folgenden Bytes beinhaltet. Ich weiß nur das ein Interrupt ausgeführt wird sobald Daten im Uart-buffer angekommen sind... wird der nach jedem empfangenen Byte ausgeführt oder wie läuft das ? In Peters Uart library gibt es keinen Funktionsblock für einen "Incomming-Data-Uart-Interrupt" z.B. uart-incomming-int(blah blah) //wird ausgeführt sobald ein Byte im buffer liegt { /* Hier könnte ich jetzt jedes mal reinschreiben was mit dem aktuell empfangenen Byte geschehen soll. */ } Wie funktioniert das ohne soeinen Interrupt-Funktionsblock ? c = uart_getc(); Gehe ich recht in der Annahme das c nun das zuletzt empfangene Byte beinhaltet ? Wie muss ich dann diese abfrage machen, das ich die Wertzuweisung c = uart_getc(); immer genau dann habe nachdem ein Byte empfangen wurde ? Und wieviel zeit bleibt mir bei 9600 baud um das Letzt Byte zu verarbeiten bevor das nächste kommt? Danke... Ich hoffe es verstht jemand wie ich das meine g gruß kofi
Meine UART library verwendet natürlich Interrupts zum empfangen und senden. Bitte schaute das Beispiel "test_uart.c" sowie die Online Doku an um zu verstehen wie man diese Library verwenden muss.
Ich möchte ja wirklich nicht unhöflich sein aber ziemlich oft bekommich als Antwort schau dir das Beispiel an oder leiß die Anleitung... Hätte ich mir das Beispiel (uartlibrary.zip) nicht angesehen, hätte ich auch keine verständnis Probleme! Ich bin nunmal kein Profi der diese grob kommentierten Beispielsources auf anhieb versteht du hast z.B. KEINE meiner Fragen beantwortet. Wenn ich jetzt nur geschrieben hätte "DAS GEHT NICHT - WARUM??" ... dann könnte ich verstehen wieso deine Antwort so "detailiert" ist aber meine Fragen waren doch wohl schon RELATIV konkret. Ich verstehe nicht wo das Ereignis "UART-Daten sind angekomen" Bearbeitet wird... Ich vermisse diesen Block ... Ich habe schonmal mit Timer Interrupts gearbeitet da gibts das doch auch: Gibt es einen Overflow im Timer Register wird der Block ausgeführt: SIGNAL(SIG_OVERFLOW1) // handler for tcnt1 overflow interrupt { blah_blah(); }
Bei 9600Baud, 1Stopbit und no parity hast du mindestens 1,04ms Zeit zwischen zwei Bytes (bei den meisten Sendern wohl noch ein bis zwei bitlängen mehr). Bytelänge = 1 / Baud * Bitanzehl = 1 / 9600 * 10 (1Start+8Daten+1Stopbit) = 1,04ms grüsse leo9
Die UART libarary empfängt die Daten via Interrupt und speichert sie in einen internen Ringbuffer. Das Hauptprogramm muss sich deshalb nicht um Interrupts kümmern sondern nur mittels uart_getc() die empfangenen Daten aus diesem Ringbuffer entnehmen.
"sagen wir mal 101 Bytes wobei das 1. Byte die Speicher-Startadresse für die 100 folgenden Bytes beinhaltet." Zuerst solltest Du Dir ein Protokoll ausdenken, welches bei fehlerhaften Paketen immer in der Lage ist, den Anfang des nächsten Pakets zu erkennen und danach korrekt zu empfangen. In der Regel passiert es nämlich, wenn man beide Geräte zu unterschiedlichen Zeiten einschaltet bzw. wenn man das Kabel reinsteckt, daß dann fälschlich ein Startbit erkannt werden kann, bzw. daß der eine schon sendet, während der andere sich noch initialisiert. Also Bytes zuviel oder zuwenig empfangen werden. Ohne Protokoll hast Du dann nur lauter unsinnige Daten. Peter
Man könnte ja auch drauf verzichten, das Fahrrad nochmal zu erfinden, und eins der bewährten Protokolle benutzen. X-Modem sollte simpelst zu implementieren sein, allerdings hat es keine Prüfsumme. Z-Modem bietet bißchen mehr, kostet aber auch mehr Aufwand. Kermit ist ebenfalls noch gängig. Das kann sogar mein alter HP48 Taschenrechner, kann also so schlimm auch nicht zu implementieren sein. Beispielimplementierungen für all dies findet man auch mit bißchen Suche.
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.