随机时间过后,接收到的C#串行端口数据无法触发

本文关键字:数据 串行端口 时间 随机 | 更新日期: 2023-09-27 18:26:05

我使用Visual Studio C#WPF SerialPort类使用USB电缆和驱动程序与微控制器通信。

我想连续读取COM端口的输入。

这是我目前的实现方式:

public SerialConnectionHandler()
{
        port = new SerialPort("COM3");
        port.BaudRate = 9600;
        port.Parity = Parity.None;
        port.StopBits = StopBits.One;
        port.Handshake = Handshake.None;
        port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
        port.Open();
}
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    String indata = port.ReadLine();
    Debug.WriteLine(indata);
    processInput(inputData);
    if (port.IsOpen) Debug.WriteLine("--Port is Open--");
}

在一段未指定的时间后,我的输出控制台报告至少有5个线程以代码0结束。这有时需要几秒钟、几分钟甚至更长的时间。

我无法重现这个问题。

端口设置匹配。

Datareceived called
--Port is Open--
Datareceived called
--Port is Open--
Datareceived called
--Port is Open--
Der Thread 0xbb4 hat mit Code 0 (0x0) geendet.
Datareceived called
--Port is Open--
Datareceived called
--Port is Open--
Datareceived called
--Port is Open--
Datareceived called
--Port is Open--
Datareceived called
--Port is Open--
Datareceived called

线程结束是随机发生的,但在某一点上,会发生许多线程结束报告。从现在起将不再触发该事件。

据报道,就在这种情况发生之前,该端口已打开。

--Port is Open--
Datareceived called
--Port is Open--
Datareceived called
--Port is Open--
Der Thread 0x3bc hat mit Code 0 (0x0) geendet.
Der Thread 0x2f54 hat mit Code 0 (0x0) geendet.
Der Thread 0x2ea0 hat mit Code 0 (0x0) geendet.
Der Thread 0x1a6c hat mit Code 0 (0x0) geendet.
Der Thread 0x308 hat mit Code 0 (0x0) geendet.
Der Thread 0x2b0c hat mit Code 0 (0x0) geendet.
Der Thread 0x7fc hat mit Code 0 (0x0) geendet.

随机时间过后,接收到的C#串行端口数据无法触发

所以我注意到我也遇到了同样的问题。DataReceived在一个项目上运行得很好,正如预期的那样,但在另一个项目——这个问题上。

事实证明,格洛林是对的。运行应用程序几秒钟后,我看到的The thread 0xc28 has exited with code 0是因为我将所有这些代码保存在一个单独的类USBCommunicationManager中,从我的窗口类(我使用的是WPF)调用,如下所示:

new USBCommunicationManager(this);

我只是简单地初始化它,而不是将它分配给任何变量,这就是为什么垃圾收集器后来将它捡起来并结束串行读取线程。只是这样改变,解决了问题:

USBCommunicationManager usbCommunicationManager;
..
..
usbCommunicationManager = new USBCommunicationManager(this);