網(wǎng)站的注冊(cè)和登錄怎么做友情鏈接聯(lián)盟
在實(shí)際應(yīng)用中有時(shí)會(huì)牽扯到挑選可用串口,比如上位機(jī)和從站設(shè)備使用Modbus RTU協(xié)議進(jìn)行通訊時(shí)需要選擇COM串口,每次啟動(dòng)連接前都在設(shè)備管理器查看較為麻煩,可以設(shè)置一個(gè)串口自動(dòng)識(shí)別功能,如果選擇了錯(cuò)誤的串口還可以提示串口選擇錯(cuò)誤。
在Visual Studio中點(diǎn)擊新建項(xiàng)目,選擇Visual Basic語(yǔ)言,先新建一個(gè)Windows窗體應(yīng)用
?隨后會(huì)出現(xiàn)一個(gè)空白的窗體應(yīng)用,按 F4 鍵可以在右側(cè)的屬性界面對(duì)窗體的標(biāo)題及格式進(jìn)行更改
雙擊窗體即可進(jìn)入到代碼編輯界面(編輯Form1.vb文件)
通常不要隨意刪除Form1.vb中的類(lèi),因?yàn)檫@些類(lèi)是由設(shè)計(jì)器自動(dòng)生成,刪除后可能會(huì)報(bào)錯(cuò)。
隨后導(dǎo)入識(shí)別串口所需要的庫(kù):
Imports System.IO.Ports
?如果需要Modbus通訊功能,需要點(diǎn)擊 項(xiàng)目 欄,隨后點(diǎn)擊管理NuGet程序包 下載NModbus庫(kù)和NModbus.Serial庫(kù)
?在工具箱中搜索:ComboBox ,這是一個(gè)可供選擇的下拉列表,拖入到窗體中
?雙擊ComboBox,在From1類(lèi)下新建一個(gè)私有類(lèi):
Private currentPortName As String = ""
在From1_Load類(lèi)(窗口加載時(shí)類(lèi))中補(bǔ)全功能:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadDim portNames() As String = SerialPort.GetPortNames()' 將端口名添加到ComboBox中 For Each portName As String In portNamesComboBox1.Items.Add(portName)NextEnd Sub
在ComboBox1_SelectedIndexChanged(串口改變時(shí)類(lèi))補(bǔ)全:
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChangedIf ComboBox1.SelectedItem IsNot Nothing ThencurrentPortName = ComboBox1.SelectedItem.ToString() ' 更新currentPortName的值 TryUsing testPort As New SerialPort(currentPortName)testPort.Open()End UsingCatch ex As UnauthorizedAccessExceptionMessageBox.Show("所選串口已被占用,請(qǐng)重新選擇一個(gè)串口。", "串口占用提示", MessageBoxButtons.OK, MessageBoxIcon.Warning)' 清除當(dāng)前選擇,用戶可以重新選擇 ComboBox1.SelectedIndex = -1currentPortName = "" ' 清除currentPortName的值 Catch ex As Exception' 捕獲其他可能的異常,并進(jìn)行處理 MessageBox.Show("無(wú)法打開(kāi)串口:" & ex.Message, "錯(cuò)誤提示", MessageBoxButtons.OK, MessageBoxIcon.Error)ComboBox1.SelectedIndex = -1currentPortName = ""End TryElseMessageBox.Show("請(qǐng)先選擇一個(gè)串口。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information)' 可以選擇設(shè)置一個(gè)默認(rèn)的串口或者不做任何操作 currentPortName = ""End IfEnd Sub
完整版代碼如下:
Imports System.IO.PortsPublic Class Form1Private currentPortName As String = ""Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadDim portNames() As String = SerialPort.GetPortNames()' 將端口名添加到ComboBox中 For Each portName As String In portNamesComboBox1.Items.Add(portName)NextEnd SubPrivate Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChangedIf ComboBox1.SelectedItem IsNot Nothing ThencurrentPortName = ComboBox1.SelectedItem.ToString() ' 更新currentPortName的值 TryUsing testPort As New SerialPort(currentPortName)testPort.Open()End UsingCatch ex As UnauthorizedAccessExceptionMessageBox.Show("所選串口已被占用,請(qǐng)重新選擇一個(gè)串口。", "串口占用提示", MessageBoxButtons.OK, MessageBoxIcon.Warning)' 清除當(dāng)前選擇,用戶可以重新選擇 ComboBox1.SelectedIndex = -1currentPortName = "" ' 清除currentPortName的值 Catch ex As Exception' 捕獲其他可能的異常,并進(jìn)行處理 MessageBox.Show("無(wú)法打開(kāi)串口:" & ex.Message, "錯(cuò)誤提示", MessageBoxButtons.OK, MessageBoxIcon.Error)ComboBox1.SelectedIndex = -1currentPortName = ""End TryElseMessageBox.Show("請(qǐng)先選擇一個(gè)串口。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information)' 可以選擇設(shè)置一個(gè)默認(rèn)的串口或者不做任何操作 currentPortName = ""End IfEnd Sub
End Class
代碼運(yùn)行后(COM1串口已被占用,選擇后會(huì)提示錯(cuò)誤,隨后提示從新選擇COM串口):