System.InvalidOperationException: 創建窗體時出錯。
InnerException: 沒有註冊類 (HRESULT: 0x80040154 REGDB_E_CLASSNOTREG)
原因:MSComm 是 VB6 時代的 ActiveX 控制項(MSCOMM32.OCX),在 .NET 環境下需先以系統管理員身分執行 regsvr32 MSCOMM32.OCX 註冊至系統登錄,且目標機器必須安裝該 OCX。
MSCOMM32.OCX(VB6 安裝目錄或網路下載)。regsvr32 "C:\Path\To\MSCOMM32.OCX"
缺點:部署麻煩(需目標機註冊)、32/64 位元相容性問題、微軟已停止支援。
System.IO.Ports.SerialPort(強烈推薦)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.ReadTimeout = 1000
sp.WriteTimeout = 1000
End Sub
Private Sub btnOpen_Click(sender As Object, e As EventArgs) Handles btnOpen.Click
Try
If Not sp.IsOpen Then sp.Open()
MessageBox.Show("串口已開啟")
Catch ex As Exception
MessageBox.Show("開啟失敗: " & ex.Message)
End Try
End Sub
Private Sub sp_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles sp.DataReceived
' 注意:此事件在背景執行緒觸發,更新 UI 需 Invoke
Dim data As String = sp.ReadExisting()
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.Write(txtSend.Text)
End Sub
End Class
DataReceived、ErrorReceived、PinChanged。現有 VB6/MSComm 專案遷移至 VB.NET 時,直接重寫通訊層使用 SerialPort,不要嘗試移植 MSComm,長遠維護成本更低。