PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C#] Komponente - Datenströme in Pakete zerlegen



shedepe
01.09.2012, 13:54
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:



using System.Linq;
using System.Text;
using System.Windows.Forms;
using Communication;


Dann empfiehlt es sich eine globale Variable vom Typ CSerialCommunication anzulegen

Beispiel: (Aus einen WindowsForms entnommen)



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


Dann muss die Komponente initialisiert werden:



//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
}


Das senden wird durch <Instanz von CserialCommunication>.SendDataPackage(paket) gemacht.

Bespiel:



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);

}


Auf Roboterseite habe ich leider noch keine Implementierung zum Senden und Empfangen von Datenpaket gemacht.