2010-01-19 6 views
6

Voici mon problème: Je dois être en mesure d'envoyer et de recevoir un périphérique en série. Cela doit être fait de manière multi-thread. Le flux est la suivante:Producteur/Consommateur Pour parler aux périphériques en série

  1. Attendez appareil pour me envoyer quelque chose - ou en cas d'inactivité, puis requête de l'état pour voir si en ligne avec dispositif

  2. Si l'appareil me envoie quelque chose, alors le message de processus, reconnaître , et indiquer au périphérique d'exécuter d'autres commandes si nécessaire.

À l'heure actuelle, j'ai un thread de réception et un thread de transmission. Le thread de réception a une boucle while qui vérifie le port série via ReadFile (...) pour un octet. Si j'ai un octet, alors je commence à construire mon tampon et ensuite analyser les données pour déterminer ce qui m'a été envoyé.

Le thread d'envoi prend la commande suivante définie par le thread de lecture et l'envoie via WriteFile au même port COM. La clé est qu'il existe une relation de réception/envoi entre moi et l'appareil.

Ma question est la suivante: est-ce que j'ai un modèle imbriqué producteur/consommateur ici? Si mon thread de réception est en train de consommer depuis le périphérique et que le thread d'envoi est en train de produire vers le périphérique, les threads doivent parler de manière inhérente pour être synchronisés, n'est-ce pas? Quelle est la meilleure façon de synchroniser mes efforts efficacement et rapidement parler à l'appareil? Note: J'utilise C++ Builder 5 qui a TThreads et peut utiliser des sections critiques et des mutex. Edit: J'utilise aussi l'interrogation, donc je suis ouvert à l'utilisation de WaitCommEvent si cela fonctionne mieux!

Répondre

1

Quelles ressources partagez-vous que vous pensez avoir besoin de synchroniser?

Si vous avez quelque chose comme une file d'attente entre les deux threads, alors c'est un modèle producteur/consommateur assez classique. PAR EXEMPLE. Si vous n'avez qu'un thread en train de lire les commandes dans une file d'attente alors qu'un autre thread extrait la file, traite la commande et écrit sur le périphérique, vous devez synchroniser l'accès à la file avec un mutex ou un sémaphore. Peut-être qu'il me manque quelque chose, mais cela ne devrait être compliqué que si vous avez plusieurs threads qui lisent dans la file d'attente et que les commandes qui doivent être transmises doivent rester dans l'ordre. Alors essayez de garder les choses simples.

+0

Oui, mais comment puis-je synchroniser l'accès à l'appareil de sorte que lorsque je lis, je n'écris pas? Drapeau mondial? –

+0

Etes-vous sûr de devoir le faire? Si c'est le cas, vous pouvez utiliser un sémaphore pour synchroniser les opérations de lecture/écriture. Ce http://stackoverflow.com/questions/1488712/is-it-safe-to-read-and-write-to-a-serial-port-at-the-same-time-via-different-thre pourrait être utile. – Duck

Questions connexes