mikrocontroller.net

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


Autor: dscho (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

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

Autor: dscho (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Datentyp ist btyBuffer char oder byte?

Autor: dscho (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ein byte. Ich habs aber auch mit char versucht.

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}
}

Autor: dscho (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dscho (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rene B. (themason) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.