www.mikrocontroller.net

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


Autor: moksa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für Daten?

Autor: Oel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast123 (Gast)
Datum:

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

Autor: Gast123 (Gast)
Datum:

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

Autor: SiO2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Daten einfach so senden, wie du sie brauchst ;)

Autor: moksa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Feadi F. (feadi)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.