SerialPort в моно в Linux не отвечает на событие DataReceived - PullRequest
3 голосов
/ 13 сентября 2011

Я пишу приложение, которое использует последовательный порт, предоставляемый классом SerialPort, в моно. То, что я написал до сих пор, прекрасно работает в Windows, однако в Linux обработчик событий DataReceived никогда не вводится, поэтому я не могу получить данные с моего устройства. Я объявил обработчик событий следующим образом:

    comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);

По сути, я изучаю хорошие кроссплатформенные варианты, и это очень важно. Любой совет, как это исправить или что происходит?

Edit- Я также должен отметить, что я протестировал последовательный порт и устройство на Linux с другими приложениями, и все, кажется, работает.

Ответы [ 4 ]

4 голосов
/ 13 сентября 2011

Возможно, оно изменилось в последнюю очередь, но, насколько я знаю, события в настоящее время не реализованы в последовательном порту Mono. Вы должны создать другой поток в любом варианте для чтения данных с последовательного порта, что происходит в режиме блокировки. Попробуйте и скажите, сработало ли это.

3 голосов
/ 17 сентября 2015

В блоге 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) Тем не менее, я призываю вас прочитать сообщение в блоге Бена Фойгта, где он игнорирует использование DataReceivedEvent и вместо этого использует функции BaseStream async BeginRead / EndRead для чтения данных из последовательного порта. http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport#comment-840

Реализация и использование данного примера кода работает как в Windows / Unix, так что я проверил. И это более элегантно, чем использование блокирующей функции Read () в многопоточном режиме.

2 голосов
/ 20 июня 2013

mono не поддерживает событие для последовательного порта.

Отображается на сайте mono

1 голос
/ 17 октября 2011

У меня такая же проблема с 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());
                }
            }
        }
    }
}
...