Hallo Leute,
ich habe eine Verbindung zwischen einem Microcontroller und einem PC
über die RS232-Schnittstelle aufgebaut.
Nun möchte ich Daten zwischen den beiden Systemen austauschen.
Ich stelle mir jetzt die Frage, was die sinnvollste und einfachste Art
der Kommunikation ist. D. h. in welcher Form sollen die Daten gesendet
werden bzw. in welchen Format?
Natürlich ist das einem selbst überlassen wie man so was implementiert,
aber ich möchte hier ein paar Anregungen einsammeln.
Danke schon mal im voraus!
...spielt das eine Rolle welche Daten es sind???
es sind eigentlich Daten vom Typ "int" und "char".
Ich sende die Daten vom Controller mit dem Befehl "printf(" %ld ",x)"
zum PC. Dort sollen die Daten von einem Java Programm ausgewertet
werden. ...andersrum mit "String" -> mehr oder weniger.
Oel wrote:
> ...spielt das eine Rolle welche Daten es sind???
Ja.
Sind es im weitesten Sinne Binärdaten oder Texte.
(Ja, ja ich weiss: Auch Texte sind letztendlich
Binärdaten. Ihr wisst schon was ich meine)
> Ich sende die Daten vom Controller mit dem Befehl "printf(" %ld ",x)"> zum PC.
Na also.
Du schickst also Texte hin und her.
Gut.
Was hast du jetzt für ein Problem damit?
Denk dir ein Protokoll aus, das dir ermöglicht eine fehlerhafte
Übertragung zu erkennen bzw. den Sender in regelmässigen Abständen
wieder mit dem Sender zu synchronisieren und gut ists. Es gibt
da kein richtig oder falsch. Wenn es funktioniert, dann ist es
per Definition richtig.
>Denk dir ein Protokoll aus, das dir ermöglicht eine fehlerhafte>Übertragung zu erkennen
...ok, das wollte ich quasi nochmal als Bestätigung hören.
>Sind es im weitesten Sinne Binärdaten oder Texte?
..wie würde es denn beispielsweise aussehen wenn ich Binärdaten
versende? Hier meine ich jetzt die Implementierung. Anstelle von
"printf()" für Text, "..?.." für Binärdaten. -> Wahrscheinlich kann man
das nicht so einfach beantworten aber mir würde auch schon ein kleiner
Ansatz reichen, - interessehalber.
...und dann noch eine kurze Frage im Zusammenhang mit der Kommunikation
zwischen zwei Systemen:
Angenommen ich würde ein Roboter bauen, der mithilfe eines Programmes
auf dem PC gesteuert wird. Wie würde man das sinnvoll programmieren, um
den Roboter bspw. nach links oder rechts fahren zu lassen.
Würde man eher sagen:
Fahre_nach = "links"
oder
Fahre_nach = 1 --> wobei in einer Tabelle festgehalten wird (auf
dem Roboter) was die "1" bedeutet. Somit würde man doch die
Übertragungskapazität auf der Verbindung zwischen PC und Microcontroller
eindämmen?!
--> was ist hier die normale Anwendungsweise bzw. Praxis?
Danke
> ..wie würde es denn beispielsweise aussehen wenn ich Binärdaten> versende?
Kommt drauf an ;-)
Du kannst sie einfach als Bytes interpretieren und so wie sie sind
rumschieben (ein char ist ja auch nur ein Byte). Das ist codemäßig die
sparsamste Variante, funktioniert aber nur, wenn die Datentypen (Byte
Order, Größe, Vorzeichendarstellung, ...) auf beiden Systemen genau
gleich aussehen. Alternativ legt man ein einheitliches Format fest, in
das beide Seiten die Daten immer konvertieren.
Binär ist meistens sparsamer, was die übertragene Datenmenge und die zur
Konvertierung nötige Rechenzeit angeht, dafür ist Text weniger
problematisch, und die übertragenen Daten können in einem ganz normalen
Terminal/Texteditor gelesen werden.
> Hier meine ich jetzt die Implementierung. Anstelle von "printf()" für> Text, "..?.." für Binärdaten.
Das, was printf selbst intern benutzt, um an die serielle Schnittstelle
zu senden.
> Würde man eher sagen:>> Fahre_nach = "links">> oder>> Fahre_nach = 1 --> wobei in einer Tabelle festgehalten wird (auf> dem Roboter) was die "1" bedeutet.
Beides gibt es. Die erste Variante ist etwas komfortabler, wenn du die
Kommandos von Hand im Terminal eingeben mußt, weil du dir dann nicht
merken mußt, welche Nummer welcher Richtung entspricht. Die zweite ist
vom Code her kürzer und braucht weniger Transfervolumen.
> Würde man eher sagen:>> Fahre_nach = "links">> oder>> Fahre_nach = 1 --> wobei in einer Tabelle festgehalten wird> (auf dem Roboter) was die "1" bedeutet. Somit würde man doch die> Übertragungskapazität auf der Verbindung zwischen PC und> Microcontroller eindämmen?!>> --> was ist hier die normale Anwendungsweise bzw. Praxis?
Das kommt drauf an, wieviele Kommandos im Schnitt da so drüber
laufen und wie schnell die Reaktion des Gerätes sein muss.
Wenn das alles moderat ist, dann würde es sich anbieten
einfach Texte zu schicken
GERADE 10
LINKS 90
GERADE 10
LINKS 45
GERADE 7.07106
LINKS 90
GERADE 7.07106
LINKS 45
GERADE 10
LINKS 135
GERADE 14.14213
LINKS 135
GERADE 10
LINKS 135
GERADE 14.14213
Das wäre zb eine Sequenz, die das 'Haus des Nikolaus' (ich glaube so
heist das) zeichnet.
* Jedes Kommando ist auf einer eigenen Zeile. d.h. der Empfänger
kann am Zeilenende erkennen, dass jetzt das Kommando vollständig
ist und abgearbeitet werden muss
* Jedes Kommando besteht aus einem Schlüsselwort und notwendigen
Argumenten
Durch die wahl von vernünftigen Schlüsselwörtern kann man die sich
leicht merken. Dadurch dass die Kommunikation auf Textebene läuft,
braucht man zunächst kein sendendes Programm, was die Entwicklung
etwas vereinfacht (nur 1 Baustelle): Ich kann jedes beliebige
Terminalprogramm hernehmen und händisch die Kommandos eintippen
und nachsehen ob der Empfänger auch das tut was er tun soll.
Erst wenn der Empfänger korrekt funktioniert, kümmere ich mich
um das sendende Programm, welches dann die Aufgabe hat, die
entsprechenden Texte zu generieren.
Ist mir obiges zu langatmig, bzw. bekomme ich Zeitprobleme in
der Übertragung, dann kann ich immer noch die Kommandos abspecken:
G 10
L 90
G 10
L 45
G 7.07106
L 90
G 7.07106
L 45
G 10
L 135
G 14.14213
L 135
G 10
L 135
G 14.14213
macht genau das selbe, nur sind die Kommandos jetzt nur 1 Buchstaben
lang. Das vereinfacht auch ein wenig das Auseinanderpfriemeln der
Kommandos auf der Empfängerseite.
Reicht das immer noch nicht, dann wird es Zeit auf eine binäre
Übertragung umzuschwenken: Zahlen werden nicht mehr in Textform
auf die Reise geschickt sondern byteweise, so wie sie im Speicher
vorliegen übertragen. Allerdings: Dadurch verliert man die
einfache Debug-Möglichkeit, die eine rein textbasierte Kommunikation
ermöglicht: Für den PC gibt es Programme, die den seriellen
Port überwachen und alles was da so rein und raus geht
mitprotokollieren.
Das ist super wenn man dem Programm auf die Finger schauen will,
welche Anweisungen denn der Sender dem Empfänger gibt.