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.
Die sinnvollste Art der Kommunikation zwischen zwei PCs ist wohl Netzwerk. Und so schwer ist das auch nicht, gibts tausende Tutorials im Internet.
Oh, habe die Frage falsch gelesen. Zwischen einem uC und einem PC machts natürlich keinen Sinn :)
Die Daten einfach so senden, wie du sie brauchst ;)
>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.
Vielleicht inspiriert Dich das hier ein bischen: $GPRMC,191410,A,4735.5634,N,00739.3538,E,0.0,0.0,181102,0.4,E,A*19 http://www.kowoma.de/gps/zusatzerklaerungen/NMEA.htm
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.