0

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

每个标签页也将有一个多行文本框,它将显示从分配的串行端口到它的传入数据。

这是我尝试动态创建这些控件的代码:

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个串口,就可以了!

我已经尝试过BeginInvokeInvoke但它没有改变任何东西。

4

1 回答 1

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);
       ...
    }       
}
于 2013-06-04T16:32:32.417 回答