Forum: Mikrocontroller und Digitale Elektronik RS232 Problem mit Empfang der Daten


von Fichte (Gast)


Lesenswert?

Hay @all

Ich habe das Problem das ich üebr die RS232 Schnittstelle einen Daten
Stream Bekomme der so Aussieht

Anfang Stream (0xFF)
Wieviele Daten Kommen (0x08)
Dann die 8 Daten die ich Empfange.

Nun mein Problem wenn ich nun die Daten Empfange möchte ich diese in
200ms Abständen Berechnen und Ausgeben lassen auf ein LCD.

Das Berechnen und Ausgeben mache ich in einen Timer Interrupt.

Nun mein Problem:

Ich Empfange die Daten Am Anfang Korrekt bis zum ersten Timer Interrupt
den wenn dieser Einsetzt und die RS232 ist zbs. gerade dabei die 4 Daten
zu Empfangen Springt er dort raus und Berechnet -> Zeigt an, nun Springt
er wieder in meine Schleife urück wo er Aufgehört hat und macht dort
weiter aber der DAten Strean hört nicht auf zu senden also Empfange ich
in der Zeit FAlsche daten bzw. er macht mit den Falschen Daten weiter
was kann ich tun um dies zuvermeiten bzw. wie kann ich das kannse erst
Starten wenn er alle 8 Daten Empfangen hat???

Ich schreibe in Codevision.

MFG: Fichte

von Max (Gast)


Lesenswert?

Ich würde mit zwei Buffern arbeiten:
1: Daten, die seriell empfangen werden.
2: Daten, mit denen gerechnet werden soll.
Dann musst Du nur noch den Timer-Interrupt während der sehr kurzen Zeit
stoppen, in der die Daten von Buffer1 zu Buffer2 übertragen werden.

Andere Möglichkeit: Wenn eine serielle Übertragung stattfindet, wird
währenddessen der Timer-Interrupt blockiert und erst dann wieder
freigegeben, wenn alle Daten übertragen sind.

von Rahul D. (rahul)


Lesenswert?

Einfacher sollte es sein, den Timer-Interrupt zu sperren, sofern die
Daten unterschiedlich lang sein können.
Wenn sichergestellt ist, dass FF nur als Start-Byte empfangen werden
kann, dann kann man in der ISR ein Flag setzen (und vielleicht auch den
Timer ausschalten). Mit dem Flag wird der Beginn eines neuen Datensatz
angezeigt. Wenn das Flag gesetzt ist, bedeutet das für die ISR, dass
als nächstes die Datenmenge ankommt. Diese wird dann in einen Zähler
geschrieben, und sobald der heruntergezählt wurde, wird der Timer
wieder aktiviert.

(Das war jetzt so aus dem Ärmel geschüttelt und aus der Hüfte
geschossen...)

von Jörn G. aus H. (Gast)


Lesenswert?

Wie Max schon vorschlug, den Interrupt (Timer) sperren, wenn Daten
eintreffen - z.B. indem du es einfach den global sperrst mit cli()

Natürlich muß der Timer, dann im Zweifelsfall etwas warten.

Wenn das nicht erlaubt ist und du die eintreffenden Daten auch nicht
kurz stoppen kannst (z.B. mit Handshake) (du sprichts von STream), dann
bleiben nur relativ kompliziert zu programmierende STrukturen mit
immerwährendem hin-und-her-springen. Also wenn ein Zeichen im Puffer
ist, holst du es schnell per RX-Interrupt raus - sperrst aber nicht den
Interrupt (damit der Timer nicht warten muß) und sperrst in der
Timer-IRQ-Funktion wiederum auch nicht den RX-Interrupt!
Diese Daten mußt du dann in eine Fifo Struktur im RAM zwischenspeichern
und erst dann verarbeiten (Berechnung), wenn der Timer es zuläßt - du
also gerade ausreichend Zeit hast.

Ohne gründlichen Nachdenken deinerseits und am besten auch analysieren
z.B. der Zeitdauer deiner Berechnung geht das nicht. Ist nicht ganz
trivial.

jörn

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.