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.