Forum: Mikrocontroller und Digitale Elektronik [C#] Verständnishilfe bei Serieller Kommunikation


von Patrick K. (pat_k)


Lesenswert?

Hallo,
ich habe vor über eine RS232-Schnittstelle Daten von einem Roboter zu 
empfangen und Daten zu diesen Roboter von dem PC zu senden. Ich habe 
mich noch nie an serieller Kommunikation versucht und mich deswegen in 
die entsprechenden Klassen eingelesen, dennoch habe ich schwierigkeiten, 
die Benutzung des mir vorliegenden Protokolls zu verstehen: (Beispiel)
P0 -> Drucksensor auslesen
Ich interpretiere die Zeile so, dass ich beim Über senden des in bytes 
umgewandelten Strings "P0" eine Zahl zurückkriege.
Oder wie ist solch ein Protokoll zu verstehen (ist P0 ein Port)?
Grüße Pat_k

von Easylife (Gast)


Lesenswert?

Patrick K. schrieb:
> dennoch habe ich schwierigkeiten,
> die Benutzung des mir vorliegenden Protokolls zu verstehen: (Beispiel)
> P0 -> Drucksensor auslesen

Ich habe auch irgendwie Schwierigkeiten, aber im Gegensatz zu dir, liegt 
mir nichtmal das Protokoll vor.

von nicht"Gast" (Gast)


Lesenswert?

wow,

das sind aber viele Wörter für so wenig Informationen.

Um mal die Glaskugel zu fragen... Jap kannst du so machen.


grüße

von holger (Gast)


Lesenswert?

>Oder wie ist solch ein Protokoll zu verstehen (ist P0 ein Port)?

Woher soll das jemand wissen?
Du schaffst es ja nicht mal zu sagen welcher Roboter das ist.

von Conny G. (conny_g)


Lesenswert?

Patrick K. schrieb:
> Hallo,
> ich habe vor über eine RS232-Schnittstelle Daten von einem Roboter zu
> empfangen und Daten zu diesen Roboter von dem PC zu senden. Ich habe
> mich noch nie an serieller Kommunikation versucht und mich deswegen in
> die entsprechenden Klassen eingelesen, dennoch habe ich schwierigkeiten,
> die Benutzung des mir vorliegenden Protokolls zu verstehen: (Beispiel)
> P0 -> Drucksensor auslesen
> Ich interpretiere die Zeile so, dass ich beim Über senden des in bytes
> umgewandelten Strings "P0" eine Zahl zurückkriege.
> Oder wie ist solch ein Protokoll zu verstehen (ist P0 ein Port)?
> Grüße Pat_k

Die Kollegen vorher haben recht: es wäre gut die Doku oder wenigstens 
einen Ausschnitt zu sehen um genau zu wissen, was Du meinst.

Man kann es allerdings erahnen.

Also eine RS232-Schnittstelle kann so eine Art Terminal-Interface zu 
einem Gerät sein, man schickt manuell per Tastatur oder durch einen 
Mikroprozessor oder einen PC ein Kommando hin und bekommt einen Wert 
oder eine OK/FEHLER-Meldung zurück.

Das P0 liest sich danach als wäre es eine Art internes Register des 
Roboters - der hat einen Mikroprozessor oder ein Linux-Board drin und 
kann verschiedene Dinge, Druck messen, Temperatur messen, was weiss ich.
Und stellt Dir diese Wert über "Registerbezeichnungen" zur Verfügung.

Und bestimmt kannst Du kann auch bestimmte Befehle übermitteln wie 
Greifarm öffnen, was weiss ich.

Das ist aber jetzt alle spekuliert ohne diese Doku :-)

von Patrick K. (pat_k)


Lesenswert?

Ok, ich dachte es gibt eine Art Konvention für Protokolle in diesen 
Bereich, da mir keine weitere Information, wie dieses Protokoll zu 
verstehen ist, gegeben wurde. Bei der Steuereinheit des Roboters handelt 
es sich um einen ATmega8.  Der Roboter hat verschiedene Sensoren und ich 
soll diese Sensordaten am PC mithilfe einer .NET-Anwendung auswerten.

von Lenny D. (le-do)


Lesenswert?

Du versuchst gerade zwei Dinge auf einmal zu lernen, einerseits die 
serielle Kommunikation mit C# und andererseits wie so eine Übertragung 
überhaupt grundsätzlich funktioniert. Wenn du letzteres einigermaßen 
verstanden hast wird der C# Teil leicht.

