Home > Technologie > Programmierung mit .NET

Programmierung mit .NET

Advertisement

Programmierung mit .NET

Serielle Ports bieten eine einfache Möglichkeit, zwischen vielen Arten von Hardware und Ihren Computer zu kommunizieren. Sie sind relativ einfach zu bedienen und sind sehr häufig unter Peripheriegeräten und vor allem DIY-Projekte. Viele Plattformen wie Arduino haben in serielle Kommunikation gebaut, so dass sie wirklich einfach einzurichten und zu verwenden sind. Oft möchten Sie Ihr Projekt mit Ihrem Computer kommunizieren, um eine kühle interaktive Ausgabe haben, ein ordentlicher Sensor, der Daten an Ihren Computer oder alles, was Sie vielleicht träumen könnte. In diesem Tutorial werde ich Sie durchlaufen, wie man eine Schnittstelle zu einem seriellen Port auf der Computer-Seite der Dinge, mit Microsofts. Netzrahmen. Die Code-Beispiele in diesem Tutorial sind in C #, können aber leicht auf Visual Basic oder Visual C ++ übertragen werden. Dieses Tutorial geht davon aus, dass Sie ein sehr grundlegendes Verständnis der objektorientierten Programmierung haben, und welche Sprache Sie sich für die Programmierung.

Da wir in erster Linie zu gehen , um die System.IO.Ports.SerialPort - Klasse, hier ist ein Link auf die vollständige Dokumentation von MSDN , wenn Sie den Rest der Klasse zu sehen.

Ich fand auch einen großen Artikel erklärt , wie einige allgemeine Fehler zu beheben , um serielle Ports beziehen. Überprüfen Sie es, wenn Sie mit irgendwelchen ungeraden Fehlern stecken.

Fühlen Sie sich frei, Fragen oder Feedback zu stellen! Ich bin immer glücklich, konstruktive Kommentare zu hören, damit ich Verbesserungen machen kann.

Schritt 1: Setup und öffnen Sie den seriellen Port

Programmierung mit .NET

Wir benötigen zwei Namespaces, um die SerialPort-Klasse zu verwenden:

Verwenden von System.IO.Ports;
Mit System.IO;

Wir müssen nun ein SerialPort-Objekt instanziieren. Es gibt mehrere Konstruktoren zur Auswahl von verschiedenen Frame-Formate, aber im Allgemeinen die am einfachsten zu verwenden ist die folgenden:

SerialPort (string portName, int baudRate)

Ein Beispiel hierfür wäre:

SerialPort mySerialPort = neuer SerialPort ( "COM3", 9600);

Hier bin ich mit COM3 bei 9600 Baud. Die vollständige Liste der Konstruktoren finden Sie im Link in der Intro. Nachdem wir unser SerialPort-Objekt erstellt haben, müssen wir den Port mit der Open () -Methode öffnen. Wenn wir fertig sind, wollen wir es mit der Close () Methode schließen:

MySerialPort.Open ();
MySerialPort.Close ();

Einige Hinweise: Wenn Sie eine Operation verwenden, die einen seriellen Anschluss verwendet, besteht eine gute Wahrscheinlichkeit, dass ein Fehler auftritt. Aus diesem Grund wollen wir unseren Code für den seriellen Port innerhalb eines Try - catch - Blocks schreiben. Dies verhindert, dass unser Programm abstürzt, wenn wir zum Beispiel versuchen, einen Port zu öffnen, der nicht existiert. Es ist nicht notwendig, unser Objekt innerhalb des Try - catch - Blocks zu instanziieren, aber wir wollen es öffnen, schließen, lesen und schreiben.

