Question

Je lis des données du port série. Les données proviennent de la balance. J'utilise maintenant Readline () et je récupère les données même après avoir supprimé DiscardInBuffer () . Quelle est la bonne façon de lire les données du port série? Il y a tellement peu d'exemples en ligne que je sens que c'est comme un saint Graal que personne n'a compris.

Toute aide s'il vous plaît?

On dirait que le port série est un enfant capricieux.

C #, WinCE 5.0, client léger HP, 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()

Une chose à noter à propos de mon application est que je commence le thread (peseréchantillon) lorsque le curseur saute sur la zone de texte. La raison en est que le poids peut également être saisi manuellement (une partie du req). Donc, je ne sais pas à l'avance si un utilisateur va appuyer sur IMPRIMER sur la balance ou taper le poids. Dans les deux cas, une fois les données acquises, je quitte le thread de travail. Notez également que je n’utilise pas l’événement de port série DataReceived, car on m’a dit que ce n’était pas fiable.

Tous les commentaires / idées sont les bienvenus. C’est ma première expérience avec les ports série.

Était-ce utile?

La solution

J'ai jamais eu de la chance avec ReadLine. Il suffit de faire une lecture dans un tampon local chaque fois que des données sont disponibles, puis d’utiliser un thread séparé pour analyser les données et rechercher vous-même les sauts de ligne.

Autres conseils

Dépend de ce que le ou les caractères de fin de ligne (EOL) sont pour vos données d'entrée. Si vos données sont orientées ligne, ReadLine est une fonction valide, mais vous pouvez également consulter la propriété NewLine et vous assurer qu'elle est définie correctement pour vos données d'entrée.

Par exemple, si votre balance génère un saut de ligne pour EOL, définissez port.NewLine = "\ n";

.

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

Je voudrais commenter Elias Santos mais je n’ai pas assez de réputation. L'utilisation de la méthode ReadExisting présente des pièges:

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

  

Notez que cette méthode peut laisser des octets de fin dans le   tampon interne, ce qui rend la valeur BytesToRead supérieure à zéro.

J'ai déjà eu quelques problèmes avec ReadExisting auparavant, à cause des octets indésirables. L'utilisation de Readline a corrigé ces problèmes.

if (serialPort1->IsOpen){
    if (serialPort1->BytesToRead>0){
        this->textBox1->Text += serialPort1->ReadExisting();
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top