我正在编写一个使用SerialPort类在mono中公开的串口的应用程序。到目前为止我所写的内容在windows中完美无缺,但是在linux中,DataReceived事件处理程序从未输入,所以我无法从我的设备接收任何数据。我已将事件处理程序声明如下:
comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
基本上我正在探索良好的跨平台选项,这是一个交易破坏者。关于如何解决这个或正在发生的事情的任何建议?
编辑 - 我还应该指出,我已经使用其他应用程序测试了linux上的串口和设备,并且所有应用程序似乎都在运行。
答案 0 :(得分:4)
也许它最后发生了变化,但据我所知,Mono的串口当前没有实现事件。你必须制作任何风格的另一个线程来从串口读取数据,这是以阻塞的方式发生的。试一试,告诉它是否有效。
答案 1 :(得分:3)
在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()函数更优雅。
答案 2 :(得分:2)
mono不支持serialport事件。
上答案 3 :(得分:1)
我遇到与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());
}
}
}
}
}