2010-10-25 12 views
2

J'ai écrit une application qui lit à partir d'un périphérique série à un rythme très rapide. L'objet port série ne parvient cependant pas à déclencher l'événement DataReceieved après environ 20 minutes de fonctionnement continu. La déconnexion et la reconnexion par programmation de la série permettent à l'événement de fonctionner à nouveau, mais seulement 20 minutes de plus.Comment utiliser correctement SerialPort.DiscardInBuffer?

J'ai essayé d'utiliser DiscardInBuffer après chaque événement DataReceived et cela semble avoir résolu le problème. Mais la méthode consomme beaucoup de temps CPU et dégrade les performances de l'application. MSDN mentionne que la méthode "supprime les données du tampon de réception du pilote série", mais ne suggère pas quand il doit être utilisé.

Quand et comment devrait-on utiliser DiscardInBuffer, et je l'utilise dans le contexte approprié pour mon problème particulier?

Edit:

Après la mise en œuvre de l'événement ErrorReceived, les données d'événements retournés indiquaient le type d'événement était un "RXOver".

+0

Etes-vous en train d'écouter l'événement ErrorReceived? http://msdn.microsoft.com/fr-fr/library/system.io.ports.serialport.errorreceived.aspx – SwDevMan81

+0

Non, je ne suis pas. Que devrais-je rechercher dans l'événement ErrorReceived? – steeppham

Répondre

0

Deux idées me viennent à l'esprit. La première (horrible) idée: appelez DiscardInBuffer toutes les 15 à 20 minutes au lieu de tous les événements DataReceived. La deuxième idée (un peu mieux): appelez DiscardInBuffer lorsque vous recevez l'événement ErrorReceived, que vous devriez gérer.

+0

A donné votre idée un essai, et il a semblé avoir allégé le problème après avoir reçu l'erreur de message "RXOver". – steeppham

1

Après plus d'investigations, il semble que mon problème était plus fondamental. Comme les données débordaient à un rythme soutenu, le tampon SerialPort devait être effacé ou traité en continu pour éviter l'erreur "RXOver". J'ai réalisé ceci en lisant dans un autre tampon pendant l'événement DataReceived et l'ai traité dans un autre fil séparé. D'après ce que je comprends, le DiscardInBuffer ne devrait être utilisé sélectivement pour effacer le contenu des ports à des fins d'initialisation, comme avant l'ouverture d'un port. Le processus d'effacement de la mémoire tampon du pilote prend un certain temps et doit donc être utilisé à bon escient dans une application orientée vers la performance.

+0

Vous avez dit: comme avant d'ouvrir un port. Pourquoi avant, vous recevez des données et courez une fois, donc je pense que ce devrait être après. Cette idée est-elle correcte? Merci ~ – sam

+0

@steeppham Si vous essayez de supprimer les tampons avant l'ouverture du port, vous obtenez une exception "Le port est fermé". Le port doit être ouvert pour appeler les méthodes de rejet. – Lamaseed

Questions connexes