Hallo, ich bekomme von einer Steuerung Daten über die Serielle Schnittstelle gesendet. z.B. 0x08 0x02 0x0A 0x01 0x15 mit nBufferPos = ComPort.Read(btyBuffer, nBufferPos, ComPort.BytesToRead); lese ich die Daten ein mein Problem ist nun folgendes in btyBuffer[0] steht 0xf3 drin sollte aber 0x08 sein btyBuffer[1] steht 0xf3 drin sollte aber 0x02 sein btyBuffer[2] steht 0x0a drin sollte aber 0x0A sein hier past es Zufall? btyBuffer[3] steht 0xf3 drin sollte aber 0x01 sein btyBuffer[4] steht 0x15 drin sollte aber 0x15 sein kann mir jemand weiterhelfen? Für alle Tips bin ich dankbar
Moin, passt die Baudrate, Anzahl Stoppbits, Anzahl Databits, Parity (falls verwendet auch das Parityreplace) etc.?
Ja das passt alles, ich vermute in der Zwischenzeit, dass in dem Empfangspuffer folgendes drin steht: 08020a0115 und jetzt muss ich C# irgendwie klarmachen, dass das einzelne Bytes sind und kein zusammenhängender String oder sonst etwas. Aber ich hab keine Ahnung wie. Oder bin ich da voll auf dem Holzweg? Gruß Dscho
Das ist ein byte. Ich habs aber auch mit char versucht.
Wenn ich deinen Quelltext richtig interpretiere, liest du in nBufferPos die Anzahl der gelesenen Bytes ein und verwendest ihn auch noch als Offset-Parameter. Das müsste bedeuten, das beim zweiten Lesen der Offset bei der vorher gelesenen Anzahl beginnt. Ich frage mich was du damit bezwecken willst? Versuch es mal so: [code] nBufferPos = ComPort.Read(btyBuffer, 0, ComPort.BytesToRead); [\code] Ich poste hier mal Teile meines Quelltextes für die Einstellung und auslesen: InitializeComponent () { ... this.serialPort1.ParityReplace = ((byte)(0)); this.serialPort1.PortName = "COM2"; this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1DataRecei ved); this.serialPort1.Encoding = Encoding.UTF8; this.serialPort1.BaudRate = 9600; this.serialPort1.DataBits = 8; this.serialPort1.StopBits = System.IO.Ports.StopBits.One; this.serialPort1.Parity = System.IO.Ports.Parity.None; this.serialPort1.Open(); ... } void serialPort1DataReceived(object sender, System.EventArgs e) { byte[] buffer = new byte[this.serialPort1.BytesToRead]; this.serialPort1.Read(buffer, 0, this.serialPort1.BytesToRead); for (int i = 0; i<buffer.Length; i++) { tempstring += (" 0x"+buffer[i].ToString("x2")); // tempstring globale Variable } }
Hallo Slowflyer, ich habe deinen Code versucht, aber es funzt trotzdem nicht. Wenn ich 0x08 0x02 0x0A 0x01 0x15 sende bekomme ich 0x30 0x38 0x30 0x32 0x30 ich kapier es einfach nicht. Hast du noch eine Idee?? Gruß Dscho
So langsam gehen auch mir die Ideen aus, kannst du das Projekt hier im Anhang posten? Ich würd mir das mal ansehen und ausprobieren wollen.
Hallo Slowflyer, ich habe deinen Code nochmal getestet und (es ist mir ja schon peinlich) aber das Paritybit war falsch gesetzt. Jetzt funktioniert es. Ich habe aber trotzdem noch eine Frage. Wenn die Funktion "serialPort1DataReceived" aufgerufen wird, sind dann schon alle Bytes da oder kann es sein, dass nur ein Teil vorhanden ist und somit die Funktion öfters aufgerufen wird. Gruß Dscho
Schön, dass der Fehler gefunden wurde. Wann das Event ausgelöst wird, weiss ich leider auch nicht genau. Ich schätze, sobald ein Zeichen eintrifft. Dann liest du den Buffer aus uns sobald wieder ein Zeichen in den Buffer geschrieben wird, wird wieder das Event ausgelöst. Die MSDN gibt da leider auch keine Auskunft.
@dscho ist dir zufällig aufgefallen das 0x30 0x38 0x30 0x32 0x30 gerade die ASCII darstellung für 08 02 0... ist ?! vielleicht irgendeinen falschen modus gewählt ?! also für mich wird statt 0x08 (zeichen) der string "08" übertragen. gruß rene
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.