2011-09-12 60 views
3

SerialPortクラスで公開されているシリアルポートをモノで使用するアプリケーションを作成しています。これまでに書いたことは、Windowsでは完璧ですが、LinuxではDataReceivedイベントハンドラが入力されることはありません。そのため、自分のデバイスからデータを受け取ることはできません。基本的に私は良いクロスプラットフォームの選択肢を模索していますシリアルポートがLinuxのmonoでDataReceivedイベントに応答していない

comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived); 

、これは契約ブレーカで次のように私は、イベントハンドラを宣言しました。これを修正する方法や何が起こっているのかアドバイスしてください。

編集- シリアルポートとデバイスをLinux上で他のアプリケーションと一緒にテストしたところ、すべてが動作しているようです。

+1

[C#シリアルポートの問題 - 重すぎて失敗する可能性がありますが、(http://stackoverflow.com/questions/5727473/c-serial-port-problem-to-simple-to-fail-but) – skolima

+0

はい、これは私が持っているのと同じ問題です。 – Frac

答えて

2

monoはシリアルポートのイベントをサポートしていません。

あなたがそれを解決するには、2つの可能な方法を見つけることができAntanas Veiverysのブログでmono's website

+0

あなたが記述したページへのリンクを含むことは素晴らしいことです。 – taiansu

4

おそらく最後に変更されているかもしれませんが、私の知る限り、イベントは現在Monoのシリアルポートで実装されていません。シリアルポートからデータを読み取るには、別のスレッドを作成しなければなりません。それを試して、効果があるかどうかを教えてください。

+1

イベントを発生させるMonoの修正はどうですか?おそらく仕事が少なくて済み、ハッキーなコードが少なくなるでしょう。 – knocte

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

に示されています。

(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機能を使用ベンVoigtsのブログ記事を読むことをお勧めします。 http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport#comment-840

与えられたコードサンプルを実装して使用することは、両方のWindows/Unixで動作するので、私はテストしました。スレッド化された方法でBlocking Read()関数を使用するよりも洗練されています。

関連する問題