Hallo zusammen,
ich habe ein Bluetooth-Modul (lieftert Sensordaten), das ich mit einem Bluetooth-USB-Stick mit meinem PC verbinde. Als Verbindungs-Software nutze ich BlueSoleil. Diese öffnet einen virtuellen COM-Port, auf den ich in C# zugreifen will.
Ich habe zwei Probleme, zu deren Lösung ich leider bisher noch nichts gefunden habe:
Nur müssten sich die Sensordaten ständig ändern. Wie gesagt, mit einem anderen Programm werden korrekte Messwerte empfangen, deswegen kann ich einen Hardwarefehler eigentlich ausschließen.
Mein Wissen auf diesem Bereich ist eher beschränkt, deswegen wäre ich für jede Hilfe dankbar! Habe den Code natürlich auch in mehreren Weisen variiert, aber leider noch keine Lösung gefunden...
Hier noch der Programm-Code:
serialPort1.PortName = "COM4";
serialPort1.BaudRate = 115200;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
serialPort1.DataBits = 8;
serialPort1.Handshake = Handshake.None;
serialPort1.StopBits = StopBits.One;
serialPort1.Open();
this.serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] data = new byte[serialPort1.BytesToRead];
serialPort1.Read(data, 0, data.Length);
…
}
Danke.
Hallo Olaf,
bevor dein Beitrag ganz untergeht: Hast du den schon mal versucht die Daten, die zu bekommst, zu interpretieren? Sind das sinnvolle Ergebnisse? Oder Datenmüll?
herbivore
Hallo herbivore,
immerhin mal eine Rückmeldung 😄.
Nein, die Daten soweit ich das Beurteileln kann ergeben keinen Sinn, scheint wirklich nur "Datenmüll" zu sein.
Benutze mal ein Programm wie z.B. Hyperterminal und schaue dir dort die eingelesen Daten an, um einen Programmierfehler auszuschließen. Evtl. sind die Einstellungen des COM-Ports auch nicht richtig.
Du erstellst bei jedem Aufruf von DataReceived ein neues Byte-Array.
Bei der Seriellen Schnittstelle kann es aber durchaus sein, dass die Daten "zerstückelt" ankommen.
Gibt es bei dem SerialPort den Parameter RThreshold? Ich stelle den Wert immer auf 1, damit ich auch bei einzelnen Zeichen den Event bekomme.
Auch ist nicht ersichtlich, wie die Daten ausgegeben werden - vielleicht liegt der Fehler ja dort?
Du könntest auch unter Umgehung des DataReceived-Ereignisses mit einem eigenen Empfangs-Thread arbeiten. Das läuft meist zuverlässiger.
Hallo,
@MartinH: Das mit dem RThreshold habe ich versucht, funktioniert nicht.
@ujr: Die Daten gebe ich noch garnicht aus, sondern setze einen break-point und sehe dann, dass die Daten immer gleich sind...
Ich habe den verdacht, dass es daran liegt, dass man dem Sensor noch sagen muss, dass er die Daten senden soll, das müsste eigentlich mit
byte[] mode = new byte[1];
mode[0] = 3; // oder auch 0x03, dieser Wert kommt aus dem Datenblatt...
serialPort1.Write(mode, 0, mode.Length);
klappen, aber das schafft auch leider keine abhilfe.
Gelöst:
byte[] mode = new byte[1];
mode[0] = 3; // oder auch 0x03, dieser Wert kommt aus dem Datenblatt...
serialPort1.Write(mode, 0, mode.Length);
hat es doch gebracht, war nur falsch debuggt von mir =)