Pergunta

Estou lendo dados da porta serial. Os dados são fora da escala. Agora estou usando Readline() e recebendo dados caiu mesmo depois de eu removido DiscardInBuffer(). O que é a maneira correta de ler os dados da porta serial? Há tão poucos exemplos on-line que eu sinto que é como um Santo Graal que ninguém descobriu.

Qualquer ajuda por favor?

Parece que a porta serial é uma criança caprichosa.

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

Uma coisa a nota sobre o meu pedido é que eu iniciar o thread (weighSample) quando o cursor salta para a caixa de texto. A razão para isso é que o peso também pode ser digitado manualmente (parte do req de). Então, eu não sei com antecedência se um usuário vai pressionar PRINT no balanço ou digite o peso. Em ambos os casos após os dados são adquiridos, eu sair do segmento de trabalho. Além disso, observe que não estou usando série de eventos porta DataReceived, desde que eu tenha sido dito que não é confiável.

Quaisquer comentários / idéias bem-vindos. Esta é a minha primeira experiência com portas seriais.

Foi útil?

Solução

Eu tenho não sorte teve com ReadLine de trabalho. Basta fazer uma leitura em um buffer local sempre que está disponível de dados e, em seguida, usar um segmento separado para digitalizar os dados e encontrar quebras de linha-se.

Outras dicas

depende do que o personagem (s) de fim-de-linha (EOL) é para os dados de entrada. Se os dados estiverem linha orientada então ReadLine é uma função válida para uso, mas você pode querer olhar para a propriedade nova linha e ter certeza de que ele está configurado adequadamente para os dados de entrada.

Por exemplo, se suas saídas escala de alimentação de linha para EOL então o conjunto de port.NewLine = "\n";

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

Gostaria de comentar a Elias Santos, mas eu não tenho reputação suficiente. Existem algumas armadilhas em usar o método ReadExisting:

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

Note que este método pode deixar arrastando chumbo bytes no tampão interno, o que faz com que o valor BytesToRead maior do que zero.

Eu enfrentei alguns problemas com ReadExisting antes e isso é por causa dos bytes indesejados. Usando Readline fixo essas questões.

if (serialPort1->IsOpen){
    if (serialPort1->BytesToRead>0){
        this->textBox1->Text += serialPort1->ReadExisting();
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top