2009-03-10 13 views
0

Ich verwende den seriellen Port, um die Daten von der Waage zu lesen, die an den Thin Client angeschlossen ist. In 99% der Fälle werden die Daten korrekt gelesen - dh was auch immer auf der Skala ist, wird von der Anwendung erfasst. Manchmal sieht es jedoch so aus, als würden Daten gelöscht. Zum Beispiel wird anstelle von 90.007 als 0.007 gelesen. Ich verwende ReadLine-Funktion:Serieller Port zum Löschen von Daten mit Readline()

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

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

Antwort

1

Wann kommt "ES"? Es ist theoretisch möglich, dass der Wert unmittelbar nach "ES" nicht korrekt gelesen wird, da Sie DiscardInBuffer() aufrufen. Wenn in dieser Zeit der Puffer einen Teil des nächsten Lesevorgangs enthält, z. Die 9 in 90.007, die 9 wird verworfen und Sie lesen 0.007.

Versuchen Sie, nur alles vor dem letzten CR LF zu verwerfen. Aber lasst unvollständige Linien.

+0

ES ist der Fehlercode, der von der Waage zurückgesendet wird. Ich möchte den Fehlercode schlucken. Meine Annahme ist, dass ReadLine eine Zeile liest (macht Sinn?), Wenn ES \ n \ r gelesen wird, werde ich es schlucken. Warum sollte es die nächste Zeile nicht richtig lesen? Ich werde dieses Stück kommentieren und sehen, ob das hilft. – sarsnake

+0

Nicht sicher, aber könnte ein Nebenläufigkeitsproblem sein - der zugrunde liegende Thread schreibt die Daten des seriellen Ports in den Puffer, und wenn es passiert, dass es a nicht beendet hat, bevor Sie 'DiscardInBufer()' aufrufen, verlieren Sie einfach die Anfang, z die 9 in 90.007 – siddhadev

2

Nicht DiscardInBuffer aufrufen. Der Betriebssystempuffer ist gefüllt asynchronously wie Daten über die UART verschoben werden. Lesen Sie alle Daten und handeln Sie entsprechend, weil Sie nicht wissen können, was sich zu dem Zeitpunkt, an dem Sie es verwerfen, im Puffer befindet!

+0

das wird nicht funktionieren. Ich lösche den In-Puffer, so dass die gelesenen Daten mit dem Datagrid von Samples übereinstimmen. Es gibt keine Möglichkeit 2 zu identifizieren, welches Gewicht zu welcher Probe gehört, wenn der Benutzer zu oft auf Drucken drückt, so dass ich den Puffer b4, den ich gelesen habe, lösche. Ist es besser, DiscardInBuffer() nach readline aufzurufen? – sarsnake

+0

+1 - Ich stimme zu: nicht DiscardInBuffer aufrufen. Wenn der Benutzer zu oft auf Drucken klickt, müssen Sie auf andere Weise damit umgehen. Wie oben beschrieben, rennst du immer am Hafen herum, um zu sehen, wer zuerst da ist. – dwc

Verwandte Themen