UART verständnis problem

Gast #77349
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
Gast
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.
Gast
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();
}
Gast
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
Gast
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
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.