// das schafft einfach ein SerialPort-Objekt, öffnet und schließt dann den Port
SerialPort mySerialPort = neuer SerialPort ( "COM3", 9600);
Versuchen
{
MySerialPort.Open ();
MySerialPort.Close ();
aufrechtzuerhalten.
Catch (IOException ex)
{
Console.WriteLine (ex);
aufrechtzuerhalten.

Das ist wirklich alles gibt es für Port-Setup! Im nächsten Schritt wird beschrieben, wie man von einem seriellen Port aus lesen kann.

Schritt 2: Lesen aus dem Port

Programmierung mit .NET

Nachdem wir nun unser serielles Port-Objekt erstellt und den Port geöffnet haben, wollen wir nun von der seriellen Schnittstelle lesen. Hier sind die grundlegenden Lese-Funktionen: (es gibt mehrere andere, aber diese sind die einfachsten und wird für die meisten Anwendungen zu arbeiten)

Int readChar () - gibt das nächste Zeichen aus dem Eingabepuffer zurück
Int readByte () - gibt das nächste Byte aus dem Eingabepuffer zurück
String readLine () - gibt alles zurück bis zum Zeilenende-Zeichen ( '\ n') im Eingabepuffer
String readExisting () - gibt alles im Eingabepuffer zurück

Es sollte beachtet werden, dass readChar () und readByte () sowohl Integer als auch keine Bytes zurückgeben. Um sie in ihre entsprechenden Typen umzuwandeln, müssen Sie sie in ihre jeweiligen Typen schreiben:

Char nextChar = (char) mySerialPort.readChar ();
Byte nextByte = (Byte) mySerialPort.readByte ();

Die beiden anderen Methoden sind ziemlich selbsterklärend. Im nächsten Schritt werde ich ein wenig mehr in die Tiefe gehen, wie wir über das Lesen von einem Hafen gehen würde.

* Technische Anmerkung *
Es ist erwähnenswert, dass sowohl ReadLine (), ReadExisting () einen String basierend auf decodierten Bytes aus dem Eingabepuffer zurückgibt. Was bedeutet das? Das bedeutet, dass wir zum Beispiel, wenn wir die Bytes 0x48, 0x69 und 0x0A erhalten haben, auf der Grundlage der ASCII-Codierung auf 'H', 'I' und '\ n' decodiert werden. Dies ist wichtig, denn wenn wir wollten, dass unsere Hardware den numerischen Wert von 65 (0x41) zu senden, und wir verwendet ReadExisting () und druckte den Rückgabewert zu einem Konsolenfenster würden wir eine Ausgabe von "A" nicht "65", weil es Decodiert 0x41 und änderte es auf 'A'. Wenn Sie den aktuellen numerischen Wert lesen möchten, sollten Sie readByte () oder readChar () verwenden, da sie Integerwerte zurückgeben, die nicht decodiert werden. Die SerialPort-Klasse unterstützt mehrere Codierungen außer dem Standard-ASCII über die SerialPort.Encoding-Eigenschaft; Es gibt viele Informationen darüber, dass in den Link in der Intro.

Schritt 3: Wege zum Lesen aus dem Port

Programmierung mit .NET

Wenn wir kontinuierlich von einem seriellen Port gelesen werden sollen und zum Beispiel alles, was wir lesen, in einem Konsolenfenster anzeigen, wäre der einfachste Weg, dies zu tun, eine Schleife zu erstellen und wiederholt einen von uns aufzurufen Lese-Methoden. Während diese Methode die Arbeit erledigt, gibt es einige signifikante Nachteile. Erstens ist es sehr einschränkend, da müssen Sie ständig die gleiche Methode immer und immer wieder aufrufen und Sie sind in der Schleife stecken.

Ein weiteres Problem, das mit den Lese-Methoden entsteht, ist, dass, wenn es keine Daten in den Eingangspuffer, wenn Sie sie aufrufen, wird sie die Ausführung Ihres Programms, bis es gültige Daten zu lesen (das ist ein ähnliches Verhalten wie die Console.ReadLine ) -Methode, das Programm wird erst fortgesetzt, wenn der Benutzer eingibt). Es gibt Eigenschaften, die Sie festlegen können, um die Methode zu zwingen, nach einer bestimmten Verzögerung zurückzukehren, aber im Allgemeinen möchten Sie nicht, dass Ihr Programm langsamer ausgeführt wird, als es muss.

Eine bessere Möglichkeit, kontinuierlich zu lesen, besteht darin, zu überprüfen, ob Daten im Eingabepuffer gelesen werden, die die SerialPort.BytesToRead-Eigenschaft verwenden. Diese Eigenschaft gibt die Anzahl der Bytes im Eingabepuffer zurück, die gelesen werden müssen. Damit können wir eine Schleife einrichten, die den gelesenen Code überspringt, wenn nichts im Eingangspuffer vorhanden ist. Hier ist ein Beispiel:

Während (wahr)
{
Versuchen
{
If (mySerialPort.BytesToRead> 0) // wenn Daten im Puffer vorhanden sind
{
MySerialPort.ReadByte (); // ein Byte lesen
aufrechtzuerhalten.
// anderer Code, der ausgeführt werden kann, ohne von read-Methode gehalten zu werden.
aufrechtzuerhalten.
Catch (IOException ex)
{
// Fehlerbehandlungslogik
aufrechtzuerhalten.
aufrechtzuerhalten.

Dieses Verfahren ist sicherlich effizienter, dass die bisherige Methode und wird für viele einfache Situationen funktionieren, wo alles, was Sie wirklich tun, ist kontinuierlich aus dem Hafen lesen. Werfen wir einen Blick auf ein anderes Szenario. Was passiert, wenn Sie ein großes komplexes Programm erstellen, das viele Aufgaben abwickelt und nicht in der Lage wäre, innerhalb der Grenzen einer Endlosschleife zu arbeiten? Zum Glück für Sie hat die SerialPort-Klasse ein Ereignis erstellt, das ausgelöst wird, wenn es neue Daten im Eingabepuffer gibt. Für alle, die nicht wissen, was ein Ereignis ist, ist ein Ereignis etwas, das Ihr Programm unterbricht, wenn etwas wichtiges passiert, ruft eine Methode, um mit dem Ereignis umzugehen, und kehrt dann zurück, wo das Programm aufgehört hat. In unserem Fall, wenn Daten von dem Eingangspuffer empfangen werden, stoppt das Ereignis das Programm, ruft eine Methode auf, bei der wir die Daten am wahrscheinlichsten behandeln würden, und dann zurück zu dem, wo unser Programm aufgehört hat. Wir werden dies in den nächsten Schritt.

Schritt 4: Lesen mit Ereignissen

Programmierung mit .NET

Das erste, was wir tun müssen, ist zu sagen, unsere serielle Schnittstelle, welche Methode aufrufen, wenn es Daten empfängt. Dies geschieht mit folgender Zeile:
MySerialPort.DataReceived + = neuer SerialDataEventHandler (mySerialPort_DataRecieved);

MySerialPort.DataReceived stellt die Methode dar, die aufgerufen wird, um das Ereignis zu behandeln. Diese Methode wird durch den folgenden Teil + = new SerialDataEventHandler (mySerialPort_DataRecieved) angegeben, der die Methode mySerialPort_DataRecieved anwendet, wenn das Ereignis ausgelöst wird. Als nächstes müssen wir die Methode erstellen:

Public static void mySerialPort_DataRecieved (Objektsender, SerialDataReceivedEventArgs e)
{
// was Logik und Lesevorgang wollen wir
aufrechtzuerhalten.

Das ist wirklich alles, was dazu gehört. Nur eine weitere Anmerkung: Sie wollen sicherstellen, dass bei der Verwendung von Ereignissen, die Sie Ihr SerialPort-Objekt als ein Klassenebene-Feld deklarieren, damit Sie es in mehreren Methoden, einschließlich der Ereignishandler verwenden können. Verschiedene Methoden und Verfahren passen zu unterschiedlichen Situationen, so müssen Sie eine finden, die funktioniert und die Sie verwenden möchten. Ich persönlich wie die Nutzung der Veranstaltungen, wann immer möglich, da sie die effizienteste und lassen Sie das Programm frei, andere Dinge zu tun, aber jeder hat seine Vorlieben. Im nächsten Schritt werde ich darüber reden, wie man auf eine serielle Schnittstelle schreiben.

Schritt 5: Schreiben an den Port

Programmierung mit .NET

Gute Nachrichten! Schreiben an einen Port ist unglaublich einfach! Hier sind die Schreibmethoden, die Sie verwenden können:

Schreiben (String-Daten)
WriteLine (String-Daten)
Schreiben (Byte [] Daten, int Offset, int Länge)
Schreiben (char [] data, int offset, int length)

Die ersten beiden Methoden sind fast identisch, außer dass WriteLine () ein newline Zeichen ( '\ n') nach dem Schreiben der Daten schreibt. Die anderen beiden Schreibverfahren sind ebenfalls ähnlich; Der einzige Unterschied ist der Datentyp der zu sendenden Daten. Um sie zu verwenden, stellen Sie ein Array von Bytes oder Zeichen bereit, die an die serielle Schnittstelle geschrieben werden. Der Offset-Parameter gibt nur an, welches Element des Arrays bei dem Start anfangen soll. Wenn Sie es 0 übergeben, beginnt es am Anfang des Arrays. Wenn Sie 1 übergeben, startet es am zweiten Element. Der length-Parameter ist einfach die Länge des Arrays. Denken Sie daran, diese Schreibvorgänge innerhalb eines try-catch-Blocks auszuführen, da sie leicht Fehler auslösen.

* Technische Anmerkung *
Erinnere dich an Codierung von Schritt 2? Dasselbe Konzept wird auf Write () und WriteLine () angewendet. Der Aufruf WriteLine ( "Hi") schreibt 0x41, 0x61, 0x0A (0x0A ist das hinzugefügte '\ n' seit wir WriteLine () verwendet haben). Wenn wir sie als Zeichen auf der Hardware-Seite erkennen wollen, müssen Sie Ihre eigene Decodierungslogik dort vorhanden sein.

Schritt 6: Schlussfolgerung

Programmierung mit .NET

Ich hoffe, das ist hilfreich für Sie und Ihr nächstes Projekt. Dies war etwas, das ich persönlich gekämpft, um herauszufinden, so dass ich hoffe, dass dies wird Ihnen helfen, haben Sie eine einfachere Zeit lernen, wie man über eine serielle Schnittstelle Schnittstelle. Fühlen Sie sich frei, um Kommentare, Fragen und Feedback unten.

Related Reading