Übertragung von Daten zwischen zwei Systemen.

Gast #614515
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!
Gast #614643
...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.
#614807
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.
Gast #614951
Die sinnvollste Art der Kommunikation zwischen zwei PCs ist wohl 
Netzwerk. Und so schwer ist das auch nicht, gibts tausende Tutorials im 
Internet.
Gast #615041
>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
Gast #615062
> ..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.
#615150
> 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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.