SerialPort BaseStream BeginRead永远不会调用回调

时间:2018-11-16 17:05:09

标签: c# serial-port beginread

我有一个正确配置的SerialPort对象,因为我可以将数据发送到端口,并且DataReceived事件已正确引发。但是,当我尝试使用How to use SerialPort class more reliably中提出的解决方案(建议使用对BeginRead的调用而不是DataReceived事件)时,我的异步回调从未被调用,对BeginRead的调用似乎“挂起”。

        byte[] buffer = new byte[4096];

        void KickoffRead()
        {
            _serialPort.BaseStream.BeginRead(buffer, 0, buffer.Length, delegate (IAsyncResult ar)
            {
                try
                {
                    var actualLength = _serialPort.BaseStream.EndRead(ar);
                    var received = new byte[actualLength];
                    Buffer.BlockCopy(buffer, 0, received, 0, actualLength);
                    DataReceived?.Invoke(received);
                }
                catch (IOException)
                {
                    // nothing yet
                }

                KickoffRead();
            }, null);
        }

        KickoffRead();  

我尝试在打开端口后立即从DataReceived事件以及单独的线程中调用KickoffRead,这都没有任何区别。我还尝试过将缓冲区的大小更改为1,以为它正在等待缓冲区已满-没运气。此外,当我尝试停止调试器时,它会挂起,必须强制终止。

我正在使用虚拟串行端口(免费的虚拟串行端口软件)进行测试,但是当我使用DataReceived而不是BeginRead时,它的效果很好,所以我认为这是问题的根源。

0 个答案:

没有答案