古いVB6MSCommコントロールがシリアルポートと通信する方法と.NetSerialPortがこれを行う方法には、循環的な違いがありますか?
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
(このリンクを参照してください。何も変更されていません。
他に何が起こっている可能性がありますか?ポートを介して送信されたデータをさらに詳しく調査することで、最終的に答えを出す必要がありますか、それともまったく別のことが起こっているのでしょうか。
回答
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
}}