PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Übertragungprotokoll für RN Atmega 128 Funk



Gerri
13.08.2008, 00:07
Hallo,


ich habe das RN Atmega 128 Funk Modul und will mit der RN Funk Modul eine Verbindung zu einem PC aufbauen. Ich habe an die Atmega 128 Funk Platine an die UART1 Schnittstelle eine GPS-Maus angeschlossen, mit der ich die GPS-Rohdaten mit 19200 Baud empfange und über die Funkverbindung (ebenfalls 19200 Baud) an einen PC verschicken will. Ich programmiere in C und benutze die Bibliothek von Peter Fleury, um die UART-Schnittstelle anzusteuern.
Ich dachte, dass die Daten ganz einfach übermitteltwerden können, indem ich jedes Zeichen, das ich mit Hilfe der Funktion uart1_getc() bekomme einfach in die Funktion uart_putc(char c) stecke. Leider wurden so nicht alle Daten übertragen und es endstanden Lücken im Datenstrom.

1. Erkenntnis: Das Funkmodul Easyradio hat einen internen Zeichenspeicher, der 128 Byte groß ist. Wird dieser Speicher vollgeschrieben, wird der Speicher ausgelesen und die Daten per Funk übertragen. Entsteht während der Übertragung zum Funkmodul eine Pause, die länger ist als die Übertragungszeit zweier Zeichen, so wird ebenfalls der Speicher ausgelesen und die Daten übertragen. Achtung während dieser Zeit gehen alle Daten, die über die UART-Schnittstelle verschickt werden verloren. Deshalb müssen die entsprechenden Leitungen benutzt werden, um Clear To Send(CTS)/Request To Send(RTS) umzusetzen.

Zweiter Versuch. Ich teile meinen Datenstrom in Pakete mit max 128 Bytes auf und warte in einer "sinnlosen" while-Schleife, bis das CTS-Bit gesetzt ist, setze selber das RTS-Bit und rufe dann erst meine uart_putc(..) Funktion auf. Jetzt sind meine Zeichen in den Paketen zwar in der richtigen Reihenfolge, doch fehlen ab und zu Pakete.

2. Erkenntnis: Das EasyRadio Funkmodul soll zwar laut Beschreibung mit einem Hash-Wert die Korrektheit der Daten überprüfen, doch scheint mir, dass wenn ein Paket nicht richtig übertragen wurde, es nicht noch einmal gesendet wird, sondern einfach unter den Tisch fällt. Hierfür wird also eine Bestätigung vom Empfänger benötigt, der quittiert, dass das Pakekt xy auch angekommen ist, bevor ein anderes geschickt wird.

So nachdem ich dies auch noch implementiert habe, bekomme ich jetzt noch den Fehler, dass mein Puffer zur GPS-Maus voll läuft, obwohl ich nur ca 200 Bytes/s übertragen will, ich interpretiere das so, dass ich die Funktion uart_getc() öfter aufrufen müsste. Dies mache ich im Moment aber noch sehr primitiv, indem ich in der main-Funktion eine Endlosschleife durchlaufe, die ein Zeichen liest, das Zeichen einer bestimmten Nachricht zuordnet und die Nachricht dann verschickt. Hauptaufgabe ist also Zeichen auslesen und Zeichen verschicken. Das Funkmodul überträgt mit 19200 Baud = 2400 Bytes/s das sollte doch dicke reichen, oder?

Kann mir jemand helfen? Oder besser hat schon jemand so ein Übertragungsprotokoll selbst geschrieben bzw. weiss wo man so etwas herunterladen kann? Ich kann mir nämlich nicht vorstellen, dass ich der erste bin, der damit Probleme hat.

Vielen Dank schon mal für eure Antworten

Frank
24.11.2008, 14:12
Ich nutze die Bascom RS232 Puffer Funktionen. Eingehend Zeichen werden dadurhc per Interrupt in Puffer geschrieben. Ich sende danach immer Pakte von ca 120 Zeichen die ich aus dem Puffer hole.
Probleme konnte ich dabei noch nicht feststellen.
Zur C-Lib kann ich dir leider nix sagen.