我有多个串口设备连接到我的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
,但它没有改变任何内容。
答案 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);
...
}
}