2011-09-12 64 views
3

我寫一個使用在單SerialPort類暴露串行端口的應用程序。什麼我至今寫的作品在Windows完美,但是在Linux中從未進入過DataReceived事件檢索處理程序,所以我不能接收任何數據形成我的設備。我已宣佈事件處理程序如下:的SerialPort單聲道在linux不響應DataReceived事件檢索

comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived); 

基本上我正在探索良好的跨平臺選項,這是一個交易斷路器。任何建議如何解決這個問題或發生了什麼?

編輯- 我還應該指出,我已經測試了與其他應用程序在Linux上的串行端口和設備,似乎都工作。

+1

的可能重複[C#串口問題 - 太簡單了,失敗了,但(http://stackoverflow.com/questions/5727473/c-serial-port-problem-too-simple-to-fail-but) – skolima

+0

沒錯,這就是我有同樣的問題。 – Frac

回答

4

也許它已經改變了最後,但據我所知,事件目前沒有在Mono的串行端口來實現。你必須使任何風格的另一個線程從串口讀取數據,這是以阻塞的方式發生的。試試看,並告訴它是否工作。

+1

怎麼樣固定單觸發事件?它可能會涉及較少的工作,會使少哈克代碼 – knocte

1

我有Seri​​alPort.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()); 
       } 
      } 
     } 
    } 
} 
3

在安塔納斯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異步的BeginRead/EndRead功能從串口讀取數據。 http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport#comment-840

實現和使用給定的代碼示例工作在Windows/Unix上,所以我測試了。它比以線程方式使用阻塞式Read()函數更優雅。

相關問題