SerialPort BaseStream BeginRead никогда не вызывает обратный вызов - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть объект 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, думая, что он ждет полного буфера - не повезло.Кроме того, когда я пытаюсь остановить отладчик, он зависает и должен быть принудительно прерван.

Я выполняю тестирование с использованием виртуальных последовательных портов (программное обеспечение Free Virtual Serial Ports), но это прекрасно работает, когда я использовал DataReceived вместоBeginRead, поэтому я обесценил это как источник проблемы.

...