У меня есть объект 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, поэтому я обесценил это как источник проблемы.