【问题标题】:application hangs when closing a listening port关闭侦听端口时应用程序挂起
【发布时间】:2014-09-24 22:26:20
【问题描述】:

我正在使用 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有关?

【问题讨论】:

  • 你是如何声明 readRunning 的?
  • Disconnect,在加入读线程之前尝试关闭端口。

标签: c# multithreading com0com


【解决方案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);
    }

【讨论】:

  • 为了后代,您可以包含代码吗?
  • 优秀。但是,我并不完全清楚这与之前的代码有何关系。这是您添加并附加到某处的新处理程序,还是会在您的原始代码中引用它,但不是您在原始帖子中包含的位?此外,您可以接受自己的帖子作为答案。
  • 我在代码中添加了port.DataReceived += OnDataReceived,而不是使用port.readbyte
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多