www.mikrocontroller.net

Forum: PC-Programmierung C# Serielle Schnittstelle - Auswertung der Daten


Autor: Georg Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin !
Folgende Sache beschäftigt mich. Ich habe eine Serielle Schnittstelle 
die hardware - und softwäremäßig funktioniert. Nur die Auswertung der 
Daten macht mir etwas zu schaffen.

Ich empfange die Daten folgender Maßen:

private void serialPort1_DataReceived(object sender, 
SerialDataReceivedEventArgs e)
 {
   string data = serialPort1.ReadExisting();
 }

So jetzt habe ich die jeweils anliegenden Daten im String "data" 
gespeichert.


Ich möchte jetzt jedes einzelne Byte was im String "data" mit einer 
switch case Anweisung überprüfen um ggf. Aktionen auszuführen. Das würde 
zwangsläufig bedeuten das die Daten in einen Array gespeichert müssen.

Die Idee ist
switch(data[x])
{
 case 1: {}
 case 2: {}
 case 3: {}
}

Nur leider kann ich bis jetzt die Daten nicht in eine Array umwandeln..

Was muss ich machen, damit ich weiter komme?? Vielleicht muss ich die 
Daten auch nicht in einen String sondern in einem Integer zurück geben.

Bin dankbar für jede Hilfe und gespannt auf Eure Antworten!

Mfg Georg Franz

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
in vb.net mache ich folgendes:
Dim aIData() As Byte            ' Buffer für ankommende Daten
Dim enc As System.Text.Encoding = System.Text.Encoding.UTF8     ' 8-Bit encoding einastellen

Dim IncommingData = mRs232.ReadExisting   ' Alle angekommenen Daten einlesen
aIData = enc.GetBytes(IncommingData)       ' Byte-Daten herstellen  

Vielleicht hilft es Dir.

Bye
Klaus

Autor: Georg Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Franz,
danke für den Beitrag von Dir.
So ganz verstehe ich das leider nicht was Du das so vor hast...
Ich bin C# Frischling und habe bis jetzt nur in C programmiert!

Mfg Georg Franz

Autor: Helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie waere es den wenn du statt

 string data = serialPort1.ReadExisting();

das hier versuchen wuerdest

 CString data = serialPort1.ReadExisting();

dann kannst du mit data[x] die zeichen aus dem String holen

Gruss Helmi

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich benutze die Methoden, die das System mir bietet.
Z.B. ich möchte einen String (Text) in ein Byte-Array umwandeln.
Dazu biete mir das System die Klasse System.Text.Encoding an.
Mit
System.Text.Encoding enc = System.Text.Encoding.UTF8;
erzeuge ich diesen Konverter und stelle ihn gleichzeitig auf 8-Bit ein.
Nebenbei gesagt es gibt noch andere Formate wie z,B. UTF7, ASCII, .. .
Du kannst sie mal ausprobierten ... (Böse Falle) !
String IncommingData;                                     // Buffer für die ankommenden Daten
Byte[] aIData;                                            // Array für die weiterverarbeitung
System.Text.Encoding enc = System.Text.Encoding.UTF8;     // 8-Bit encoding einstellen

IncommingData = serialPort1.ReadExisting();               // Alle angekommenen Daten einlesen
aIData = enc.GetBytes(IncommingData);                     // Daten konvertieren

Das ist eigentlich alles.


Bye
Klaus

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Helmi,
geht
CString data = serialPort1.ReadExisting();
in Cshape überhaupt ?

Soviel ich weiß ist das c++ syntax.

Bye
Klaus

Autor: Helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe kein C# aber probiers einfach mal aus aber warum sollte die 
Klasse CString dort nicht exestieren ?

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Helmi,
es gibt keine "Klasse CString" in C#.

Ergo kann ich sie auch nicht verwenden.

Bye
Klaus

Autor: Gaston (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch es doch mal mit

char[] array = data.ToCharArray();

funktioniert so zumindest in .net 2.0

Ist zwar ein char-Array aber das ist ja dann kein Problem mehr.

MfG

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Gaston,
währe ne Möglichkeit. Falls mit Byte weitergearbeitet werden soll,
müsste noch eine Umwandlung erfolgen.

Wie dem auch sei. Georg Franz muss sich entscheiden, ob er mit
Byte (= 8-Bit) oder Char (= 16-Bit) arbeiten möchte.

Eine Umwandlungsmöglichkeit ist oben beschrieben.

Bye
Klaus

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir mal die Fkt. serialPort1.Read(...) an

Gruß, Slowflyer

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Slowflyer,

serialPort1.Read(...)  geht auch.
Etwa so
int   Offset = 0;                            // Schreibposition
int   AnzahlByte = serialPort1.BytesToRead() // Anzahl Bytes, die gelesen 
byte[] aInData = new byte[AnzahlByte];       // Lese-Buffer

werden sollen.

serialPort1.Read(aInData, Offset, AnzahlByte); // alle angekommen Daten ab Position = 0 einlesen


Bye
Klaus

Autor: Georg Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WOW !
Danke erstmal an Euch für die zahlreichen Beiträge !
Ich werde mich jetzt erstmal das ein und andere ausprobieren. Ich freue 
mich aber über weitere kreative Ideen!

Mfg Georg  Franz

PS: CString gibt es nicht!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.