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
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.
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...)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.