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
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.
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
>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.
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 :-)
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.
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
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
>Hier ein Bild des Protkoll:
Ja, sehr schön. Den steckst du dir jetzt hinten rein.
Mehr kannst du doch sowieso nicht.
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
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?
>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:(
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.