首先使用的是扫描串口号的方式去扫描可用串口,扫描20个串口,并尝试打开此串口,如果可以打开则说明此串口可用,添加到列表否则错误跳过
但是会造成当已经打开过某个串口将无法扫描到,不是很可取
private void USART_Scan(SerialPort MyPort, ComboBox MyBox)
{
string Buffer; //判断当前查询的串口号是否可用
int Count = 0; //记录当前查询到的可用串口号个数
comboBox1.Items.Clear(); //清空ComboBox显示内容
for (int i = 1; i < 20; i++)
{
Buffer = "COM" + i.ToString(); //转换串口号
MyPort.PortName = Buffer; //赋值串口号
try
{
MyPort.Open(); //尝试打开串口
MyBox.Items.Add(Buffer); //添加项目到ComboBOX
MyPort.Close(); //关闭串口
if (Count == 0) { Count = 1; comboBox1.Text = Buffer; }
}
catch
{
if (MyPort.IsOpen)
{
MyBox.Items.Add(Buffer); //添加项目到ComboBOX
if (Count == 0) { Count = 1; comboBox1.Text = Buffer; }
}
}
}
}
其次是直接获取系统存在的串口列表,可以保证所有打开未打开的都可以获取到,目前这钟比较好使,又快
private void USART_Scan(SerialPort MyPort, ComboBox MyBox)
{
comboBox1.Items.Clear(); //清空ComboBox显示内容
//得到当前串口号
string[] Serial_Name = SerialPort.GetPortNames();
if (Serial_Name.Length > 0)
{
Array.Sort(Serial_Name); //排序
comboBox1.Items.AddRange(Serial_Name);
}
//如果当前有项目则默认填充第一个
if (comboBox1.Items.Count != 0)
{
comboBox1.SelectedIndex = 0;
}
}
更重要的是可以实现实时扫描可用串口,方法也比较简单,思路就是我们每次点击下拉框切换串口时扫描一次
只需要双击Click 后面的空白区域,即可自动生成事件函数
然后将扫描串口的函数放在里面,不过由于每次点击都会扫描,所以会有轻微卡顿,串口数量特别多没有怎么测试,三四个问题不大 +-+
个人见解,感谢阅读。