我有多个串行设备连接到我的 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个串口,就可以了!
我已经尝试过BeginInvoke
,Invoke
但它没有改变任何东西。