2013-06-04 51 views
0

我有多個串行設備連接到我的電腦,我正在一個程序,允許用戶選擇儘可能多的端口,他們然後程序將動態創建TabPage並將它們添加到TabControl 。Dynamicaly創建SerialPort停止響應沒有錯誤

每個標籤頁也有一個多行文本框,用於顯示從分配的串口到它的輸入數據。

這裏是我的代碼,試圖動態創建這些控件:

private void AddSerialPort(string portName) 
{ 
    var page = new TabPage(portName); 

    page.Text = portName; 

    var tb = new TextBox(); 
    tb.Name = portName; 
    tb.Dock = DockStyle.Fill; 
    tb.BackColor = Color.Black; 
    tb.ForeColor = Color.White; 
    tb.Multiline = true; 
    page.Controls.Add(tb); 
    tabControlActiveSerialPorts.TabPages.Add(page);  

    //Define serial port 
    var sp = new SerialPort(portName, 115200, Parity.None, 8, StopBits.One);     

    sp.DataReceived += delegate 
    { 
     if (tb.InvokeRequired) 
     { 
      tb.Invoke(new Action(() => 
      { 
       var incoming = sp.ReadExisting(); 
       tb.Text += incoming;     
      })); 
     } 
     else 
     { 
      var incoming = sp.ReadExisting(); 
      tb.Text += incoming; 
     } 
    }; 

    sp.Open(); 
} 

的問題是,如果我只添加一個SerialPort,它工作正常和文本得到填補。但是,只要我添加另一個SerialPort,幾秒鐘後,第一個或第二個添加的SerialPort將停止工作,而另一個仍然工作(這是完全隨機的第一個或第二個停止填充文本框中的數據,否則它不是我的硬件!)我的意思是指定它的文本框不會被填滿了。

我沒有收到來自調試器的任何錯誤...這只是行不通的!任何想法可能是什麼問題?

我不得不提,如果我只添加1串口,它的工作正常!

我試過BeginInvoke而不是Invoke但它沒有改變任何東西。

回答

1

可能是SerialPort對象被丟棄。嘗試將每個新對象添加到列表中:

class Class 
{ 
    List<SerialPort> ports = new List<SerialPort>(); 

    private void AddSerialPort(string portName) 
    { 
     ... 
     var sp = new SerialPort(portName, 115200, Parity.None, 8, StopBits.One); 
     ports.Add(sp); 
     ... 
    }  
} 
+0

這似乎是照顧問題!我想要做同樣的事情:D謝謝! –