Laden...

[gelöst] COM-Port-Abfrage startet manchmal nicht und liefert nur die gleichen Werte

Erstellt von Olaf vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.627 Views
O
Olaf Themenstarter:in
4 Beiträge seit 2013
vor 11 Jahren
[gelöst] COM-Port-Abfrage startet manchmal nicht und liefert nur die gleichen Werte

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:

  1. Ich kann zwar immer mit dem Bluetooth-Modul connecten (Signal-LED und BlueSoleil-Software zeigen Verbindung an), aber nur in ca. 30% der Fälle kann ich auch Daten empfangen. (Bzw. springt mein Programm in die serialPort1_DataReceived-Methode).
    Woran kann es liegen, dass ich mal Daten empfangen kann, und dann mal wieder nicht? Dieses Phänomen lässt sich leider nicht reproduzieren.
  2. Die Daten - wenn ich sie mal empfangen kann - wiederholen sich immer alle 14 Bytes (= Anzahl der Messwerte die mein Sensor liefert), was dann in etwa so aussieht:
    START-BYTE 121 137 128 0 47 0 48 148 241 6 125 48 144 164 STOP-BYTE
    START-BYTE 121 137 128 0 47 0 48 148 241 6 125 48 144 164 STOP-BYTE
    START-BYTE 121 137 128 0 47 0 48 148 241 6 125 48 144 164 STOP-BYTE
    ...

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.

49.485 Beiträge seit 2005
vor 11 Jahren

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

O
Olaf Themenstarter:in
4 Beiträge seit 2013
vor 11 Jahren

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.

T
94 Beiträge seit 2007
vor 11 Jahren

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.

185 Beiträge seit 2005
vor 11 Jahren

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.

U
1.688 Beiträge seit 2007
vor 11 Jahren

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.

O
Olaf Themenstarter:in
4 Beiträge seit 2013
vor 11 Jahren

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.

O
Olaf Themenstarter:in
4 Beiträge seit 2013
vor 11 Jahren

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 =)