Apenas um byte é lido ao ler o SerialPort agora aberto

Problema estranho.

Quando eu leio de com-port comSerialPort.Read(), se os dados chegarem,apenas um byte é lido na primeira chamada, desconsideracount parâmetro e número de bytes disponíveis dentro do tempo limite. Todas as leituras adicionais estão ok, apenas a primeira tem problema

UsandoSerialPort.DiscardInBuffer() ou fechar / abrir (reabrir) a portanovamente causar o problema da primeira leitura.

Aqui está um código:

var port = new SerialPort();
port.PortName = "com2";
port.BaudRate = 9600;
port.WriteTimeout = 1000;
port.ReadTimeout = 1000;
port.Open();

// ... send some data first

var read = new byte[10];
if (port.Read(read, 0, read.Length) != read.Length)
{
    // always here at first reading no matter what
}

// ... send some data again

if (port.Read(read, 0, read.Length) != read.Length)
{
    // not here anymore (unless error)
}

O problema não aparece se uma quantidade especificada de dados já estiver disponível para leitura quandoRead() é chamado.

Alguma explicação.

Read() é uma leitura síncrona. Ele retornará quando a quantidade especificada de dados for recebida ou o tempo limite expirar. Como parece,TimeoutException será lançado apenas se zero bytes forem recebidos. Se o tempo limite expirar antes da leitura da quantidade solicitada de dados, a função retornará o número de bytes lidos. Portanto, o valor de retorno deve ser comparado ao solicitado para verificar se a leitura foi boa.

Mas a primeira chamada tem um problema:

Se chegarem 0 bytes durante o tempo limite, a primeira chamada esperará corretamente pelo tempo limite e acionará TimeoutException. Se pelo menos 1 byte chegou, a função termina imediatamente, ignorando o tempo limite e o número de bytes solicitado para leitura total.

É assim que eu vejo. Estou errado? O que devo fazer?

Mais alguns testes. InserindoThread.Sleep() para garantir que quandoRead() é chamado, haverá todos os dados disponíveis, fará com que o problema desapareça.

Logicamente, vamos adicionar o sono apenas para a primeira chamada. Yay. O que???? O problema agora aparece comsegunda chamada eapenas segunda chamada. Em outras palavras, o problema aparece com oLeia primeiro () o que não terá todos os dados disponíveis, mas apenas uma vez.

questionAnswers(3)

yourAnswerToTheQuestion