Mono System.IO.Ports manejo de errores de clase SerialPort
-
03-07-2019 - |
Pregunta
Estoy depurando algún código mono que está utilizando el puerto serie. En algún momento, el mono escribe una tabla con el siguiente código:
// Send the 1024 byte (256 word) CRC table
progressBar = new ProgressBar();
progressBar.Update(0.0,"Sending CRC table...");
for (int i = 0; i < MyCRC.Length; i++)
{
MySP.Write(MyCRC[i].ToString("x8"));
progressBar.Percent = (((Double)(i+1))/MyCRC.Length);
}
progressBar.Update(100.0,"CRC table sent.");
MySP es una instancia de SerialPort. Sin embargo, cuando rastreo este código usando strace, esto es lo que creo que son las llamadas al sistema resultantes:
16620 write(3, "3ab551ce", 8) = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "\0003ab551c", 8) = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "\0\0003ab551", 8) = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "\0\0\0003ab55", 8) = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "\10\0\0\0003ab5", 8) = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "\0\10\0\0\0003ab", 8) = -1 EAGAIN (Resource temporarily unavailable)
...
16620 write(3, "\0005\0\230O+\10\0", 8) = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "E\0005\0\230O+\10", 8) = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "\0E\0005\0\230O+", 8) = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "\0\0E\0005\0\230O", 8) = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "\0\0\0E\0005\0\230", 8) = -1 EAGAIN (Resource temporarily unavailable)
16620 write(3, "4\0\0\0E\0005\0", 8) = 8
16620 write(3, "\230O+\10\0\0\0\0", 8) = 8
16620 write(3, "\0\0\0\0\10\0\0\0", 8) = -1 EAGAIN (Resource temporarily unavailable)
Entiendo que el método SerialPort Write dos no maneja el caso -EAGAIN correctamente y actualiza el índice por -1 antes de reiniciar la escritura. porque después de cada intento, el contenido del búfer original se desplaza en un byte.
Mi pregunta es, ¿es un problema conocido y cómo puedo modificar la clase SerialPort para que se comporte correctamente o usar el puerto serie de forma bloqueada?
El documentación mono para la clase SerialPort no es muy útil
Información adicional: salida mono -V:
Mono JIT compiler version 1.2.6 (tarball)
Copyright (C) 2002-2007 Novell, Inc and Contributors. www.mono-project.com
TLS: __thread
GC: Included Boehm (with typed GC)
SIGSEGV: altstack
Notifications: epoll
Architecture: x86
Disabled: none
Solución
Considere la posibilidad de actualizar a una versión más reciente.
El error se corrigió aquí .
Otros consejos
Tengo una solución alternativa, pero no considero que sea una buena solución:
progressBar = new ProgressBar();
progressBar.Update(0.0,"Sending CRC table...");
for (int i = 0; i < MyCRC.Length; i++)
{
MySP.Write(MyCRC[i].ToString("x8"));
while(WySP.BytesToWrite != 0)
{
;
}
progressBar.Percent = (((Double)(i+1))/MyCRC.Length);
}
progressBar.Update(100.0,"CRC table sent.");