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

时间:2011-09-12 20:45:56

标签: linux mono serial-port

我正在编写一个使用SerialPort类在mono中公开的串口的应用程序。到目前为止我所写的内容在windows中完美无缺,但是在linux中,DataReceived事件处理程序从未输入,所以我无法从我的设备接收任何数据。我已将事件处理程序声明如下:

    comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);

基本上我正在探索良好的跨平台选项,这是一个交易破坏者。关于如何解决这个或正在发生的事情的任何建议?

编辑 - 我还应该指出,我已经使用其他应用程序测试了linux上的串口和设备,并且所有应用程序似乎都在运行。

4 个答案:

答案 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事件。

显示在mono's website

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