Иногда значение SerialPort.BytesToRead равно 0, когда я проверяю, содержит ли оно данные, но когда мое приложение достигает точки останова несколькими строками позже, я вижу, что оно имеет количество байтов.
Например:
Я записываю некоторые данные в последовательный порт.Затем я вызываю метод для чтения ответа:
var bytes = new List<byte>();
var byteCount = _serialPortWrapper.BytesToRead; // the value 0 is stored in byteCount
while (_serialPortWrapper.BytesToRead > 0) // this is 0, so it doesn't go in here
{
try
{
bytes.Add(_serialPortWrapper.ReadByte());
}
catch (TimeoutException)
{
return null;
}
}
MyPacket packet; // I set a breakpoint here and I can see that data is available
if (MyPacket.TryParse(bytes.ToArray(), out packet))
{
return packet;
}
return null;
Когда я устанавливаю точку останова на ProprietaryPacket packet;
, я вижу, что данные доступны.Фактически, в этот момент, если я перетащу курсор до bytes.Add(_serialPortWrapper.ReadByte());
и снова запустлю, все ожидаемые данные будут заполнены в bytes
, и тогда будет работать ProprietaryPacket.TryParse
.
Как я могусделать так, чтобы BytesToRead
вернул правильное значение в первый раз, а затем сработал метод ReadByte()
?
edit Обратите внимание, если я добавлю Thread.Sleep(500);
перед любым извышеописанное работает, это работает каждый раз.Я не хочу этого делать, потому что это немного хакерство.Есть ли способ обойти это?