unidirektionales RS232 Problem

Gast #929305
Habe folgendes Problem:

Ich habe ein kleines Protokoll geschrieben was es ermöglicht Daten in 
einem festen Rahmen von meinem Pic zum Pc zu senden. Die Übertragung 
erfolgt dabei unidirek. per Funk.

Auf dem Pc habe ich nun eine Anwendung geschrieben die mir die Daten je 
nach Byte, Integer, Float darstellen kann ohne das ich mir über das 
Hyperterminal alles einzeln herausrechnen muss.

Das ganze klappt auch wunderbar solange ich die Daten in eine Schleife 
packe die die Daten jeweils nach Abfrage des TX-Flags sendet. Sobald ich 
das ganze aber nur zu bestimmten Zeitpunkten schicke per Timer-Interrupt 
bekomme ich nur   Datenmüll und ab und zu dazwischen verwertbare Daten. 
Leider kann ich die Daten aber nur azyklisch senden, da die Hauptaufgabe 
des uC in der Werteerfassung und Regelung liegt die mit 200Hz arbeiten.

Was kann ich machen um einen kontunuierlichen Stream zu bekommen? Die 
Daten sollen mit 1200-4800 baud je nach Entfernung übertragen werden. 
Der Einfachheit halber aber zuerst einmal fest mit 2400baud.
Die Messung erfolgt im Hauptprogramm und wird bis der Timerinterrupt(zur 
Regelung) eintrifft gemittelt. Die Regelung erfolgt dann im 200Hz Takt, 
und in diesem dann auch die UART Ausgabe.
Leider brauche ich aber bald noch einen Interrupt zum Input Capture der 
Fernsteuerungs PPM und dann wird es wohl noch schwieriger. Aber mit dem 
jetzigen TimerInt allein müsste es doch eine Möglichkeit geben?

Wenn ich das Senden in die main() packe funktioniert es schon besser 
aber dann trifft ja auch alle 5ms der (Stör)Interrupt ein.. es scheint 
als müssten die Daten kontinuierlich gesendet werden, d.h. Byte an Byte
Gast
200Hz = 5ms
2400 = (1/2400) * 10 Bit = 4,x ms

Wartest du denn auch ab, ob das Senden abgeschlossen wurde oder pustest 
du einfach das nächste Byte raus?

Ralf
Ja, nach jedem Sendebefehl folgt ein while(!TXINT)

Polle ich zyklisch, also eine Schleife die nur sendet funktioniert das 
ganze ja. Nur wenn ich zu bestimmten Zeitpunkten senden will geht es 
nicht.... z.B. 200Hz statt 240Hz(bei 2400baud und je 10Bit)

@tastendrücker
ich überprüfe -nach- jedem Byte und nicht vorher, aber sollte ja kein 
unterschied machen oder? Da das letzte ja erstma übertragen sein muss 
bevor es weiter geht..
Gast
> ich überprüfe -nach- jedem Byte und nicht vorher, aber sollte ja kein
> unterschied machen oder? Da das letzte ja erstma übertragen sein muss
> bevor es weiter geht..
Kosten dich aber mehr Zeit, denn während das Wartens kannst du nichts 
anderes machen. Wenn du es vorher prüfst ist es wahrscheinlicher das es 
schon gesendet ist weil ja mehr zeit seit dem letzen Senden vergangen 
ist.
@Peter
stimmt, so hab ich das noch nicht gesehen

@gast
danke für den Link, aber durch mein sync byte was immer zu anfang 
mitgeschickt wird würde das ja diese Präambel ergeben. wusste auch 
garnicht das dies im manchester code erfolgen sollte, zum glück geht es 
auch ohne(oder der sender/empfänger hat dies schon implementiert) bis zu 
150m

Aber wie kann ich ein Datenpaket schicken, wenn dies schon nach dem 
ersten Byte vom TimerInt ausgenockt wird? 200Hz Regler<-> 240Hz TX
Gast
>aber durch mein sync byte was immer zu anfang
>mitgeschickt wird würde das ja diese Präambel ergeben.
Nö, wenn der Empfänger eben genau diesess Sync-Byte nicht richtig 
erkennt.
d.h. nach längerer Pause immer eine Präambel mitsenden (also 0xAA bzw. 
0x55), heißt das jedesmal wenn die Daten nicht kontinuierlich fließen? 
Das würde ja heißen ich müsste dann jedesmal 3Byte umsonst schicken... 
lieber wäre mir eine Möglichkeit die Daten kontinuierlich zu schicken um 
das zu vermeiden und trotzdem den Regler bei 200Hz laufen zu lassen. Die 
Präambel würde ich dann z.B. alle 100Bytes mitsenden, falls der String 
"abreisst"

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 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.