Forum: PC-Programmierung Daten auslesen über serielle Schnittstelle C#


von dscho (Gast)


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

von Slowflyer (Gast)


Lesenswert?

Moin,

passt die Baudrate, Anzahl Stoppbits, Anzahl Databits, Parity (falls
verwendet auch das Parityreplace) etc.?

von dscho (Gast)


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

von Slowflyer (Gast)


Lesenswert?

Welcher Datentyp ist btyBuffer char oder byte?

von dscho (Gast)


Lesenswert?

Das ist ein byte. Ich habs aber auch mit char versucht.

von Slowflyer (Gast)


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
}
}

von dscho (Gast)


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

von Slowflyer (Gast)


Lesenswert?

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.

von dscho (Gast)


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

von Slowflyer (Gast)


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.

von Rene B. (themason) Benutzerseite


Lesenswert?

@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
Noch kein Account? Hier anmelden.