Forum: Mikrocontroller und Digitale Elektronik Peter Fleury UART


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Simon (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich möchte über ein PC Programm einige Daten an meinen Atmega schicken.

Der Empfang der Seriellen Daten soll über Interrupt gesteuert werden.
Habe mir zu diesem Zweck Peter Fleurys Bibliotheken besorgt.

Nur mein Problem ist ich weis nicht wie ich die Funktion fürs empfangen 
verwenden soll...

Es wird in der bibliothek ein Interrupt generiert, Das heist ja in 
meinem Empfangsbuffer steht nun das Empfangene Char-Zeichen.

Kann ich das dann irgendwann in meinem Programmablaufmit get_C aus dem 
Buffer holen?

Wie kann ich das dann mit einem String lösen? dann würde ja eigentlich 
nur das letzte Zeichen im Buffer stehen bleiben? oder?


Vielen Dank im Voraus schon mal....


Viele Grüße

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
Simon schrieb:
> Hallo zusammen
>
> Ich möchte über ein PC Programm einige Daten an meinen Atmega schicken.
>
> Der Empfang der Seriellen Daten soll über Interrupt gesteuert werden.
> Habe mir zu diesem Zweck Peter Fleurys Bibliotheken besorgt.
>
> Nur mein Problem ist ich weis nicht wie ich die Funktion fürs empfangen
> verwenden soll...


Im Zip-File, welches du Downgeloaded hast, ist doch ein Beispiel 
enthalten.
Schon studiert?

> Wie kann ich das dann mit einem String lösen?

Ein Zeichen nach dem anderen, solange bis du an dem Zeichen erkennst, 
dass nichts mehr kommen wird.

> dann würde ja eigentlich nur das letzte Zeichen im Buffer stehen bleiben?
>  oder?

Dann hätte das ganze aber wenig Sinn. Natürlich hat die Fleury Lib einen 
kleinen Buffer mit, in dem Zeichen erst mal zwischengespeichert werden, 
bis dein Code sie abholt.

: Bearbeitet durch Moderator
von Simon (Gast)


Bewertung
0 lesenswert
nicht lesenswert
HI

Vielen Dank für die Antwort.

Leider hat dass nicht meine Farge beantwortet...(Vllt. Waren die ja auch 
umständlich gestellt??)

Naja folgendes zum generellem Ablauf des Programmes:

PC sendet String-> löst einen Interrupt im AVR aus->der Programmablauf 
stoppt-> das erste empfangene Byte landet im Buffer... Und dann???

Werden die restlichen Bytes die empfangen werden gleich im RX Buffer 
gespeichert?  Ich kann leider den entsprechenden Code in der uart.c 
nicht finden...

Mein µC macht ist eigentlich mit komplett was anderem beschäftigt es 
sollen nur ein paar parameter gesendet werden nach dem empfang macht der 
AVR weiter wie bisher.

Das ist momentan mein Problem. Weil ich nicht genau verstehe wie die Lib 
funktioniert....

Dass ich eine Stoppbedingung programmieren ist, das ist mir schon klar 
damit der Controller weis wann  der Empfang zu ende ist

Danke schonmal

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
Simon schrieb:
> HI
>
> Vielen Dank für die Antwort.
>
> Leider hat dass nicht meine Farge beantwortet...(Vllt. Waren die ja auch
> umständlich gestellt??)
>
> Naja folgendes zum generellem Ablauf des Programmes:
>
> PC sendet String

erste Frage
woran kann die Gegenstelle erkennen, dass der String zu Ende ist.
Das ist eine der wichtigen Fragen. Denn dein µC kann von vorne herein 
nicht wissen, ob nach den Zeichen 'B' 'U' 'S' noch etwas kommen wird 
oder nicht. Vielleicht kommt nichts mehr, vielleicht kommt aber noch ein 
"haltestelle" hinten nach. Woher weiß also der Empfänger, dass die 
Abfolge der Zeichen, der der Empfänger für sich wieder zu einem String 
zusammensetzt, beendet ist?

> -> löst einen Interrupt im AVR aus->der Programmablauf
> stoppt-> das erste empfangene Byte landet im Buffer... Und dann???

Das interessiert dich mit der Fleury Lib alles nicht.
Die benutzt du einfach nur.

Im Hauptprogramm rufst du die (ich glaube die hiess so) Funktion "getc" 
auf und die sagt dir ob ein Zeichen vorliegt und welches es war, oder ob 
keines da ist.
Um den Mechanismus dahinter brauchst du dich nicht weiter kümmern. Der 
Mechansimus ist so ausgelegt, dass er zwischendruch auch schon mal ein 
paar Zeichen zwischenspeichern kann, weil dein Hauptprogramm vielleicht 
mal keine Zeit hatte, sich sofort um ein eingehendes Zeichen zu kümmern. 
Das braucht dich aber nicht weiter kümmern, dann das ist für dich 
komplett transparent. Aus dieser get-Funktion kommen die Zeichen exakt 
in der Reihenfolge wieder raus, wie sie empfangen wurden. Egal ob sie 
zwischendurch in einem Zwischenbuffer geparkt wurden oder nicht. Solange 
dieser BUffer nicht überläuft (wenn ich mich recht erinnere, ist eer 
defaultmässig auf 32 eingestellt), geht nichts verloren - selbst wenn es 
im Hauptprogramm mal wieder etwas länger dauert.

> Werden die restlichen Bytes die empfangen werden gleich im RX Buffer
> gespeichert?

Ja.
ABer ich denke, du machst den Kardinalfehler Nummero One.
Du erwartest zuviel.
Der Sender schickt einen String auf die Reise, indem er Zeichen für 
Zeichen überträgt. Aus deiner UART bzw. den Fleury-Funktionen kommen 
wieder Zeichen für Zeichen heraus.
Ob und was diese zeichen bedeuten, das ist auf dieser Ebene nicht 
festgelegt. Für die UART bzw. die Mechanismen, die da dahinter stecken 
endet die Welt mit einzelnen Zeichen (eigentlich Bytes). Alles darüber 
hinausgehende ist dein Bier.

Ob du Zeichen sammelst und in einem Array ablegst, bis du einen 
Zeilenvorschub ('\n') in den Daten entdeckst, oder ob du einen String 
mit einem speziellen anderen Zeichen als beendet erklärst, ob du Strings 
überträgst indem du zuerst die Anzahl der nachfolgenden Zeichen 
überträgst - das alles ist dein Bier. Weder die UART noch die Fleury 
Funktionen kümmern sich darum. Die sind nur für die Transportebene 
zuständig. So wie eine Telefonleitung. Ob du die Telefonleitung zur 
Sprachübertragung benutzt, oder ob da ein Fax übertragen wird, indem das 
Gerät in einem bestimmten Muster in die Leitung hineinpfeift, kümmert 
weder die Telefonleitung noch das Vermittlungsamt, sondern ist ganz 
alleine das Bier der Endstellen.

: Bearbeitet durch Moderator
von Simon (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Dann schonmal Vielen Dank für die erklärung dass hat mir doch schon sehr 
weitergeholfen ;-)

Jetzt habe ich endlich einen Ansatz wie ich das gelöst bekomme...


Viele Grüße

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.