2009-04-16 5 views
1

Je travaille sur une application C++ Win32 pour laquelle j'essaye de détecter automatiquement si un périphérique a été connecté à l'un des ports RS232 La vérification d'un périphérique connecté est assez simple car mon cas d'utilisation me permet de supposer que ce thread sera le premier à essayer d'initier la communication avec le port. pour balayer les ports disponibles toutes les minutes et une fois que j'ai trouvé un port avec le périphérique, je signale que ce port a un périphérique, fermez le port, puis définissez un événement pour que le processus qui utilisera le périphérique le sache il peut maintenant se connecter sur ce portDétermine si le périphérique est connecté/déconnecté au port RS232 sans ouvrir le port

La détection de déconnexion est l'endroit où je rencontre des problèmes. Lorsque je recherche des appareils connectés, je peux effectivement envoyer des données au port pour être sûr que, s'il y a un appareil, c'est l'appareil que je recherche. Mais une fois connecté, ce port sera déjà ouvert par l'autre processus et je ne peux plus ouvrir ce port à partir du thread de détection. Donc, je cherche un moyen d'ouvrir le port en mode "écoute" ou quelque chose comme ça, donc je peux juste voir si l'appareil est toujours là.

Je suis brièvement tombé sur quelque chose à propos de regarder la ligne DSR ou DTR ou quelque chose ... mais je ne pouvais pas trouver plus ou comment le faire réellement.

Des suggestions?

Edit: On dirait que je dois clarifier un peu plus ... Pour détecter la déconnexion, je ne peut pas envoyer des données au port RS232 de quelque façon. En outre, je ne peux pas supposer qu'une autre application a effectivement le port ouvert. Le périphérique peut être physiquement connecté, mais sans et ouvrir la connexion ... mais je ne peux toujours pas risquer d'envoyer des données. J'espérais qu'il y avait un moyen de vérifier qu'il y avait encore de la puissance sur ce port ou quelque chose comme ça.

Répondre

4

Selon le matériel connecté, les registres d'état du modem changent lorsque vous déconnectez le matériel, mais vous pouvez vérifier l'état, par exemple, de la ligne CTS ou DSR à l'aide de la fonction GetCommModemStatus().

Il y a cependant le problème que vous avez besoin d'une poignée de fichiers au port COM pour appeler toutes les fonctions API, ce qui est exclusive que la documentation des CreateFile() états:

La fonction CreateFile peut créer une poignée une ressource de communication, telle que le port série COM1. Pour les ressources de communication, le paramètre dwCreationDisposition doit être OPEN_EXISTING, le paramètre dwShareMode doit être égal à zéro (accès exclusif)

vous ne pouvez donc pas ouvrir le port COM pour voir l'état de la ligne, tandis qu'un autre processus a le port ouvert pour la communication.

Il existe des moyens de le faire, mais ils impliquent un pilote. SysInternals a le Portmon tool, et une recherche Google va faire apparaître certaines entreprises vendant des logiciels pour le partage d'accès port COM entre les applications, mais l'accès simultané AFAIK est impossible en utilisant l'API standard.

+0

Explication, Merci. Malheureusement, je ne peux pas accéder au niveau du pilote ... mais je peux au moins avoir un handle sur le port qui est déjà ouvert, donc je peux vérifier. –

+0

Encore une réflexion ... est-il un moyen d'essayer de se connecter au port où il va échouer s'il y a déjà une connexion? De cette façon, si elle échoue avec une connexion précédente, ou tout simplement se connecte, je sais qu'il est toujours là. –

+0

Bien sûr, essayez d'ouvrir le port et vérifiez le résultat de GetLastError() en cas d'échec. Cela vous dira si le port est ouvert. Cela ne vous dit pas si l'appareil est toujours connecté. Vous devez avoir un échange de données périodique pour cela, ou utiliser GetCommModemStatus() dans votre autre processus aussi. – mghie

1

Cela semble être une bonne idée d'avoir ce processus qui donnera une notification des événements connectés et déconnectés relayer également les données à l'autre processus. Faites fonctionner votre application en plusieurs couches de sorte qu'il y ait un processus qui prenne le contrôle de la connexion RS232 et envoie vos événements d'application de couche supérieure: connectés, déconnectés, données disponibles, etc

+0

Malheureusement, ce n'est pas une option. Le processus qui utilise réellement la connexion doit avoir un contrôle complet sur la connexion ... longue histoire, mais c'est exactement comme cela qu'elle a été conçue. –

+0

est-il possible de boucler la connexion dans votre propre classe qui effectuera la surveillance et fournira toutes les fonctions que le processus appelle? – ThePosey

+0

non ... malheureusement, il doit être complètement non-intrusif –

0

J'ai fait des applications comme celle-ci et ce n'est pas vraiment un problème spécifique à la langue (sauf si vous n'avez pas d'accès au port série dans votre langue).

Ma solution préférée a toujours été d'avoir un thread par port, selon votre configuration et le thread maintient un état accessible à partir d'un contrôleur quelconque.

La condition par défaut est que le thread interroge le port toutes les quelques secondes et lorsqu'il n'y a pas de réponse, il n'y a pas de périphérique connecté. Une fois qu'un appareil semble répondre, changez l'état pour indiquer qu'il en est ainsi.

J'ai conçu une application qui comportait un certain nombre de files d'attente: une avec des threads déconnectés, une avec des threads connectés mais des threads inactifs et une autre avec des threads connectés et occupés. Le contrôleur a déplacé les threads entre les files d'attente en changeant d'état.