2009-03-09 6 views
1

J'ai essayé d'apprendre un peu comment .Net (3.5) interagit avec le port série via la classe System.IO.Ports.SerialPorts en écrivant une petite application Windows Forms pour rassembler les données d'affichage de l'appelant à partir d'un ancien modem externe.System.IO.Ports.SerialPort - est-il possible de configurer IOCTL_SERIAL_SET_WAIT_MASK?

J'ai testé que le modem prend en charge l'affichage de l'appelant; en utilisant Putty ou Hyperterminal Je peux configurer le modem pour collecter des données d'affichage appelant (en utilisant la commande AT#CID=1, que j'ai trouvé here), et quand le téléphone sonne, les données sont affichées. Dans la fenêtre de terminal, il ressemble à ceci:

RING 

DATE = 0308 
TIME = 2045 
NMBR =

RING 

Mon application C# semble configurer correctement le modem et affiche un message lorsque RING le téléphone sonne; cependant, il n'affiche jamais les données d'identification de l'appelant. Dans un effort pour comprendre pourquoi, j'ai comparé les actions prises par les différents clients en utilisant Sysinternals Portmon.

La différence principale apparaît dans la configuration de connexion; mon application C# comprend la ligne suivante, que Putty et Hyperterminal ne font pas;

0.00000307 callerID.exe IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR RXFLAG CTS DSR RLSD BRK ERR RING 

Si je comprends bien, IOCTL_SERIAL_SET_WAIT_MASK est une liste exhaustive des types de messages pour filtrer.

Ainsi, trois questions:

Est-il possible que l'information d'identification est supprimée par IOCTL_SERIAL_SET_WAIT_MASK?

Si oui, comment puis-je le configurer pour afficher les informations d'identification de l'appelant? Il ne semble pas être accessible à partir des propriétés de classe.

Si je ne peux pas le configurer, est-ce que ma seule option est de contourner ceci pour écrire mon propre wrapper aux fonctions du système de bas niveau contrôlant le port série?

Ma compréhension des communications par port série est très basique, donc je m'attends à ce que je sois dans mon diagnostic. Toute directive reçue avec gratitude.

+0

Vous avez fait un très bon travail en gardant cela à jour tout en répondant à votre propre question! :-D – yeyeyerman

Répondre

1

J'étais loin de mon diagnostic.

Il semble que la méthode WriteLine ne termine pas les commandes qu'il envoie avec la terminaison de ligne attendue par mon modem.

Tout ce que je devais faire était d'ajouter un retour chariot aux commandes que j'envoie, et de les envoyer en utilisant la méthode Write.

Toutes nos excuses pour avoir perdu du temps.

+0

Oui, il est nécessaire d'ajouter newline dans la méthode _serialPort.WriteLine ("at # cid = 1" + System.Environment.NewLine); –

0

Je trouve this sur MSDN qui ressemble à un exemple de bonne façon d'accéder au port série via P/Invoke sur de la dll système.

Je voudrais toujours savoir si je peux contourner mes problèmes avec la classe .Net.

Questions connexes