首页 > 解决方案 > SerialPort BaseStream BeginRead 从不调用回调

问题描述

我有一个我知道配置正确的 SerialPort 对象,因为我可以将数据发送到端口并且 DataReceived 事件已正确引发。但是,当我尝试如何更可靠地使用 SerialPort 类中提出的解决方案时,该解决方案建议使用对 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();  

我尝试在打开端口后立即调用 KickoffRead,从 DataReceived 事件和一个单独的线程调用 - 这些都没有任何区别。我还尝试将缓冲区大小更改为 1,认为它正在等待完整的缓冲区 - 不走运。此外,当我尝试停止调试器时,它会挂起并且必须强制终止。

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

标签: c#serial-portbeginread

解决方案


推荐阅读