2

com0com を使用して仮想ポート comA/comB の一部を作成し、ハイパーターミナルから comA に入力を入力し、wpf アプリケーションで comB をリッスンしています。次のコードを (トリガーしてConnect) 実行すると、アプリケーションは正常に接続し、comA からデータを取得できますが、実行するとハングしますDisconnect

    public void Connect()
    {
        readPort = new SerialPort("COMB");
        readPort.WriteTimeout = 500;
        readPort.Handshake = Handshake.None;
        readPort.Open();

        readThread = new Thread(Read);
        readRunning = true;
        readThread.Start();

        System.Diagnostics.Debug.Print("connected");
    }

    public void Disconnect()
    {
        if (!readRunning)
        {
            readPort.Close();
        }
        else
        {
            readRunning = false;
            readThread.Join();
            readPort.Close();
        }
        System.Diagnostics.Debug.Print("disconnected");
    }

    public void Read()
    {
        while (readRunning)
        {
            try
            {
                int readData = 0;
                readData = readPort.ReadByte();
                System.Diagnostics.Debug.Print("message: " + readData.ToString());
            }
            catch (TimeoutException)
            {
            }
        }
    }

を使用して読み取り関数を書き込みに変更してみました

byte[] writeData = { 1, 2, 3 };
readPort.Write(writeData, 0, 3);

の代わりにport.readbyte、切断すると完全に機能し始めます。readbyteフリーズを引き起こした可能性のある何かが違うかどうかは誰にも分かりますか? それとも、com0com に関連している可能性がありますか?

4

1 に答える 1

1

誰かが同じ問題に遭遇した場合に備えて、もう一度確認すると、次のようにオーバーライドする別の方法が見つかりましたSerialPort.DataReceived

    public override void OnDataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        byte[] buf = new byte[sp.BytesToRead];
        sp.Read(buf, 0, buf.Length);
        receivedDataDel(buf);
    }
于 2014-12-18T15:18:11.237 に答える