Im einfachsten Sinne kannst du über RS232 Daten byteweise hin- und 
herschicken. Der Schnittstelle ist dabei egal was für Daten das sind, 
theoretisch sind binäre Daten möglich (1en und 0en) und sehr beliebt (da 
einfach auch von Menschen zu lesen) ASCII-Zeichen, also eigentlich auch 
Binärcodes, die aber als einzelne Buchstaben verstanden werden können.

Jetzt ist es die Aufgabe eines gemeinsam definierten Protokolls 
klarzustellen, was welche Binär- oder ASCII-Codes zu bedeuten haben und 
wie der Empfänger darauf zu reagieren und antworten hat. Für weitere 
Hilfe solltest du uns also sagen welcher Roboter oder gleich welches 
Protokoll du meinst.

Von dem kleinen bisschen das du uns gegeben hast kann ich nur so viel 
vermuten: wenn du deinem Roboter per serieller Schnittstelle die beiden 
Zeichen 'P' und dann '0' schickst schickt er auf der Empfangsleitung 
einen Wert zurück, der irgend etwas mit dem Drucksensor zu tun hat. 
Woher kommt den diese Definition?
PS: Diese beiden Zeichen kannst du übrigens auch manuell ohne C#, zB 
über Hyperterm oder putty an die serielle Schnittstelle senden. Einfach 
per Tastatur eingeben dann solltest du bei Erfolg auch schon irgendwas 
vom Roboter zurückkriegen.

Edit: Warst wohl schneller als ich mit dem Antworten :) Dir wurde P0 
also gegeben, welche weiteren Befehle noch? Diese Art von Protokoll ist 
willkürlich gewählt muss bei anderen Geräten keinesfalls gleich sein. P0 
hätte ich als "pressure sensor 0" spekuliert, also der erste 
Drucksensor, aber d.h. nicht dass andere Dinge nach ähnlichem Konzept 
benannt sein müssen.

: Bearbeitet durch User
von Patrick K. (pat_k)


Lesenswert?

Vielen danknfür eure Antworten Conny und Lenny!
Ja, der Temperatur Sensor bspw. ist nach dem selben schema benannt (t0). 
Also wenn es ein Register ist, welches sowieso nur eine Funktion hat, 
dann muss ich nicht mal richtig eine Befehl/Parameter mitgeben, wenn ich 
diesen Register anspreche. Oder kann ich nur den Mikroprozessor 
ansprechen, der dann aufgrund des mitgelieferten Paramaters "P0" die 
Anfrage an einer seiner Register weiterleitet?
Hier ein Bild des Protkoll:
]

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

>Hier ein Bild des Protkoll:

Ja, sehr schön. Den steckst du dir jetzt hinten rein.
Mehr kannst du doch sowieso nicht.

von Patrick K. (pat_k)


Lesenswert?

Sorry, das ist mein völliger Ernst: anscheinend kam da irgend ein 
zufälliges Bild von imgur, ich war total geschockt als ich grad gesehen 
habe und hab natürlich den Link entfernt, bin grad vom Smartphone aus 
on, keine Ahnung wie so etwas passieren konnte, das Bild ist nicht von 
mir gewesen.
Neuer Versuch:
http://i.imgur.com/RWy92J2.jpg
Ich kann auch ein Bild hochladen, wie der Link, der zu diesen Komischen 
Bild führte, mir auch angezeigt wurde, als ich das richtige 
Protokollbild hochgeladen habe. Habe es aber noch mal hochgeladen und 
anscheinend gibts da keine Probleme.

: Bearbeitet durch User
von Lenny D. (le-do)


Lesenswert?

Patrick K. schrieb:
> Also wenn es ein Register ist, welches sowieso nur eine Funktion hat,
> dann muss ich nicht mal richtig eine Befehl/Parameter mitgeben, wenn ich
> diesen Register anspreche. Oder kann ich nur den Mikroprozessor
> ansprechen, der dann aufgrund des mitgelieferten Paramaters "P0" die
> Anfrage an einer seiner Register weiterleitet?

Ja der Mikrocontroller "leitet das weiter". Ein direkter Zugriff auf 
Register per RS232 ist nicht möglich, es muss immer irgend ein Programm 
geben dass die ankommenden Daten interpretiert. Und wirklich 
"weitergeben" tut dies das auch nicht, eher interpretieren und eine 
genau definierte Handlung machen. Für die meisten Befehle wird es gar 
keine direkten Register geben, die Motorenbefehle etc. führen 
möglicherweise komplexe Dinge aus wenn sie angesprochen werden.

