unidirektionales RS232 Problem

Gast #929305
Lesenswert?

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.
#929323
Lesenswert?

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
#929349
Lesenswert?

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 #929358
Lesenswert?

> 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.
#929384
Lesenswert?

@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
#929406
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren