[VB6][VB.NET][C#] 使用WMI類別、My類別及MSComm ActiveX,取得電腦可用的Serial Port(Com Port)

  • 21091
  • 0
  • C#
  • 2008-11-16

摘要:[VB6][VB.NET][C#] 使用WMI類別、My類別及MSComm ActiveX,取得電腦可用的Serial Port(Com Port)

市面上Serial Port介面的產品雖說已經越來越少了,但是還是相當多的人會需要用到它,由其是工控界的朋友。

以下將使用WMI及ActiveX,來取得電腦中的Serial Port,若是要其他語言的用法請用google搜尋一下

1.VB6利用WMI,Win32_SerialPort

Private Sub Form_Load()
    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

Public Class Form1

    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

01 Private Sub Command1_Click()
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;
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

Public Class Form1
    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 + 自定函數

Private Sub SearchPort(ByVal StartPortNumber As Integer, _
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

Image result for microsoft+mvp+logo