VB.NET实现上位机自动识别可用串口

在实际应用中有时会牵扯到挑选可用串口,比如上位机和从站设备使用Modbus RTU协议进行通讯时需要选择COM串口,每次启动连接前都在设备管理器查看较为麻烦,可以设置一个串口自动识别功能,如果选择了错误的串口还可以提示串口选择错误。

在Visual Studio中点击新建项目,选择Visual Basic语言,先新建一个Windows窗体应用

随后会出现一个空白的窗体应用,按 F4 键可以在右侧的属性界面对窗体的标题及格式进行更改

双击窗体即可进入到代码编辑界面(编辑Form1.vb文件)

通常不要随意删除Form1.vb中的类,因为这些类是由设计器自动生成,删除后可能会报错。

随后导入识别串口所需要的库:

vbnet 复制代码
Imports System.IO.Ports

如果需要Modbus通讯功能,需要点击 项目栏,随后点击管理NuGet程序包 下载NModbus库和NModbus.Serial库

在工具箱中搜索:ComboBox ,这是一个可供选择的下拉列表,拖入到窗体中

双击ComboBox,在From1类下新建一个私有类:

vbnet 复制代码
Private currentPortName As String = ""

在From1_Load类(窗口加载时类)中补全功能:

vbnet 复制代码
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim portNames() As String = SerialPort.GetPortNames()
        ' 将端口名添加到ComboBox中  
        For Each portName As String In portNames
            ComboBox1.Items.Add(portName)
        Next
    End Sub

在ComboBox1_SelectedIndexChanged(串口改变时类)补全:

vbnet 复制代码
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
        If ComboBox1.SelectedItem IsNot Nothing Then
            currentPortName = ComboBox1.SelectedItem.ToString() ' 更新currentPortName的值  
            Try
                Using testPort As New SerialPort(currentPortName)
                    testPort.Open()
                End Using
            Catch ex As UnauthorizedAccessException
                MessageBox.Show("所选串口已被占用,请重新选择一个串口。", "串口占用提示", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                ' 清除当前选择,用户可以重新选择    
                ComboBox1.SelectedIndex = -1
                currentPortName = "" ' 清除currentPortName的值  
            Catch ex As Exception
                ' 捕获其他可能的异常,并进行处理    
                MessageBox.Show("无法打开串口:" & ex.Message, "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
                ComboBox1.SelectedIndex = -1
                currentPortName = ""
            End Try
        Else
            MessageBox.Show("请先选择一个串口。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
            ' 可以选择设置一个默认的串口或者不做任何操作    
            currentPortName = ""
        End If
    End Sub

完整版代码如下:

vbnet 复制代码
Imports System.IO.Ports

Public Class Form1
    Private currentPortName As String = ""
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim portNames() As String = SerialPort.GetPortNames()
        ' 将端口名添加到ComboBox中  
        For Each portName As String In portNames
            ComboBox1.Items.Add(portName)
        Next
    End Sub
    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
        If ComboBox1.SelectedItem IsNot Nothing Then
            currentPortName = ComboBox1.SelectedItem.ToString() ' 更新currentPortName的值  
            Try
                Using testPort As New SerialPort(currentPortName)
                    testPort.Open()
                End Using
            Catch ex As UnauthorizedAccessException
                MessageBox.Show("所选串口已被占用,请重新选择一个串口。", "串口占用提示", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                ' 清除当前选择,用户可以重新选择    
                ComboBox1.SelectedIndex = -1
                currentPortName = "" ' 清除currentPortName的值  
            Catch ex As Exception
                ' 捕获其他可能的异常,并进行处理    
                MessageBox.Show("无法打开串口:" & ex.Message, "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
                ComboBox1.SelectedIndex = -1
                currentPortName = ""
            End Try
        Else
            MessageBox.Show("请先选择一个串口。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
            ' 可以选择设置一个默认的串口或者不做任何操作    
            currentPortName = ""
        End If
    End Sub
End Class

代码运行后(COM1串口已被占用,选择后会提示错误,随后提示从新选择COM串口):

相关推荐
冰茶丿11 分钟前
嵌入式安全第一关:Secure Boot是怎么保护你的设备的?
嵌入式硬件·安全
卖萌的斜阳16 分钟前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
单片机·网络协议·tcp/ip
Kuakewei8881 小时前
4056充电芯片:28V高耐压+电池反接保护+热调节功能
嵌入式硬件
三品吉他手会点灯1 小时前
嵌入式机器学习 - 学习笔记1.1.1 - 什么是机器学习?
c语言·人工智能·笔记·嵌入式硬件·学习·机器学习
woohuwan1 小时前
CST 匝数比和采样电阻怎么算?
单片机·嵌入式硬件
王光环4 小时前
STM32H750串口一直进IRQ问题解决
stm32·单片机·嵌入式硬件
2401_854151555 小时前
STM32 选项字节与读写保护(RDP)
stm32·单片机·嵌入式硬件
piaoyiren5 小时前
STC8 单片机蜂鸣器播放音乐
单片机·嵌入式硬件
阿拉斯攀登5 小时前
无人售货柜MQTT客户端工业级配置:心跳、遗嘱、重连、QoS适配实战
嵌入式硬件·mqtt·安卓·零售·无人售货柜·无人售货机
KaifuZeng7 小时前
通信与接口协议面试问题汇总三
单片机·嵌入式硬件·面试·通信与接口协议