Laden...

Datenblock aus serieller Schnittstelle auswerten

Erstellt von AbsolutBeginner vor 17 Jahren Letzter Beitrag vor 17 Jahren 4.230 Views
A
AbsolutBeginner Themenstarter:in
15 Beiträge seit 2006
vor 17 Jahren
Datenblock aus serieller Schnittstelle auswerten

Hallo Zusammen,

ich habe eine Frage bezüglich dem Lesen und Auswerten von Daten über die serielle Schnittstelle!

ich habe 5 Fenster, in denen ich Informationen aus der seriellen Schnittstelle als char-Zeichen anzeige. Jedes Fenster soll verschiedene char-Werte anzeigen, die empfangen werden.

Wie kann man die serielle-Schnittstelle abhören und die empfangenen Informationen verschiedenen Fenstern zum abbilden zuweisen?

Jedes neu auszuwertender Datenblock kommt als "STARTXYYYYY" an
START als String sagt, dass ab hier ein neuer Datenblock angekommen ist.
X ordnet die Information YYYYY einem der Fenster zu.

Könnt ihr mir hier bitte bei der Realisierung helfen?

Danke!

A
AbsolutBeginner Themenstarter:in
15 Beiträge seit 2006
vor 17 Jahren

ist diese Frage so schwer oder zu einfach um hier gestellt zu werden? 🙂

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,
ich würde sagen weder - noch. Noch uetwas zu allgemein vielleicht. Es wird vermutlich Dir hier niemand die komplette Beschreibung der seriellen Schnittstelle liefern -> Dazu ist die Doku da. Stichworte: Serielle Kommunikation, SerialPort.

Wenn Du dabei auf konkrete Probleme stößt, kannst Du's ja nochmal versuchen.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

A
AbsolutBeginner Themenstarter:in
15 Beiträge seit 2006
vor 17 Jahren

@MarsStein : Wenn die Helfer selbst Hilfe brauchen, ja dann gute Nacht! 🙂)

Aber egal...

Hier ist eine funktionierende Funktion als Orientierung!


private void button1_Click(object sender, System.EventArgs e) 
          { 
               umwandeln("START199999"); 
          } 
          public void umwandeln(string Wert) 
          { 
               TextBox [] txt = new TextBox[5]; 
               txt[0]=textBox1; 
               txt[1]=textBox2; 
               txt[2]=textBox3; 
               txt[3]=textBox4; 
               txt[4]=textBox5; 
               char[] X = new char[1]; 
               char[] Y = new char[5]; 
               int index=5; 
               for(int i=0;i<5;i++) 
               { 
                    X=wert.ToCharArray(i*5+index,1); 
                    Y=wert.ToCharArray(i*5+1+index,5); 
                    String Xx = new string(X); 
                    String Yy = new string(Y); 
                    int a=Convert.ToInt32(Xx); 
                    txt[a-1].Text=Yy; 
                    index=6+index; 
               } 
          } 

Hier funktioniert alles nur dann, wenn ich einen kompletten Block(STARTXYYYYY) zur Verfügung stelle.
Leider weiss ich nicht wie ich das Programm dazu bringen kann so lange die Schnittstelle abzuhören, bis es "START" empfängt um danach die relevanten Daten "XYYYYY" auszuwerten

Kann ich jetzt auf Hilfe hoffen?

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,
welche .NET-Version benutzt Du denn? Unter 2.0 gibt's die SerialPort-Klasse, und die hat diverse Read-Methoden.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

A
AbsolutBeginner Themenstarter:in
15 Beiträge seit 2006
vor 17 Jahren

benütze .Net 2.0

So empfange ich die Daten über die serielle Schnittstelle


char[] receivedChars=new char[mySerialPort.BytesToRead];
            try
            {
                if (mySerialPort.BytesToRead > 0)
                {
                    mySerialPort.Read(receivedChars, 0, mySerialPort.BytesToRead);
                }
            }

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,
der Port sollte in einer while-Schleife in einem eigenen Thread gelesen werden.
Die empfangenen Daten dann immer wieder aus dem Bytearray rausschreiben in eine Variable, testen ob START enthalten ist, Länge prüfen, dann wenn alle benötigten Daten da sind ein Event feuern das die Daten in den EventArgs enthält. Die im Event abgesetzten Daten dann aus der Variablen entfernen und so weiter...
Das Event fängst Du dann an der Stelle ab wo Du die Daten verarbeiten willst.

EDIT: Das Beispiel in der MSDN zu Serieller Verbindung:
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.de/dv_fxsamples/html/27830a89-5b80-4f85-bde8-e146ae37035c.htm

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

A
AbsolutBeginner Themenstarter:in
15 Beiträge seit 2006
vor 17 Jahren

kann man dies mit so etwas in C# realisieren?


Modul Auswerten;
begin;
byte aus seriell Port lesen
  if byte1="S"
   { byte2 aus seriell Port lesen
   }
  else goto end
  if byte2="T"
      {byte3 aus seriell Port lesen}
  else goto end
  if byte3="A"
   { byte4 aus seriell Port lesen
   }
  else goto end
  if byte4="R"
      {byte5 aus seriell Port lesen}
  else goto end
  if byte5="T"
     {Bytex auslesen; Bytex auswerten
      Bytey1,bytey2,bytey3,bytey4,bytey5 auslesen; auswerten; abbilden
     }
  else goto end
end;

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,
ich finde die Methode mit mySerialPort.BytesToRead besser.
Du kannst dann einen ByteConverter benutzen, um das gelesene Bytearray zum String zu konvertieren.
Wenn du das in einer Schleife machst und die Daten immer wieder an den selben String anhängst, kannst Du diesen String auswerten und bearbeiten.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca