Frage

Ich lese Daten von seriell Port. Die Daten stammen aus der Skala. Ich verwende jetzt Readline() und Abrufen von Daten fallen gelassen, auch nachdem ich DiscardInBuffer() entfernt. Was ist der richtige Weg, um die Daten von der seriellen Schnittstelle zu lesen? Es gibt so wenige Beispiele online, dass ich, es ist wie ein heiliger Gral das Gefühl, dass niemand herausgefunden hat.

Jede Hilfe bitte?

Scheint, wie serielle Schnittstelle ein launisches Kind ist.

C #, WinCE 5.0, HP Thin Client, Compact Framework 2.0

 private void WeighSample()
    {
        this._processingDone = false;
        this._workerThread = new Thread(CaptureWeight);
        this._workerThread.IsBackground = true;
        this._workerThread.Start();
    } //end of WeighSample()


    private void CaptureWeight()
    {
         globalCounter++;
         string value = "";


          while (!this._processingDone)
          {
              try
              {

                 value = this._sp.ReadLine();

                  if (value != "")
                  {
                      if (value == "ES")
                      {
                          _sp.DiscardInBuffer();
                          value = "";
                      }
                      else
                      {
                          this.Invoke(this.OnDataAcquiredEvent, new object[] { value });
                      }
                  }
              }
              catch (TimeoutException)
              {
                  //catch it but do nothing
              }
              catch
              {
                  //reset the port here?
                  MessageBox.Show("some other than timeout exception thrown while reading serial port");
              }
          }


    } //end of CaptureWeight()

Eine Sache, über meine Anwendung zu beachten ist, dass ich den Faden (weighSample), wenn der Cursor springt auf das Textfeld starten. Der Grund dafür ist, dass das Gewicht kann auch manuell eingegeben werden (Teil des erf des). Also ich weiß nicht im Voraus, ob ein Benutzer auf der Waage drücken PRINT wird oder das Gewicht eingeben. In jedem Fall, nachdem die Daten erfaßt werden, den Arbeiter-Thread I verlassen. Beachten Sie auch, dass ich nicht serielles Schnittstelle Ereignis DataReceived verwenden, da ich gesagt wurde, es ist nicht zuverlässig.

Alle Kommentare / Ideen willkommen. Dies ist meine erste Erfahrung mit seriellen Schnittstellen.

War es hilfreich?

Lösung

Ich habe nie hatte Glück mit Readline arbeiten. Sie einfach eine Read in einem lokalen Puffer, wenn Daten verfügbar sind und dann einen separaten Thread, um die Daten zu scannen und finden Zeilenumbrüche selbst.

Andere Tipps

Abhängig von, was die End-of-line (EOL) Stelle (n) ist für die Eingangsdaten. Wenn Ihre Datenleitung ausgerichtet ist, dann ist Readline eine gültige Funktion zu verwenden, aber Sie können auf der NewLine Eigenschaft aussehen wollen und sicher sein, dass sie in geeigneter Weise für die Eingangsdaten festgelegt sind.

Zum Beispiel, wenn Sie Ihre Waage Ausgänge Zeilenvorschub für EOL dann gesetzt port.NewLine = "\n";

http://msdn.microsoft. com / en-us / library / system.io.ports.serialport.newline.aspx

Ich möchte Elias Santos kommentieren, aber ich nicht genug Ruf. Es gibt einige Fallstricke, die ReadExisting Verfahren bei der Verwendung:

https : //msdn.microsoft.com/en-us/library/system.io.ports.serialport.readexisting (v = vs.110) aspx

  

Beachten Sie, dass diese Methode führt Bytes in der Hinter verlassen kann   interne Puffer, der den BytesToRead Wert größer als Null macht.

stand ich einige Probleme mit ReadExisting vor und dies ist wegen des unerwünschten Bytes. Mit Readline, diese Probleme behoben.

if (serialPort1->IsOpen){
    if (serialPort1->BytesToRead>0){
        this->textBox1->Text += serialPort1->ReadExisting();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top