Daten auslesen über serielle Schnittstelle C#

Gast #417364
Lesenswert?

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
Gast #417366
Lesenswert?

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
Gast #417369
Lesenswert?

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
}
}
Gast #417370
Lesenswert?

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
Gast #417372
Lesenswert?

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
Gast #417373
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren