2009-03-09 3 views
1

古い外部モデムからの発信者表示データを収集するための小さなWindows Formsアプリケーションを作成することによって、.Net(3.5)がSystem.IO.Ports.SerialPortsクラスを介してシリアルポートとやりとりする方法について少し勉強しようとしています。System.IO.Ports.SerialPort - IOCTL_SERIAL_SET_WAIT_MASKを構成できますか?

モデムが発信者の表示をサポートしていることをテストしました。パテやハイパーターミナルを使ってモデムを設定して(hereというコマンドAT#CID=1を使用して)発信者の表示データを収集し、電話が鳴ったらデータが表示されます。ターミナルウィンドウで、次のようになります。

RING 

DATE = 0308 
TIME = 2045 
NMBR =

RING 

私のC#アプリケーションが正常にモデムを設定するには、表示されたときに電話が鳴るRING メッセージが表示されます。ただし、発信者IDデータは表示されません。

これがなぜなのかを理解するために、Sysinternals Portmonを使用して、異なるクライアントが行った操作を比較しました。

接続の構成には大きな違いがあります。私のC#アプリケーションには、パテとハイパーターミナルではない次の行が含まれています。

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

私の理解では、IOCTL_SERIAL_SET_WAIT_MASKはのためにフィルタリングするメッセージタイプを含むリストです。

ので、3つの質問:

それは、発信者ID情報がIOCTL_SERIAL_SET_WAIT_MASKによって抑制されていることは可能ですか?

もしそうなら、どのようにして発信者ID情報を表示するように設定できますか?クラスプロパティからアクセスできないようです。

設定できない場合は、自分のラッパーをシリアルポートを制御する下位レベルのシステム機能に書き込むための唯一の選択肢ですか?

私はシリアルポートの通信を理解することは非常に基本的なものなので、私の診断では私は邪魔になると思います。感謝の言葉をいただきました。

+0

あなた自身の質問に答えるうちに、これを最新の状態に保つことができました。 : - D – yeyeyerman

答えて

1

私の診断では途方に暮れていました。

WriteLineメソッドは、自分のモデムが予期している回線ターミネータで送信するコマンドを終了しないようです。

私が送信するコマンドに改行を追加して、Writeメソッドを使用して送信するだけでした。

誰かの時間を無駄にすることに対する謝罪。

+0

ええ、メソッド_serialPort.WriteLine( "at#cid = 1" + System.Environment.NewLine)に改行を追加するのに必要です。 –

0

MSDNのthisは、システムDLLのP/Invoke経由でシリアルポートにアクセスする方法のまともな例のようです。

.Netクラスで問題を解決できるかどうかはまだ分かりますが、

関連する問題