c# - 应用程序在关闭监听端口时挂起

标签 c# multithreading com0com

我正在使用 com0com 创建虚拟端口 comA/comB 的一部分,从 super 终端向 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 有关?

最佳答案

只是回顾一下,以防万一有人遇到同样的问题,我发现了另一种覆盖 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);
    }

关于c# - 应用程序在关闭监听端口时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26027584/

相关文章:

c# - 客户端收到时从服务器返回的字节数组不同

c# - Entity Framework - 无法创建类型的常量值

c# - 为什么 c# 不保留匿名委托(delegate)调用的上下文?

linux - 适用于 Linux 的零调制解调器仿真器 (com0com)

c# - DispatcherTimer - 如果前一个滴答仍在运行,则防止触发滴答事件

c# - 我怎样才能在 WinForms 应用程序中捕获所有 'unhandled' 异常?

java - java中线程的等待列表

c++ - 如何将并发解决方案应用于类似生产者-消费者的情况

winapi - com0com 虚拟端口未找到

c# - 在真实和虚拟串行端口之间创建一对