摘要:[VB6][VB.NET][C#] 使用WMI類別、My類別及MSComm ActiveX,取得電腦可用的Serial Port(Com Port)
市面上Serial Port介面的產品雖說已經越來越少了,但是還是相當多的人會需要用到它,由其是工控界的朋友。
以下將使用WMI及ActiveX,來取得電腦中的Serial Port,若是要其他語言的用法請用google搜尋一下
1.VB6利用WMI,Win32_SerialPort
Dim obj As Object
Dim items As Object
Dim item As Object
Dim mS As String
Set obj = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set items = obj.ExecQuery("Select * from Win32_SerialPort")
For Each item In items
mS = mS & IIf(mS = "", "", ",") & item.DeviceID
Next
Debug.Print mS
End Sub
2.VB2005利用WMI,Win32_SerialPort
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim oWMI, oCom
oWMI = GetObject("winmgmts:")
For Each oCom In oWMI.InstancesOf("Win32_SerialPortConfiguration")
MsgBox("Name: " & oCom.Name)
Next
End Sub
End Class
資料出處:http://msdn.microsoft.com/en-us/library/aa394414(VS.85).aspx
3.VB6利用WMI,Win32_SerialPortConfiguration
02 Dim strComputer As String
03 Dim colItems, objItem, objWMIService
04
05 On Error Resume Next
06 strComputer = "."
07 Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
08 Set colItems = objWMIService.ExecQuery("Select * from Win32_SerialPortConfiguration", , 48)
09 For Each objItem In colItems
10 Debug.Print "Name: " & objItem.Name
11 Debug.Print "Description: " & objItem.Description
12 Debug.Print "isbusy: " & objItem.isbusy
13 Next
14 Debug.Print "========================================="
15
16 End Sub
資料出處:http://msdn.microsoft.com/en-us/library/aa394413(VS.85).aspx
4.C#利用.Net Framework 2.0 System.Management 和Win32_SerialPortConfiguration,要使用System.Management時,請在於專案→加入參考→System.Management
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Management;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ManagementClass mc = new ManagementClass("Win32_SerialPortConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
// only return MAC Address from first card
MessageBox.Show (mo["Name"].ToString());
}
}
}
}
資料出處:http://msdn.microsoft.com/en-us/library/system.management.aspx
使用USB轉Serial Port 似乎無法用WMI偵測到
5.使用My.Computer.Ports.SerialPortNames
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For Each sp As String In My.Computer.Ports.SerialPortNames
ListBox1.Items.Add(sp)
Next
End Sub
End Class
資料出處:http://msdn.microsoft.com/zh-tw/library/e4560dx9%28VS.80%29.aspx
但使用USB轉Serial Port 用My類別可以偵測到,語法也簡潔可愛多了
6.VB6使用微軟的MSComm ActiveX + 自定函數
ByVal ReallyPortNumber As Integer, _
ByVal EndPortNumber As Integer)
On Error GoTo Err_SearchPort:
mc.CommPort = StartPortNumber
mc.PortOpen = True
Err_SearchPort:
'判斷是否發生錯誤
If Err.Number = 0 Then
'若沒發生錯誤,則 Port 開啟正常 ( 代表 Serial Port 可用 )
cboPort.AddItem "COM" & StartPortNumber
cboPort.ItemData(ReallyPortNumber) = StartPortNumber
'開啟成功後,要記得關掉....
mc.PortOpen = False
ReallyPortNumber = ReallyPortNumber + 1
End If
'當尋找 Port 大於 EndPortNumber 時離開此函式
If StartPortNumber >= EndPortNumber Then Exit Sub
'遞回
SearchPort StartPortNumber + 1, ReallyPortNumber, EndPortNumber
End Sub
資料出處:http://wukm.blogspot.com/2007/05/com-port.html
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET