MSComm32.ocx 是VB6 時代的 ActiveX 控件,依賴 32 位運行時、註冊表註冊、mscomm32.ocx 文件存在於 SysWOW64。VB.NET(.NET Framework)不支持直接引用 OCX,工具箱「組件」頁面加載時會嘗試包裝為 RCW(Runtime Callable Wrapper),常因缺少註冊、位數不匹配、缺少互操作程序集而報錯 could not be loaded。
.NET Framework 2.0+ 內置 System.IO.Ports.SerialPort 類,完全托管、無需註冊、跨平台(Windows/Linux/macOS 均可用),功能覆蓋 MSComm 99% 場景。
| 操作 | VB6 MSComm | VB.NET SerialPort |
|---|---|---|
| 打開端口 | MSComm1.PortOpen = True | sp.Open() |
| 設置波特率 | MSComm1.Settings = "9600,N,8,1" | sp.BaudRate = 9600; sp.Parity = Parity.None; sp.DataBits = 8; sp.StopBits = StopBits.One |
| 發送數據 | MSComm1.Output = "AT\r\n" | sp.WriteLine("AT") 或 sp.Write(bytes, 0, bytes.Length) |
| 接收事件 | Private Sub MSComm1_OnComm() | AddHandler sp.DataReceived, AddressOf DataReceivedHandler |
| 關閉端口 | MSComm1.PortOpen = False | sp.Close() |
Imports System.IO.Ports
Public Class Form1
Private WithEvents sp As New SerialPort()
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
sp.PortName = "COM3"
sp.BaudRate = 9600
sp.Parity = Parity.None
sp.DataBits = 8
sp.StopBits = StopBits.One
sp.Encoding = Encoding.ASCII ' 或 UTF8
sp.NewLine = vbCrLf
Try
sp.Open()
Catch ex As Exception
MessageBox.Show("打開失敗: " & ex.Message)
End Try
End Sub
Private Sub DataReceivedHandler(sender As Object, e As SerialDataReceivedEventArgs)
Dim data = sp.ReadExisting()
' 跨線程更新 UI 需 Invoke
Me.Invoke(Sub() txtReceive.AppendText(data))
End Sub
Private Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click
If sp.IsOpen Then sp.WriteLine(txtSend.Text)
End Sub
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
If sp.IsOpen Then sp.Close()
End Sub
End Class
AxMSCommLib、MSCommLib。System.IO.Ports(通常已默認)。SerialPort 屬性/方法/事件。DataReceived 事件在非 UI 線程觸發,更新控件必須 Control.Invoke。regsvr32 mscomm32.ocx。結論:VB.NET 串口開發請直接用 SerialPort,拒絕 MSComm,省時省力又標準。