Forum: PC-Programmierung Übertragung von Daten zwischen zwei Systemen.


von moksa (Gast)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

Was für Daten?

von Oel (Gast)


Lesenswert?

...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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Gast123 (Gast)


Lesenswert?

Die sinnvollste Art der Kommunikation zwischen zwei PCs ist wohl 
Netzwerk. Und so schwer ist das auch nicht, gibts tausende Tutorials im 
Internet.

von Gast123 (Gast)


Lesenswert?

Oh, habe die Frage falsch gelesen. Zwischen einem uC und einem PC machts 
natürlich keinen Sinn :)

von SiO2 (Gast)


Lesenswert?

Die Daten einfach so senden, wie du sie brauchst ;)

von moksa (Gast)


Lesenswert?

>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

von Rolf Magnus (Gast)


Lesenswert?

> ..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.

von Karl H. (kbuchegg)


Lesenswert?

> 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.

von Feadi F. (feadi)


Lesenswert?

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
Noch kein Account? Hier anmelden.