Serial Port ReadLine vs ReadExisting ou comment lire correctement les données du port série
Je suis de la lecture des données à partir du port série. Les données proviennent hors de l'échelle. Je suis maintenant en utilisant Readline()
et l'obtention de données supprimés, même après que j'ai enlevé DiscardInBuffer()
.
Quelle est la bonne façon de lire les données sur le port série? Il y a si peu d'exemples en ligne que je ressens c'est comme une quête du graal que personne n'a compris.
Toute aide, s'il vous plaît?
Semble que le port série est un enfant capricieux.
C#, WinCE 5.0, HP client léger, 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 ma demande est que je démarre le thread (weighSample) lorsque le curseur se déplace sur la zone de texte. La raison à cela est que le poids peut également être saisi manuellement (une partie de la req). Donc je ne sais pas à l'avance si un utilisateur est d'aller sous presse, d'IMPRESSION sur l'équilibre ou le type de poids. Dans les deux cas, une fois les données acquises, je quitte le thread de travail. Notez également que je ne suis pas à l'aide du port série événement DataReceived, depuis que j'ai été dit qu'il n'est pas fiable.
Tous les commentaires/idées de bienvenue. C'est ma première expérience avec les ports série.
source d'informationauteur sarsnake
Vous devez vous connecter pour publier un commentaire.
J'ai jamais eu de la chance avec ReadLine de travail. Il suffit de faire une Lecture dans une mémoire tampon locale lorsque les données sont disponibles, et ensuite utiliser un thread séparé pour analyser les données et de trouver les sauts de ligne vous-même.
Dépend de ce que la fin de ligne (EOL) personnage(s) est pour votre entrée de données. Si vos données sont en ligne orienté ReadLine est une fonction valide à utiliser, mais vous pouvez regarder le retour à la ligne de propriété et assurez-vous qu'il est réglé de manière appropriée pour votre entrée de données.
Par exemple, si votre gamme de sorties de saut de ligne pour EOL, puis définissez
port.NewLine = "\n";
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.newline.aspx
Je voudrais faire un commentaire à Elias Santos mais je n'ai pas assez de réputation. Il y a quelques pièges à l'aide de la ReadExisting méthode:
https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readexisting(v=vs. 110).aspx
J'ai été confronté à quelques problèmes avec ReadExisting avant et c'est à cause de la non désirés octets. Utiliser Readline fixe ces questions.