Как получить правильное значение из SerialPort.BytesToRead? - PullRequest
0 голосов
/ 21 марта 2012

Иногда значение 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); перед любым извышеописанное работает, это работает каждый раз.Я не хочу этого делать, потому что это немного хакерство.Есть ли способ обойти это?

Ответы [ 2 ]

0 голосов
/ 21 марта 2012

Значение является правильным во время оценки теста.Между оценкой теста и моментом достижения точки останова, когда вы проверяете значение, данные поступают в буфер.Вот почему он также имеет данные, когда вы делаете Thread.Sleep.

0 голосов
/ 21 марта 2012

Вместо просмотра BytesToRead вы должны подписаться на событие DataReceived.После этого вам будут автоматически звонить при поступлении новых данных.

Если вы не знаете, как это сделать, перейдя по указанной выше ссылке на соответствующую страницу MSDN, вы найдете пример, как подписаться на событиечто вы должны делать внутри него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...