System.IO.Ports.SerialPort-IOCTL_SERIAL_SET_WAIT_MASKを構成できますか?
-
06-07-2019 - |
質問
.Net(3.5)が収集する小さなWindowsフォームアプリケーションを記述することにより、 System.IO.Ports.SerialPorts
クラスを介してシリアルポートと対話する方法について少し学習しようとしています。発信者は古い外部モデムからデータを表示します。
モデムが発信者の表示をサポートしていることをテストしました。 PuttyまたはHyperterminalを使用して、発信者の表示データを収集するようにモデムを構成できます(コマンド AT#CID = 1
を使用します。こちら)、電話が鳴るとデータが表示されます。端末ウィンドウでは、次のようになります。
RING
DATE = 0308
TIME = 2045
NMBR = 01234567890
RING
私のC#アプリケーションは、モデムを正常に構成しているように見え、 RING
を表示します
電話が鳴ったときのメッセージ。ただし、発信者IDデータは表示されません。
これがなぜなのかを理解するために、Sysinternals Portmon 。
主な違いは接続構成に現れます。私のC#アプリケーションには、PuttyとHyperterminalにはない次の行が含まれています。
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つの質問:
IOCTL_SERIAL_SET_WAIT_MASK
によって発信者ID情報が抑制されている可能性はありますか?
もしそうなら、どのように発信者ID情報を表示するように設定できますか?クラスプロパティからアクセスできないようです。
設定できない場合、シリアルポートを制御する低レベルのシステム関数に独自のラッパーを書き込むためにこれを回避する唯一のオプションはありますか?
シリアルポート通信についての私の理解は非常に基本的なものであるため、診断にはかなり時間がかかると思います。ありがたいことに指導を受けました。
解決
私は診断がうまくいかなかった。
WriteLine
メソッドは、送信するコマンドを、モデムが予期しているラインターミネータで終了させないようです。
必要なのは、送信するコマンドにキャリッジリターンを追加し、 Write
メソッドを使用して送信することだけです。
時間を無駄にすることをおologiesびします。
他のヒント
適切な例のように見えるこれがMSDNで見つかりましたシステムdllのP / Invokeを介してシリアルポートにアクセスする方法の説明。
.Netクラスの問題を回避できるかどうかを引き続き知りたい。