2012-01-05 14 views
0

2つのボタンがあります。ボタン接続(オープンcomポート)&切断(ポートを閉じる)。接続ボタンをクリックすると、タイマは数秒ごとにCOMポートからListboxのデータを表示します。&切断をクリックしてもう一度「接続」ボタンをクリックすると、データはリストボックスに表示されず、タイマーはトリガーされません。どうしてこんなことに?ここでCOMポートからリストボックスにデータを表示

は私のコードです:

List<byte> buffer = new List<byte>(125); 
    private void btnConnect_Click(object sender, EventArgs e) 
    { 

     if (serialPortN.IsOpen) 
      serialPortN.Close(); 
     try 
     { 
      { 

       serialPortN.PortName = "COM8"; 
       serialPortN.BaudRate = 9600; 
       serialPortN.Parity = Parity.None; 
       serialPortN.DataBits = 8; 
       serialPortN.StopBits = StopBits.One; 
       serialPortN.Encoding = System.Text.Encoding.ASCII; 
       serialPortN.ReadTimeout = 500; 
      } 

      serialPortN.Open(); 
      label1.Text = "COM8" + " is opened"; 


      System.Timers.Timer timer = new System.Timers.Timer(); 
      timer.Interval = 5000; 
      timer.Elapsed += new ElapsedEventHandler(TimerElapsed); 
      timer.Start(); 

      serialPortN.DataReceived += new SerialDataReceivedEventHandler(datareceived); 


      btnDisconnect.Enabled = true; 
      btnConnect.Enabled = false; 

     } 

     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message.ToString()); 
     } 
    } 
    void datareceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     myDelegate d = new myDelegate(update); 
     listBox1.Invoke(d, new object[] { }); 

    } 

    public void update() 
    { 

     while (serialPortN.BytesToRead > 0) 
      buffer.Add((byte)serialPortN.ReadByte()); 
     // Call a routine to process the data.   
     ProcessBuffer(buffer); 
    } 

    private void ProcessBuffer(List<byte> buffer) 
    { 
     int numberOfBytesToRead = 125; 
     if (buffer.Count >= numberOfBytesToRead) 
     { 
      this.Invoke(new Action(() => 
      Console.WriteLine(string.Format("SPO = {0}, PulseRate = {1}, Time = {2}", 
                buffer[43].ToString(), 
                buffer[103].ToString(), 
                DateTime.Now.ToString() 
      )))); 

      buffer.RemoveRange(0, numberOfBytesToRead); 
     } 

    } 

    void TimerElapsed(object sender, ElapsedEventArgs e) 
    { 

     int numberOfBytesToRead = 125; 
     if (buffer.Count >= numberOfBytesToRead) 
     { 
      this.Invoke(new Action(() => 
      listBox1.Items.Add(string.Format("SPO = {0}, PulseRate = {1}, Time = {2}", 
                buffer[43].ToString(), 
                buffer[103].ToString(), 
                DateTime.Now.ToString() 
      )))); 
      buffer.RemoveRange(0, numberOfBytesToRead); 

     } 

はすべてをありがとう!

+0

それはあなたがルーチンを入力し、完了していることを見てきた例外はbtnConnect_Clickとデバッガで発生していないと言うことは安全ですか?もしそうなら、私は物事をトリミングして、タイマーがシリアルコードなしで動くようにすることができるかどうかを見ていきます。 – nmjohn

+0

SerialPort.Close()のMSDN記事の備考のセクションを読む –

+0

こんにちはハンス、私はそれを読んだ..それは言う:すべてのアプリケーションのベストプラクティスは、試みる前にCloseメソッドを呼び出した後、ある程度の時間を待つことですポートが即座に閉じられない可能性があるため、Openメソッドを呼び出す必要があります。だから私はそれを開いた後にポートが閉鎖されているかどうかをどのように知っていますか?私のコードからわかるように。私はbtnConnectにif else文を入力しました。 – fb69

答えて

0
  1. 最初にオフ - リストボックスを変更します.1つ前にインにしてください。データを受信しました。
  2. ダブルチェックCOMポート - USBシリアルデバイスを使用している場合は、USBポートを変更して再起動すると名前が変更されます。
  3. 設定timer.AutoReset =真
+0

あなたの返事をありがとう、ありがとう、私はthis.invokeにlistbox.invokeを変更しました。しかし、効果はありません。 COMポートはCOM8で固定されています。私はブルートゥースを介してそれを読んでいる。 – fb69

+0

DataReceivedコールバックにブレークポイントを設定します。そこに到達していますか? – nmjohn

+0

はい、そこに到達しました。 – fb69

関連する問題