串口DataReceived事件不会触发

时间:2012-05-14 11:54:04

标签: c# .net serial-port

我正在处理一个处理串口通信的应用程序。它是一个WPF,多线程应用程序。一切都很顺利,直到我通过COM端口只通过通信发送小包。

没有我到达阶段,我必须在COM端口上监听发送到我的应用程序的数据。对于这一大块数据,我遇到了麻烦。我只触发了一个DataReceived事件,它读取了我需要的部分数据。但在此之后,没有针对其余数据触发DataReceived事件。

如果我监视COM端口,我看到字节在那里,监视软件指出,队列中有2067个字节,但事件不会触发。

我在谷歌搜索类似的问题,但我无法找到相关的答案。您是否知道从哪里开始搜索问题的根源。

提前致谢。

以下是DataReceived处理程序的代码:

        private void comPort_DataReceived( object sender, SerialDataReceivedEventArgs e )
    {
        do
        {
            new Thread(() =>
            {
                OnReceivingData(new ComPortCommunicationEventArgs(DataTransferDirections.Receiving, DataTransferActions.Start));
            }).Start();
            byte[] packetData = null;
            try
            {
                IsReceiving = true;
                int bytesToReadCount = comPort.BytesToRead;
                if ( bytesToReadCount == 0 )
                {
                    return;
                }

                packetData = new byte[bytesToReadCount];
                comPort.Read(packetData, 0, bytesToReadCount);
            }
            finally
            {
                IsReceiving = false;
                new Thread(() =>
                {
                    OnReceivingData(new ComPortCommunicationEventArgs(DataTransferDirections.Receiving, DataTransferActions.End));
                }).Start();
            }
            OnPacketReceived(new PacketReceivedEventArgs(comPort.PortName, packetData.ToList()));
        } while ( comPort.BytesToRead > 0 );
    }

我同时发现,如果我注释掉OnPacketReceived调用 - 它只是触发带有接收数据的UI事件 - 比数据处理工作正常。所以这不是我认为的COM端口通信错误......

更新

我找到了解决问题的方法。它与串口处理无关。 在我的一个数据处理线程中,我遇到了一个循环,它应该在成功处理时完成,但是由于数据不足,它只是连续运行。这样做就阻止了DataReceived事件处理程序 - 这仍然不能完全清楚我的原因,因为这两个进程应该在我想要的不同线程上。但似乎我错了。

无论如何,我更正了处理方法,并且没有从serisl端口接收数据。

很抱歉花时间,感谢您的帮助,无论如何,您的想法帮助我解决了这个问题。

BR, 乔鲍

2 个答案:

答案 0 :(得分:3)

5年前我在COM端口工作,我知道它有时会变得多么棘手。我以前使用的西门子设备发生了各种棘手的问题:)

首先,我无法彻底遵循您的代码,所以我无法确定您的DataReceived例程是否合理。我建议您尝试将comPort_DataReceived中的所有代码替换为非常简单的代码,仅用于测试目的。

private static void comPort_DataReceived(
                    object sender,
                    SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    Console.WriteLine("Data Received:");
    Console.Write(indata);
}

如果它仍然不起作用,则问题不在您的代码中。如果你不知道还有什么可以尝试,我会搞砸SerialPort.DtrEnableSerialPort.RtsEnable之类的参数,看看是否有什么事情发生,因为这些也导致了一些不在我手册的错误在过去。


MSDN中提取的一段代码。

答案 1 :(得分:0)

串行类本身似乎没有问题。 唯一的问题是MSDN教程。 通过更改

Console.WriteLine("Data Received:");
Console.Write(indata);

Console.WriteLine("Data Received:");
Console.WriteLine(indata);

据我所知,问题出在线程中断和串行中断的冲突上