在Linux单声道SerialPort没有响应DataReceived事件

我正在编写一个应用程序,使用单声道的SerialPort类公开的串行端口。 到目前为止我所写的内容在windows中是完美的,但是在linux中DataReceived事件处理程序从不input,所以我不能接收任何数据。 我已经声明了事件处理程序如下:

comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived); 

基本上我正在探索良好的跨平台选项,这是一个交易断路器。 任何build议如何解决这个问题或发生了什么?

编辑 – 我也应该指出,我已经testing了与其他应用程序的Linux上的串行端口和设备,似乎都工作。

单声道不支持串口的事件。

它在mono的网站上显示

也许它已经改变了最后,但据我所知,事件目前不在Mono的串口中实现。 你必须使任何味道的另一个线程从串行端口读取数据,这是以阻塞的方式发生的。 试试看,并告诉它是否工作。

在Antanas Veiverys博客上,您可以找到两种解决方法。

(2012)通过调整单声道源代码。 http://antanas.veiverys.com/enabling-serialport-datareceived-event-in-mono/

(2013)通过不触摸单声道源,但解决派生类中的问题。 http://antanas.veiverys.com/mono-serialport-datareceived-event-workaround-using-a-derived-class/

(2014)但是,我鼓励您阅读Ben Voigts博客文章,他忽略了使用DataReceivedEvent,而是使用BaseStream异步BeginRead / EndRead函数从串口读取数据。 http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport#comment-840

实现和使用给定的代码示例在Windows / Unix上工作,所以我测试了。 它比以线程方式使用阻塞式Read()函数更优雅。

我有与SerialPort.DataReceived相同的问题。 康拉德的建议。

 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()); } } } } }