0

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

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

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

我在 Google 上搜索了类似的问题,但我无法找到相关的答案。你知道从哪里开始寻找问题的根源吗?

提前致谢。

这是 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端口的数据。

很抱歉占用您的时间,无论如何感谢您的帮助,您的想法帮助我定位了这个问题。

兄弟,恰巴

4

1 回答 1

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.DtrEnableand之类的参数SerialPort.RtsEnable,看看是否发生了什么,因为这些过去也给我造成了一些非手动错误。


从MSDN中提取的一段代码。

于 2012-05-14T12:19:46.373 回答