动态创建的串行端口停止响应,没有错误

时间:2013-06-04 16:01:23

标签: c# multithreading winforms serial-port dynamic-controls

我有多个串口设备连接到我的PC,我正在开发一个程序,允许用户选择他们想要的端口,然后程序将动态创建TabPage并将它们添加到TabControl。

每个标签页还有一个多行TextBox,它将显示从指定的序列端口传入的数据。

以下是我的代码,它试图动态创建这些控件:

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 个答案:

答案 0 :(得分: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);
       ...
    }       
}
相关问题