PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Elegante Lösung für AVR-PC Kommunikation (RS232)



Björn
16.07.2008, 16:55
Hallo!

Ich möchte für meinen zweiten Tauchroboter folgendes umsetzen:

Der µC (ATMega8) und der PC sind über einen Max232 verbunden. Der µC sendet permanent Messwerte (Tiefe, Temperatur, Kompasskurs, Lecksensor) an den PC. Andersherum sendet der PC Steuerbefehle an den µC, der entsprechend die Relais der Motoren (3 Stück) schaltet.

Nun ist das Senden von Daten über Print und das Empfangen mit Input kein großes Problem. Jedoch weiß ich grad nicht welcher Weg der beste ist um die Daten "zu verpacken", also z.B. alle in einen String zusammensetzen und dann wieder zerlegen o.ä.

Deshalb wollte ich mal fragen, welcher Weg so die "eleganteste" Lösung für diesen Zweck ist.

Grüße, Björn

Felix G
16.07.2008, 20:03
Das kommt ganz darauf an wie deine Anforderungen aussehen...

Eine Möglichkeit ist das versenden der Informationen im Klartext, was die Auswertung etwas verkompliziert, jedoch den Vorteil hat, daß man mit einem simplen Terminalprogramm direkt nachvollziehen kann was da gerade übertragen wird.


Schneller, weil platzsparender, erfolgt die Übertragung wenn du die Werte einfach direkt Byteweise verschickst, wobei du an den Anfang irgendeinen Startcode setzen solltest, damit der Empfänger die Werte auch richtig zuordnen kann (wenn er weiß wo ein Paket beginnt und wie es aufgebaut ist, kann er es auch zuverlässig wieder auspacken).


Etwas besser, weil sicherer, wird das ganze wenn du noch eine Prüfsumme ans Ende des Pakets hängst (z.B. CRC), wodurch der Empfänger in der Lage ist die Pakete auf ihre Gültigkeit hin zu überprüfen (nur wenn die von ihm berechnete mit der empfangenen Checksumme übereinstimmt, ist das Paket wirklich vollständig und korrekt übertragen worden)

chr-mt
16.07.2008, 21:38
Hi,
ich kann Felix G nur zustimmen.
Klartext ist eine sehr schöne Sache zum debuggen, da man die kommunikation einfach mit einem Terminalprogramm mitlesen kann.
Wenn es nicht so auf Geschwindigkeit ankommt,
kann man das problemlos so machen.
Weiterer Vorteil ist, daß man sich ein Startzeichen aussuchen kann, das nicht im Text vorkommt (zB. das "!").
Man kann natürlich auch ein Steuerzeichen zum Starten verwenden, dann sind alle Textzzeichen verfügbar.
Das auseinanderbauen des Strings im Empfänger mittels "Mid" ist auch kein Problem.

Ganz einfach ist es, wenn du eine feste Länge deines Datenstrings hast.

Also zB.:"!Temp:F5" , wobei hier das "!" als Startzeichen, die folgenden 5 Bytes als Text und die Bytes 6 und 7 einen Hexadezimalen Bytewert darstellen.

Wem der allerdings verschieden lang sein sollte,
kannst du eine Längenangabe mitschicken.

Eine andere Methode wäre, ein festes Endzeichen festzulegen.
Dann wird einfach bis zum Empfang diese Zeichens eingelesen.

Eine Checksumme würde ich auch auf jeden Fall vorsehen.

Die Text-Methode wird übrigens durchaus auch im Profibereich verwendet, ist also gar nicht so "Hobbymäßig", wie es vielleicht erst mal aussehen mag.
Ich habe schon einige Geräte nahmhafter Hersteller gesehen, bei denen ganau so übertragen wird.

Ein weiterer Vorteil der Textmethode ist, daß man Daten so in vielen Fällen einfach per Funk senden kann , ohne zB. Machester Codierung zu verwenden ,da in den Textzeichen keine Zeichen vorkommen, die hauptsächlich aus Nullen oder Einsen bestehen.

Ich hab' mal eine Modell-Funkfernsteuerung nach dem Prinzip gebaut.
Funktionierte einwandfrei.

Wenn du natürlich sehr viele Daten in kurzer Zeit senden willst, dann sind andere Methoden besser geeignet.

Gruß
Christopher

Björn
16.07.2008, 23:17
Hallo!

Den ersten Gedanken den ich hatte als ich vor dem Problem stand war dieser:



...

Dim X As String * 1

Do
Input "" , X
If X = "!" Then
Input "" , Wert1
Input "" , Wert2
Input "" , Wert3
....
End If
Loop

Also dass der µC im Prinzip weiß, sobald ein "!" geht es los. Dann kommen die Werte. Die Reihenfolge steht ja vorher schon fest.
Allerdings scheint mir das zu fehlerbehaftet. Wenn ein Wert verloren geht verschieben sich alle (zumindest in dem "Durchlauf").

Vom µC zum PC hätte ich das ganze so gemacht, dass ich die Werte in einem String mit Kommas getrennt geschickt hätte (z.B. "23,345,0") und dann im PC Programm den String an den Kommas zerlegt hätte. Andersherum klappt das ja leider nicht, weil Bascom soweit ich weiß nicht mit "Trennzeichen" arbeiten kann.

Werde morgen weitermachen... jetzt ist es zu spät für solche Überlegungen ;)

Grüße, Björn

Felix G
17.07.2008, 00:06
Wenn ein Wert verloren geht verschieben sich alle (zumindest in dem "Durchlauf").Deshalb die Checksumme...


Wie wärs denn so:

!Wert1Wert2Wert3#CRC

! markiert also den Anfang eines Pakets, und # z.B. das Ende der Daten bzw. den Anfang der Checksumme. Der Empfänger berechnet dann aus den Daten (also allem was zwischen ! und # steht) erstmal selbst eine Checksumme und vergleicht sie mit der die er empfangen hat. Sind beide unterschiedlich muss das Paket eben verworfen werden, denn dann ist bei der Übertragung irgendwas schief gelaufen.

Für CRC gibt es auch für Bascom sicherlich schon fertige Routinen, aber selbst falls nicht lässt sich der Algorithmus relativ leicht programmieren.


Du kannst die Werte natürlich auch mit Kommas oder sonst irgendwelchen Zeichen getrennt abschicken, oder du schickst alle einzeln mit unterschiedlichen Startcodes (vielleicht ganz einfach mit !1, !2, !3 oder sonstwie, Hauptsache man kann sie voneinander unterscheiden)



kurz gesagt:
es gibt beliebig viele Möglichkeiten um Daten per RS232 zu verschicken, also nimm die die dir am besten gefällt. Wenn es sicher sein muss, bau entsprechende Überprüfungen ein, oder nutze Redundanz (du könntest z.B. auch jeden Wert einfach doppelt innerhalb eines Pakets übertragen, wenn beide gleich sind ist vermutlich alles ok).


Wie Christopher bereits erwähnt hat muss eine Klartext-Übertragung keineswegs "unprofessionell" sein, es kommt halt immer darauf an welche Anforderungen man hat. HTTP z.B. ist ein hervorragendes Beispiel, denn bei diesem uns allen bekannten Protokoll werden die Daten tatsächlich alle im Klartext übertragen, also was in einer HTML-Datei steht, schickt der Webserver direkt so wie es ist an deinen Browser. Genau das gleiche ist bei SMTP der Fall, man kann Mails völlig ohne Mailprogramm verschicken, denn die Kommunikation mit einem SMTP-Server ist geradezu primitiv einfach.