現在私の大学では、これらの古い 56k モデム間で通信を行っています。PC からモデムへのメッセージはシリアル ポートを経由するので、System.IO.Ports.SerialPort .NET クラスを使用することを考えました。
モデムと通信し、他のモデムにダイヤルし、それらを介して通信するためのかなり大きな C# アプリケーションを作成しました。2 つのモデム間の接続を確立するまでは、すべて正常に機能していました。これが起こると、両方のモデムが (当然のことながら) COMMAND モード (Hayes のコマンドをモデムに送信できる) から DATA モード (モデムに送信したすべてのデータが他のモデムに転送される) に切り替わります。
私のアプリケーションは、シリアルポートから物事を受信するだけでなく、物事を送信することもできます。接続されている両方の PC にインストールされます。しかし、アプリケーションに「Hello」などと入力すると、反対側で受信されません。そして、ここに奇妙な部分があります。シリアル ポートを介してメッセージを送信する方法を次に示します (「ポート」は SerialPort クラスのインスタンス、「データ」は文字列のインスタンスです)。
port.Write(data);
それでうまくいきます。それは働かなければなりません。特に、アプリケーションを一方に送信し、もう一方に PuTTy を使用すると、うまくいきます。有効なシリアル ポートに接続された PuTTy がメッセージを受信します。また、メッセージが最初のモデムに届くだけではないことも暗示しています。ネットワーク経由で他のモデムに送信され、他のモデムはシリアル ポートを介して受信 PC に送信します。しかし、それだけではありません。アプリケーションを使用して受信する場合、次のように SerialPort.DataReceived イベントを使用します (もちろん、メソッドはイベント ハンドラーに += されています)。
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//this message box should pop up if event hit:
MessageBox.Show("Data from serial port received!");
//calling my method to handle incoming message
DataReceived((SerialPort)sender);
}
また、モデム (受信 PC に接続されているもの) が COMMAND モードの場合に機能します。たとえば、「AT」Hayes のコマンドをモデムに送信すると (これは「ping」以外の何物でもありません)、モデムは「OK」と応答し、それを受信します。SerialPort.DataReceived イベントが発生します。しかし、このモデムが DATA モードの場合 (Hayes のコマンドを送信できない場合)、送信側モデムからメッセージを受信し、それをシリアル ポートに転送しますが、何もしません。イベントも発生しません。よく確認しました。
それは奇妙だ!
これは、モデムがメッセージをシリアルポートに送信する方法が、DATA モードと COMMAND モードでわずかに異なり、PuTTy が何らかの方法でそれを理解し、SerialPort クラスが理解していないという結論に達するだけです。
私は本当にこれを理解していません。