2011-02-01 3 views
1

J'utilise la classe .NET SerialPort pour communiquer avec les jauges. Chaque fois qu'un bouton sur une jauge est pressé, une valeur de lecture est envoyée sur le port. Le problème que j'ai, c'est que si le bouton de la jauge est pressé pendant que le programme est éteint, alors quand le programme démarre, il déclenche l'événement de données reçues pour les données existantes. Je ne veux pas de ce comportement - je veux seulement recueillir les lectures effectuées après l'ouverture du port.SerialPort - Effacer les données existantes

J'ai une solution de contournement actuelle en utilisant un Thread.Sleep mais il semble hacky et je me demande si quelqu'un connaît une meilleure solution.

port = New SerialPort("COM1", 9600, Parity.None, 8, StopBits.One) 

port.Open() 
port.DtrEnable = True 

System.Threading.Thread.Sleep(100) 
port.ReadExisting() 

AddHandler port.DataReceived, AddressOf PortDataReceived 

Si je n'ai pas Thread.Sleep alors l'événement DataReceived est déclenché pour les données de calibre précédentes. Je suppose que c'est parce que le ReadExisting ne bloque pas et donc quand il est appelé immédiatement après un ouvert, il ne lit rien.

Merci


Donc, si vous appelez 'port.BytesToRead() immédiatement après son ouverture zéro. Si vous l'appelez 100ms après avoir ouvert son non-zéro. Je suppose que cela a du sens - il faut du temps après l'ouverture pour lire les données existantes.

Une autre option est d'appeler lire et définir le délai d'attente de lecture, mais qui semble pas différent de Thread.Sleep sauf que vous devez attraper une exception ...

+0

Utilisez-vous Xon/Xoff ou la prise de contact matérielle? –

+0

J'utilise la valeur par défaut pour la classe SerialPort dans .NET. Je vais essayer de comprendre ce que c'est :) – anonymous

+0

également vos périphériques série tamponner le bouton appuyer et renvoyer s'il n'y a pas de communications? –

Répondre

1
port.DtrEnable = True 

Cela pourrait avoir un effet secondaire. La jauge pourrait sauter de haut en bas, désireux d'envoyer la lecture. Après tout, quelqu'un a appuyé sur le bouton pour lui dire que c'est bon d'envoyer. Mais sa routine de transmission observe le protocole de prise de contact, Data Terminal Ready n'est pas activé. Sauter, sauter, ah! c'est en marche. Envoyer. Cela prend un certain temps, dépend du débit en bauds. Eh bien, pourquoi quelqu'un a appuyé sur le bouton même si l'ordinateur n'était pas prêt? Pourquoi n'est-ce pas toujours prêt? Répondez à cette question, puis vous pouvez supprimer Sleep(). Découvrez également ce qui se passe lorsque quelqu'un appuie sur le bouton une centaine de fois avant que l'ordinateur ne soit prêt. Votre sommeil() pourrait bien être trop court.

+0

Je ne suis pas un export de port série. Avoir DTR sur les résultats dans une commande étant envoyée à l'appareil sur ouvert? Si c'est le cas, cela a un sens total. (Sans cette ligne je ne reçois jamais de données btw). Le presser plusieurs fois semble ne faire aucune différence - il stocke seulement 1 résultat jusqu'à sa lecture. Donc, éteint, appuyez sur 10 fois, sur, j'ai lu 1 message de la jauge. Au moins cette jauge particulière :) – anonymous

+0

Pour répondre à la deuxième partie (pourquoi appuyer sur le bouton sans le programme sur) - Je veux juste gérer une utilisation par inadvertance. C'est un programme de journal d'étalonnage de jauge de sorte qu'ils le démarrent pour enregistrer des valeurs. Je veux juste m'assurer qu'il n'y a pas de confusion - ils démarrent le programme et ne voient pas une valeur déjà entrée. – anonymous

+0

Eh bien, c'est bien, personne ne remarquera particulièrement 100 millisecondes. Ils ne se plaindront pas non plus lorsque votre programme affiche une lecture après le démarrage, même si le bouton n'a pas été pressé depuis. Cela ne peut pas être un vrai problème.Éduquez vos utilisateurs, ils vont "Ah, c'est logique". –

0

Si vous n'avez pas besoin de recueillir ce qui est en attente dans la mémoire tampon de la serialport essayer d'appeler le serialPort.DiscardWriteBuffer() serialPort.DiscardOutBuffer() qui devrait effacer tout ce qui a rassemblé là. Merci à Chad pour avoir corrigé mon erreur.

+0

N'est-ce pas serialPort.DiscardOutBuffer() '? – Chad

Questions connexes