könntest du biite vielleicht paar Kommentare hinter den Befehlszeilen setzen danke
könntest du biite vielleicht paar Kommentare hinter den Befehlszeilen setzen danke
Mit List.Add(temp) meinte ich das was ich auch vorher im Text beschrieben hab, nämlich dass du dir eine Liste definierst ( List<byte> MeineList = new List<byte>()) und der dann das jeweilige Byte hinzufügst.
Code://Globale Variable bool PaketStart = false; List<byte> meineListe = new List<byte>(); //Event byte temp = 0; while(temp != -1) //So lange die Variable temp ungleich -1 ist, also so lange Daten vorhanden sind mache: { temp = (byte)serialPort1.ReadByte(); //Lese ein byte if(PaketStart) //Sind wir bereits in einem Datenpaket drin ? { if(temp == Endbedingung) //Ist das byte die Endbedingung ? { //Rufe eine Prozedur auf die die Daten in der Liste verarbeitet (Nur eine Kopie der Datenübergeben und die ursprüngliche liste leeren), das Datenverarbeiten macht man aus Timinggründen wohl am besten aus einem anderen Thread } else { meineListe.Add(temp); //Ansonsten füge das byte der Liste hinzu } } if(temp == StartBedingung) //Wir sind in keinem Datenpaket drin, ist das gerade gelesene Byte die Startbedingung ? { PaketStart = true; //Ja also setzten wie die Variable PaketStart auf true so dass wir bei dem nächsten Schleifendurchlauf in if-Bedingung weiter oben springen } }
Hab das jetzt so geschrieben und unterstreicht mir while (temp != -1) grün mit der Meldung "Warnung 1 Der Vergleich mit einer ganzzahligen Konstante ist nutzlos. Die Konstante befindet sich außerhalb des Bereichs vom Typ "byte".".Code:private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) //Button zum Empfangen { try { //Globale Variable bool PaketStart = false; List<byte> meineListe = new List<byte>(); //Event byte temp =0; while (temp != -1) //So lange die Variable temp ungleich -1 ist, also so lange Daten vorhanden sind mache: { temp = (byte)serialPort1.ReadByte(); //Lese ein byte if (PaketStart) //Sind wir bereits in einem Datenpaket drin ? { if (temp == 66) //Ist das byte die Endbedingung ? { //Geschwindigkeit richTextBox1.Text = meineListe[5].ToString() + meineListe[6].ToString() + meineListe[7].ToString() + meineListe[8].ToString() + meineListe[9].ToString(); // Ausgabe Geschwindigkeit //Rundenzeit //richTextBox2.Text = char10.ToString() + char11.ToString() + char12.ToString() + char13.ToString() + char14.ToString(); //Ausgabe Rundenzeit //Runde label12.Text = meineListe[3].ToString() + meineListe[4].ToString(); //Rufe eine Prozedur auf die die Daten in der Liste verarbeitet (Nur eine Kopie der Datenübergeben und die ursprüngliche liste leeren), das Datenverarbeiten macht man aus Timinggründen wohl am besten aus einem anderen Thread meineListe.Clear(); } } else { meineListe.Add(temp); //Ansonsten füge das byte der Liste hinzu } } if (temp == 56) //Wir sind in keinem Datenpaket drin, ist das gerade gelesene Byte die Startbedingung ? { PaketStart = true; //Ja also setzten wie die Variable PaketStart auf true so dass wir bei dem nächsten Schleifendurchlauf in if-Bedingung weiter oben springen } } catch { ;} }
kann ich dieses Temp auch direkt in Char umwandeln, da ich gerne den If(temp == startbedinung) und If(temp == Endbedinung) mit einem Char vergleich will und direk auf den rich text box als Char ausgeben will. wie sieht das dann aus ?
mfg
Ohh, ja, klar ein byte geht nur von 0 bis 255. Also deklarier die variable temp statt als byte als int und lass bei serialPort1.ReadByte() den cast nach byte weg. Dann sollte die Warnung nicht mehr da sein.
Damit das ganze allerdings halbwegs erfolg haben kann, würde ich dich bitten dir echt noch mal paar Grundlagen anzuschauen. Das Datenverarbeiten vom SerialPort (der in C# ehh etwas zickig ist) gehört nicht wirklich zu den Einstiegsprogrammen. Z.B. schau dir an was eine globale Variable ist und wie man einen typ in einen anderen Castet.
Zum Casten mit der Startbedinung wird dir das hier weiterhelfen:
Angenommen '#' ist die Startbedingung dann kannst du schreiben:
if(temp == (byte)'#')
Das direkte ausgeben auf die richTextBox1 sollte sowie so nicht funktionieren, da du einen Fehler aufgrund eines Threadübergreifendenvorgangs bekommen solltest.
So da viel Fragen kamen die sich eigentlich um die selben Kernfragen kamen wollte ich diese noch mal zusammenfassen und auch an dieser Stelle hier auf das Galileo Openbook für C# verweisen, das vollkommen kostenlos und legal im Web erhältlich ist:
http://openbook.galileocomputing.de/csharp/
Nun zu den Hauptfragen:
Wie konvertiere ich den Typ integer (int) in den Typ byte oder in den Typ char?
Entweder mit einem direkten Cast (der in diesem Fall aufjedenfall funktioniert)
oder mit der Klasse Convert
BeispielCode:
Wenn man bei einen Integer die Methode .ToString() aufruft bekommt man die Zahl als Zeichenkette zurückCode:int MeinInteger = 100; byte MeinByte; char MeinChar; //Den int in byte konvertieren MeinByte = (byte)MeinInteger; //oder MeinByte = Convert.ToByte(MeinInteger); //Den int in einen char konvertieren MeinChar = (char)MeinInteger; //oder MeinChar = Convert.ToChar(MeinInteger);
Bsp:
int EineZahl = 120;
string EineZeichenkette = EineZahl.ToString();
//In eine Zeichenkette stehen nun die drei Ziffern 1,2 und 0 drin (Das selbe wie: "120");
Was ist eine globale Variable?
In jeder Klasse haben wir verschiedene Methoden. Z.B. Methoden die aufgerufen werden wenn auf einen Button geklickt wurde.
Nun kann man in einer Methode Variablen definieren auf die man allerdings nicht aus anderen Methoden zugreifen kann.
Beispiel:
Ich habe eine Variable in der Methode die aufgerufen wird wenn auf den Button1 geklickt wird. Aus der Methode die aufgerufen wird wenn eine zweiter Button geklickt wird kann man nicht darauf zugreifen.
Nun gibt es allerdings den Fall, dass auf Variablen aus jeder Methode einer Klasse zugreifen will (Z.B. um einen Status zu speichern), dazu gibt es globale Variablen:
Beispiel Code:
Ich erhalte die Fehlermeldung "Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement "..." erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."Code://Dieser Code steht innerhalb einer Klasse //Nun eine Globale Variable int MeinGlobalerInt = 10; public void Methode1() { //Eine lokale Variable int MeinLokalerInt = 0; //Auf die Globale Variable kann ich auch hier zugreifen MeinGlobalerInt = 15; } public void Methode2() { //Auch hier kann ich auf die Globale Variable zugreifen: MeinGlobalerInt = 99; //Auf die Variable aus Methode1 "MeinLokalerInt" kann ich jedoch nicht zugreifen MeinLokalerInt = 10; //Gibt Fehlermeldung }
Hierzu möchte ich nur auf den folgenden Link verweisen:
http://www.mycsharp.de/wbb2/thread.php?threadid=33113
Geändert von shedepe (27.05.2013 um 10:52 Uhr)
Hallo ich hab die Komponente mal etwas erweitert mit Multithreading und Pipes and Filter Architektur bei der der Bytedatenstrom in Datenpaket Objekte zerlegt wird.
https://www.roboternetz.de/community...pes-and-Filter
Lesezeichen