3

C# の仮想シリアル ポートに問題があります。Write 関数を呼び出すと、TimeOutException が自動的にスローされますが、クライアントはデータを受信します。

仮想ポートでのみ発生します(ブリッジCOM12 <-> COM13で、HDDSoftwareの無料仮想シリアルポートを使用しています)。Visual Studio で COM12 を開き、Hercules で COM13 を開きます。アプリケーションはタイムアウト例外をスローしますが、Hercules はメッセージを受け取ります。

読み取り/書き込みポートのタイムアウトを 1000ms に設定するか 1000000ms に設定するかは問題ではありません。

ありがとう!!

        using (SerialPort port = new SerialPort("COM13"))
        {
            // configure serial port
            port.BaudRate = 9600;
            port.DataBits = 8;
            port.Parity = Parity.None;
            port.StopBits = StopBits.One;
            port.Open();

            port.ReadTimeout = 10000;

            byte[] buffer = Encoding.ASCII.GetBytes("HELLO WORLD");

            try
            {
                port.Write(buffer, 0, buffer.Length);
            }
            catch(TimeoutException)
            {
                Console.WriteLine("Write timeout");
            }

            Console.WriteLine(DateTime.Now.ToString("HH:mm:ss"));
            try
            {
                byte[] buf = new byte[100];
                port.Read(buf, 0, 1);
            }
            catch(IOException)
            {
                Console.WriteLine("Read timeout");
            }
            Console.WriteLine(DateTime.Now.ToString("HH:mm:ss"));
        }

いくつかのテスト (Write を try-catch に入れる) の後、Read 操作も即座に TimeOutException をスローします。

これは、テストを実行したときに得られるものです。12:16:06 (読み取りタイムアウト) 12:16:16

ここに画像の説明を入力

4

2 に答える 2

2
   port.Write(buffer, offset, count);

これを実装する方法を決定するのは、デバイス ドライバ次第です。しかし、私が知っているものはすべて、基になるWriteFile()呼び出しが *lpNumberOfBytesWritten < nNumberOfBytesToWrite を返すことが許可されているという規則に従っています。別の言い方をすれば、書き込みは「トランザクション」ではありません。

適切なメンタル モデルは、Write() がバッファから一度に1バイトをcount回書き込むというものです。ある時点で、ドライバーの送信バッファーが容量いっぱいになり、別のバイトを格納できなくなったときに、もう 1 バイト書き込むと完全に予測できなくなります。最終的に例外をトリガーします。

そのため、バッファの一部はまだ反対側に到達します。SerialPort クラスのどの部分かわかりません。タイムアウトは、回復がかなり困難な重大な通信障害です。それがショーストッパーである場合は、一度に 1 バイトずつ書き込むことを検討するか (シリアル ポートは低速です)、WriteBufferSize - BytesToWrite に注意して、バッファーが収まるかどうかを確認し、独自のタイムアウトを実装する必要があります。

于 2014-08-22T15:20:18.557 に答える
0

Hans Passant が言ったように、これは Virtual COM ソフトウェアの問題でした。Eltima Software の仮想シリアル ポートを試してみたところ、問題なく動作しました。

于 2014-08-22T19:36:38.273 に答える