2017-02-07 10 views
0

おはよう、シリアルポートからコードを読み取っていません

私はxsheeのxbeeモジュールからいくつかの文字列を読みとろうとしました。 しかし、私のコードは、シリアルポートがイベントハンドラに達すると開いていないことを伝え続けます。どんな助けでも大いに評価されるでしょう。おかげstring display = myserial.ReadLine();

Operation Exception

using System; 
using System.Management; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO.Ports; 
namespace ConsoleApplication2 
{ 
    class Program 
    { 
     public static SerialPort myserial = new SerialPort(); 
     public string display; 
     static void Main(string[] args) 
     { 
      string[] ports = SerialPort.GetPortNames(); 
      foreach (string p in ports) 
      { 
       Console.WriteLine(p); 
      } 
      SerialPort myserial = new SerialPort(); 

      myserial.BaudRate = 9600; 
      myserial.Parity = Parity.None; 
      myserial.StopBits = StopBits.One; 
      myserial.DataBits = 8; 
      myserial.Handshake = Handshake.None; 
      myserial.RtsEnable = true; 
      myserial.DtrEnable = true; 
      myserial.ReadTimeout = 100000; 
      myserial.PortName = "COM3"; 
      myserial.ReadTimeout = 10000; 
      myserial.DataReceived += new SerialDataReceivedEventHandler(DataRecievedHandler); 
      myserial.Open(); 
      if (myserial != null) 
      { 
       if (myserial.IsOpen) 
       { 
        Console.WriteLine("connected"); 
       } 
      } 
      Console.ReadLine(); 
     } 
    static void DataRecievedHandler(object sender, SerialDataReceivedEventArgs e) 
     { 
      string display = myserial.ReadLine(); 
     } 

    } 
} 
+0

は全く意味がありません。それで、あなたが例外を受ける理由です。そのステートメントを削除します。このプログラムは*決して* Close()を呼び出す必要があります。どちらがうまくいけば、ファイナライザはそれを処理します。 –

+0

ありがとう@HansPassantは今それを試みます。 – don

+0

@HansPassantはそれをやっても同じ例外が出ます – don

答えて

0

はあなたの問題は、あなたのコード内のあいまいさを持っているということです。 2同じ名前の変数。

あなたがメインの外に宣言するクラス変数:

class Program 
{ 
    public static SerialPort myserial = new SerialPort(); 

とmainメソッド内の変数:

static void Main(string[] args)   
{ 
    SerialPort myserial = new SerialPort(); 

メソッド内で、コンパイラは、ローカル変数myserialがかかります。あなたはそれを開いてイベントを登録します:

myserial.DataReceived += new SerialDataReceivedEventHandler(DataRecievedHandler); 

これまでのところすべてが問題ありません。しかし、Mainメソッドの外にはこのSerialPort myserialはありますではなくがあります。つまり、DataRecievedHandlerメソッド内のmyserialにアクセスしようとすると、コンパイラはクラスレベルの最初の変数を意味すると「考える」ことを意味します。しかし、このSerialPortは一度も開かれていません!したがって、エラーが発生します。

イベント内でsenderオブジェクトを使用して解決できます。以来、オープンSerialPort火災このイベント:

static void DataRecievedHandler(object sender, SerialDataReceivedEventArgs e) 
{ 
    SerialPort port = sender as SerialPort; 

    if(port != null) 
    {  
     string display = port.ReadLine(); 
    } 
} 

注:この変数displayDataRecievedHandlerメソッド内にのみ存在します。メインでは使用できません。あなたはそれをもう一度宣言するからです。これはクラスレベルで宣言したものと同じではないローカル変数です!それを作る

を::stringを削除し、クラスレベルの変数が使用されます

display = port.ReadLine(); 

2.

あなたは、単に内SerialPort myserial変数の宣言を除去することによって、それを解決することができますMain方法。おそらく単純だろう;) ちょうどMainメソッド内でこの行を削除:DataReceivedイベントハンドラで)(閉じる呼び出す

SerialPort myserial = new SerialPort(); 
関連する問題