古いVB6MSCommコントロールがシリアルポートと通信する方法と.NetSerialPortがこれを行う方法には、循環的な違いがありますか?

Dec 08 2020

USBケーブルで接続され、COMポートをエミュレートするデバイスがあります。接続を開いた後、古いVB6アプリケーションとMSCommコントロールを使用すると、VB6アプリケーションがデバイスにバイトを送信するたびに、デバイスはバイトを送り返します。

現在、VB6アプリケーションを.Netに移植し、SerialPort通信にクラスを使用しています。port.Write成功した、しかしport.ReadByteに実行しTimeOutException、すべてのthinkableためにReadTimeOut我々の使用。

表面的には、Baudrate、Parityなどのすべての設定は同じです。奇妙なことに、最初に古いVB6アプリケーションを起動して閉じると(デバイスに接続します)、デバイスのプラグを抜いてから再度差し込むまで、.Netコードも機能し始めます。

したがって、何らかの方法で、MSCommコントロールは、SerialPortできない方法でデバイスを起動します。接続を開いて通信を開始するVB6アプリケーションのコードは単純で、C#に変換されています。

ポートモニターを使用して、実際に送信されたデータを確認しました。実際、MSCommコントロールは、実際のデータ転送を開始する前に、より多くの制御バイトをデバイスに送信します。私が識別できた唯一の意味のある違いは、MSCommコントロールがXon Xof、EvtCharなどの他のコントロール文字を使用することです。しかし、これらも調整した後SerialPort(このリンクを参照してください。何も変更されていません。

他に何が起こっている可能性がありますか?ポートを介して送信されたデータをさらに詳しく調査することで、最終的に答えを出す必要がありますか、それともまったく別のことが起こっているのでしょうか。

回答

KenLee Dec 08 2020 at 17:11

MSCommポートが開いていることを確認します(プログラムが初期化されてデバイスと通信するとき)

C#.NETでは、次のようになります。

  serialPort = new SerialPort();

            if (serialPort is SerialPort)
            {
                serialPort.PortName = "COM1";
                serialPort.DataBits = 8;
                serialPort.Parity = Parity.None;
                serialPort.StopBits = StopBits.One;
                serialPort.BaudRate = 9600;

                try
                {
                    serialPort.Open();

/// and other commands

}}