Hallo zusammen.
Heute stelle ich eine recht praktische von mir geschriebene Komponente vor, die einem größerem Projekt entstammt (Dass auch noch bald vorgestellt wird ^^).
Anforderungen an den PC:
.NetFramework 4.0
Serielle Schnittstelle
Die Komponente erleichtert die Kommunikation zwischen PC und Roboter über die Serielle Schnittstelle erheblich (Im Moment ist jedoch nur die PC Seite implementiert).
Die Idee ist, dass sich Roboter und PC gegenseitig Datenpakete schicken, die man zumindest auf PC Seite wesentlich leichter verabeiten kann.
Ein solches Datenpaket ist so aufgebaut:
Startcondition | RobotID-Highbyte | RobotID-Lowbyte | ModuleID Highbyte | ModuleID-Lowbyte | ComponentID-Highbyte | ComponentID-Lowbyte | Length | Data | Checksum | Stopcondition
Das Vorhanden sein von einer RoboterID eine ModulID und eine KomponentenID erschließt aus dem größeren Projekt, dem die Software entnommen wurde.
Man kann aber genauso gut z.B. nur die RobotID nutzen um das Ziel oder den mit dem Paket kodierten Befehl zu indentifizieren.
Als Startkondition wird der byte wert des Zeichens: # genutzt
Als Stopkondition wird der byte werd des Zeichens: ~ genutzt
Die Verwendung der Komponente ist recht simpel gehalten und wird (im leider noch unkommentierten Beispiel) auch rudimentär gezeigt.
Verwendung
Zunächst müssen die Codedateien "CAnalyseDatastream.cs" "CDataPacket.cs" und "CSerialCommunication.s" dem Projekt hinzugefügt werden.
Dann muss der Namespace "Communication" am Anfang der eigenen Codedatei unter "using" hinzugefügt werden.
Beispiel:
Dann empfiehlt es sich eine globale Variable vom Typ CSerialCommunication anzulegenCode:using System.Linq; using System.Text; using System.Windows.Forms; using Communication;
Beispiel: (Aus einen WindowsForms entnommen)
Dann muss die Komponente initialisiert werden:Code://Hier stehen die Usings und der namespace public partial class Form1 : Form { public Form1() { InitializeComponent(); } //Die globale Variable CSerialCommunication comm; //Hier steht der restliche Code
Das senden wird durch <Instanz von CserialCommunication>.SendDataPackage(paket) gemacht.Code://Initialisierung -- kann z.B. im LoadEvent des Forms aufgerufen werden private void Init() { //Neue Instanz anlegen comm = new CSerialCommunication(); //Initialisieren - Comport, Baudrate,Databits, Parität,Stopbits comm.Init("COM1", 9600, 8, System.IO.Ports.Parity.None, System.IO.Ports.StopBits.One); //Event abonnieren, dass ausgelöst wird wenn ein neues Datenpaket erkannt wurde comm.NewPaketAvailable += new Action<CDataPacket>(comm_NewPaketAvailable); } //Diese Methode wird ausgelöst wenn ein neues Datenpaket erkannt wurde void comm_NewPaketAvailable(CDataPacket obj) { //obj enthält das Datenpaket -- Zugriff auf Daten durch obj.<Eigenschaft> //Kann z.B. verarbeitet werden }
Bespiel:
Auf Roboterseite habe ich leider noch keine Implementierung zum Senden und Empfangen von Datenpaket gemacht.Code:private void Send() { //Neues Datenpaket anlegen CDataPacket paket = new CDataPacket(); paket.RobotID = 1; paket.ModuleID = 0; paket.ComponentID = 0; paket.Length = 1; paket.Data = new byte[] { 10 }; //Comm ist unsere Instanz von CSerialcommunication - comm.SendDataPackage sendet das zuvor erstellte Datenpaket comm.SendDataPackage(paket); }
Lesezeichen