Solo se lee un byte al leer SerialPort recién abierto

Extraño problema.

Cuando leo de com-port conSerialPort.Read(), entonces si llegan datos,solo se lee un byte en la primera llamada, sin tener en cuentacount parámetro y número de bytes disponibles dentro del tiempo de espera. Todas las lecturas adicionales están bien, solo la primera tiene un problema

UtilizandoSerialPort.DiscardInBuffer() o cerrar / abrir (reabrir) puerto comde nuevo causa el problema de la primera lectura.

Aquí hay un 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)
}

El problema no aparece si la cantidad especificada de datos ya está disponible para leer cuandoRead() se llama.

Alguna explicación

Read() Es lectura sincrónica. Volverá cuando se reciba la cantidad de datos especificada o cuando expire el tiempo de espera. Según parece,TimeoutException solo se lanzará si se reciben cero bytes. Si el tiempo de espera expira antes de que se lea la cantidad de datos solicitada, la función devolverá el número de bytes leídos. Por lo tanto, el valor de retorno debe compararse con el solicitado para ver si la lectura fue correcta.

Pero la primera llamada tiene un problema:

Si han llegado 0 bytes durante el tiempo de espera, la primera llamada espera correctamente el tiempo de espera y activa TimeoutException. Si ha llegado al menos 1 byte, la función finaliza inmediatamente, ignorando el tiempo de espera y el número de bytes solicitado para leer por completo.

Así es como lo veo. ¿Me equivoco? ¿Qué tengo que hacer?

Algunas pruebas más. InsertarThread.Sleep() para asegurar que cuandoRead() se llama, habrá todos los datos disponibles, hará que el problema desaparezca.

Lógicamente, agreguemos dormir solo para la primera llamada. Hurra. ¿¿¿¿Qué???? El problema ahora aparece consegunda llamada ysolo segunda llamada. En otras palabras, el problema aparece con elprimero Lea () lo que no tendrá todos los datos disponibles, pero solo una vez.

Respuestas a la pregunta(3)

Su respuesta a la pregunta