Forum: Compiler & IDEs UART verständnis problem


von Kofi (Gast)


Lesenswert?

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

von Peter Fleury (Gast)


Lesenswert?

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.

von Kofi (Gast)


Lesenswert?

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();
}

von leo9 (Gast)


Lesenswert?

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

von Peter Fleury (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

"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

von Jörg Wunsch (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.