Communication par port série: interrogation du port série par rapport à l'utilisation du port série Evénement DataReceived
Je suis juste en revue une partie de code que j'ai écrit pour communiquer avec le port série en C# sur CF2.0.
Je ne suis pas à l'aide de DataReceived événement, car il n'est pas fiable. MSDN stipule que:
La DataReceived événement n'est pas
gauranteed à recueillir pour chaque octet
reçu. Utilisez la propriété BytesToRead
afin de déterminer quelle quantité de données est laissée à
à lire dans la mémoire tampon.
J'sondage le port avec read() et avoir un délégué qui traite les données lors de leur lecture. J'ai aussi lu quelque part que "l'interrogation est mauvais"(sans explication).
Des idées pourquoi interrogation pourrait-elle être mauvaise? outre les habituels filetage précautions - j'ai un autre thread (thread d'arrière-plan) qui interroge le port, le thread est terminé après la lecture de données, tous testé et fonctionne bien.
source d'informationauteur sarsnake
Vous devez vous connecter pour publier un commentaire.
La façon dont j'ai lu cela, vous pourriez obtenir un événement sur plusieurs octets, plutôt que d'un événement par octet. Je voudrais tout de même s'attendre à obtenir un événement lorsque les données sont prêtes, et pas "sauter" quelques octets entièrement.
J'ai toujours utilisé cet événement, et n'avons eu aucun problème avec.
La sagesse conventionnelle que "l'interrogation est mauvais" parce qu'il se termine souvent par être un CPU processus. Si le blocage I/O est utilisé à la place, puis le PROCESSEUR est disponible pour d'autres processus jusqu'à ce que l'événement se produit.
Cela dit, il est généralement possible de mettre les choses en place, de sorte qu'un sondage attend pour un (court) délai d'attente avant de retourner lorsque aucun des caractères sont disponibles. Si un délai d'attente est choisie, votre simple boucle d'interrogation utilise considérablement moins de temps PROCESSEUR, et d'autres processus aussi arriver à courir.
Je n'ai pas utilisé les ports série à partir de C#, mais je vais hasarder une conjecture que ce que la documentation entend par
est que vous ne pouvez pas vous attendre à obtenir un événement par caractère. Il pourrait, dans certaines circonstances, fournir de l'événement avec plus d'un caractère. Il vous suffit de récupérer tous les caractères disponibles dans votre gestionnaire d'événements, et tout ira bien.
Edit: Faire un appel bloquant sur un thread de lecture pourrait être la meilleure réponse globale. Il n'est pas d'interrogation en soi puisque le thread est bloqué jusqu'à ce que les personnages arrivent. Vous pourriez avoir besoin pour régler la taille du buffer et de certains des paramètres du port série si vous avez besoin de traiter les données comme il arrive plutôt que de les en morceaux de taille fixe.
Je suis sûr que le sous-jacent pilote de port série code interruption, même lorsque vous utilisez le blocage de la Lecture d'appel.