Du hast zwar Recht, du musst zu "P0" keine weiteren "Befehle/Parameter" 
geben, aber der Befehl selbst ist ja schon "P0". Er hätte genaus auch 
"Pressure" oder "Peter" heißen können, da der Controller sowieso 
entscheiden muss was er dann macht. Der Befehl "A1" beispielsweise 
erwartet als Parameter noch eine Hex-Zahl, wenn ich das richtig 
verstehe. Hier muss das Hauptprogramm so geschrieben sein, nach einem 
"A1" noch auf weitere Zeichen zu warten im Gegensatz zu "P0" oder evtl. 
auch "T0", automatisch erahnen/ verstehen kann das kein Controller.

Besonders ausführlich ist dies Befehlsliste leider nicht, aber mit einem 
Terminalprogramm solltest du da schon ganz gut was mit anfangen können. 
Hast du das Ding zur Verfügung oder musst du in C# "trockenschwimmen" 
und das Programm erst zum Test echt anstöpseln?

von holger (Gast)


Lesenswert?

>Sorry, das ist mein völliger Ernst: anscheinend kam da irgend ein
>zufälliges Bild von imgur, ich war total geschockt als ich grad gesehen
>habe und hab natürlich den Link entfernt

Du kannst Bilder auch direkt hier anhängen.
Dateianhang->Durchsuchen usw.

Dann passieren solche Missverständnisse nicht
und niemand muss auf irgenwelche blödsinnigen
Webseiten klicken.

Entschuldigung von meiner Seite aus für meinen dummen Kommentar:(

von Patrick K. (pat_k)


Lesenswert?

Also diese Informationen hat mir der Robotik-Entwickler gegeben, damit 
ich eben einen Einblick in das Thema bekomme, bzw. weiss wie ungefähr 
diese serielle Kommunikation funktioniert. Wenn ich dann denke, dass ich 
die Konzepte verstanden habe, würde ich bei dem Projekt "miteinsteigen", 
als Programmierer für die Windows-Steuerung des Roboters.
Mit C# und der Technologie die ich neben DirectX einsetzen würde habe 
ich schon "viel Erfahrung", auch habe ich schon bspw. Mit Wireshark 
Pakete nachgebaut etc..  doch von solch einer Peripherie-Programmierung 
habe ich leider wenig Ahnung, das soll jetzt folgen -_-.

: Bearbeitet durch User
von Lenny D. (le-do)


Lesenswert?

Joa das denke ich würdest du schon hinkriegen. Soll das Windows Programm 
eher zur Kontrolle und Überwachung von Funktionen auf hoher Ebene dienen 
oder auch detaillierte (evtl. zeitkritische?) Abläufe selbst steuern?
(also Windows schickt "Gehe zu X,Y" vs.
Windows fragt "Motoren an?", ggfs. "Motoren AN" senden, dann "X Achse 
##millisekunden AN" und dann "Y Achse ##ms AN" usw.?)
Je weniger Programmlogik im Windows steckt desto einfacher natürlich für 
dich aber auch desto robuster und unabhängiger der Roboter.

Also die serielle Schnittstelle anzusprechen wird der einfache Teil sein 
(Im Designer Baudrate etc. festlegen, im Progmm wirst du dann fast nur 
noch .Open()/Close(), .Write() und .Read() verwenden).
Wirklich wichtig ist nur dass du den logischen Überblick behälst was 
wie/wann passiert! Kritisch ist das dann wenn zB nicht die erwartete 
Anzahl Pakete geschickt/ empfangen wurde. Die .Read() Funktion 
beispielsweise wartet dann bis zum nächsten Byte oder bis zum 
eingestellten Timeout, was du natürlich abfangen musst und evtl. nochmal 
senden etc.
Selbiges gilt in anderer Richtung, wenn du dem Controller ein "A1" 
sendest aber der Motorparameter nicht durchkommt, dann sendest du fünf 
Minuten später nen "P0" und erwartest was zurück, aber der Controller 
nimmt den Hex-Wert von P (übrigens 0x50) und setzt den Motor auf diese 
Geschwindigkeit. Dagegen kannst du dich im Programm etwas absichern, 
aber auch das Protokoll muss eben solche Fälle in Betracht ziehen und 
auf beiden seiten entsprechende Timeouts defnieren etc.

Aber ein schönes nicht allzu kompliziertes Lernprojekt denke ich, v.a. 
wenn der Rest der GUI dir keine Probleme bereiten wird (an beiden 
Fronten zu kämpfen wäre vielleicht zu viel).

Edit: Die C#-Klassendoku durchzulesen ist zwar auch gut, schau aber auch 
mal allgemein Rs232/UART an zB hier im uC Wiki oder echtes Wiki:
http://de.wikipedia.org/wiki/Universal_Asynchronous_Receiver_Transmitter

: Bearbeitet durch User
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.