Pregunta

Estoy leyendo datos del puerto serie. Los datos salen de la escala. Ahora estoy usando Readline () y obtengo datos eliminados incluso después de eliminar DiscardInBuffer () . ¿Cuál es la forma correcta de leer los datos del puerto serie? Hay tan pocos ejemplos en línea que siento que es como un santo grial que nadie ha descubierto.

¿Alguna ayuda por favor?

Parece que el puerto serie es un niño caprichoso.

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

Una cosa a tener en cuenta sobre mi aplicación es que comienzo el hilo (weightSample) cuando el cursor salta al cuadro de texto. La razón de esto es que el peso también se puede escribir manualmente (parte de los requisitos). Por lo tanto, no sé de antemano si un usuario presionará IMPRIMIR en la balanza o si escribirá el peso. En cualquier caso, después de adquirir los datos, salgo del hilo de trabajo. Además, tenga en cuenta que no estoy usando el evento de puerto serie DataReceived, ya que me han dicho que no es confiable.

Cualquier comentario / idea bienvenida. Esta es mi primera experiencia con puertos serie.

¿Fue útil?

Solución

nunca tuve suerte con ReadLine funcionando. Simplemente haga una lectura en un búfer local siempre que haya datos disponibles y luego use un hilo separado para escanear los datos y encontrar saltos de línea usted mismo.

Otros consejos

Depende de los caracteres de fin de línea (EOL) para sus datos de entrada. Si sus datos están orientados a líneas, entonces ReadLine es una función válida para usar, pero es posible que desee ver la propiedad NewLine y asegurarse de que esté configurada adecuadamente para sus datos de entrada.

Por ejemplo, si su báscula genera salto de línea para EOL, configure port.NewLine = " \ n " ;;

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

Me gustaría comentarle a Elias Santos pero no tengo suficiente reputación. Hay algunas trampas al usar el método ReadExisting:

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

  

Tenga en cuenta que este método puede dejar bytes iniciales finales en el   buffer interno, que hace que el valor de BytesToRead sea mayor que cero.

Enfrenté algunos problemas con ReadExisting antes y esto se debe a los bytes no deseados. El uso de Readline solucionó esos problemas.

if (serialPort1->IsOpen){
    if (serialPort1->BytesToRead>0){
        this->textBox1->Text += serialPort1->ReadExisting();
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top