SerialPort en mono en Linux no responde al evento DataReceived
serial-port (4)
Tal vez ha cambiado por último, pero hasta donde yo sé, los eventos no se implementan actualmente en el puerto serie de Mono. Tienes que hacer otro hilo de cualquier sabor para leer los datos del puerto serie, lo que sucede de forma bloqueante. Pruébalo y di si funcionó.
Estoy escribiendo una aplicación que usa el puerto serial expuesto por la clase SerialPort en mono. Lo que he escrito hasta ahora funciona perfectamente en Windows, sin embargo, en Linux nunca se ingresa el controlador de eventos DataReceived, por lo que no puedo recibir ningún dato de mi dispositivo. He declarado el controlador de eventos de la siguiente manera:
comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
Básicamente estoy explorando buenas opciones multiplataforma y esto es un factor decisivo. ¿Algún consejo sobre cómo solucionar esto o qué está pasando?
Editar- También debo señalar que he probado el puerto serie y el dispositivo en Linux con otras aplicaciones y que todo parece estar funcionando.
Tengo el mismo problema con SerialPort.DataReceived. El consejo de Konrad.
using System.IO.Ports;
using System.Threading;
namespace Serial2
{
class MainClass
{
public static void Main(string[] args)
{
Thread writeThread = new Thread(new ThreadStart(WriteThread));
Thread readThread = new Thread(new ThreadStart(ReadThread));
readThread.Start();
Thread.Sleep(200); // TODO: Ugly.
writeThread.Start();
Console.ReadLine();
}
private static void WriteThread()
{ // get port names with dmesg | grep -i tty
SerialPort sp2 = new SerialPort("/dev/ttyS5", 115200, Parity.None, 8, StopBits.One);
sp2.Open();
if(sp2.IsOpen)
Console.WriteLine("WriteThread(), sp2 is open.");
else
Console.WriteLine("WriteThread(), sp2 is open.");
sp2.Write(" This string has been sent over an serial 0-modem cable./n"); // /n Needed (buffering?).
sp2.Close();
}
private static void ReadThread()
{
SerialPort sp = new SerialPort("/dev/ttyS4", 115200, Parity.None, 8, StopBits.One);
sp.Open();
if(sp.IsOpen)
Console.WriteLine("ReadThread(), sp Opened.");
else
Console.WriteLine("ReadThread(), sp is not open.");
while(true)
{
Thread.Sleep(200);
if(sp.BytesToRead > 0)
{
Console.WriteLine(sp.ReadLine());
}
}
}
}
}
mono no admite eventos para serialport.
Se muestra en el sitio web de mono
En el blog de Antanas Veiverys puedes encontrar dos formas posibles de resolverlo.
(2012) Ajustando el código fuente mono. http://antanas.veiverys.com/enabling-serialport-datareceived-event-in-mono/
(2013) Al no tocar la fuente mono pero resolver el problema en una clase derivada. http://antanas.veiverys.com/mono-serialport-datareceived-event-workaround-using-a-derived-class/
(2014) Sin embargo, le sugiero que lea la publicación de blog de Ben Voigts, donde ignora el uso del DataReceivedEvent y en su lugar utiliza las funciones BaseStream async BeginRead / EndRead para leer los datos del puerto serie. http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport#comment-840
La implementación y el uso del ejemplo de código dado funciona tanto en Windows / Unix, así que lo he probado. Y es más elegante que usar la función de bloqueo de lectura () de manera enhebrada.