Skip to content

cSerialPort 快速入门

📖 目录


引用方式

方式一:源码引用

src/SerialPort 下三个文件加入 VB6 工程:

modSerialPortAPI.bas   # API 声明、常量、类型、辅助函数
cSerialConfig.cls      # 配置类(含 eBaudRate/eParity/eStopBits 等枚举)
cSerialPort.cls        # 串口主类(含 eCommEvent/eCommError/eModemStatus 枚举)

方式二:DLL 引用

引用 dist\DLL\VBMAN.dll,使用时带命名空间前缀:

vb
Dim sp As New VBMANLIB.cSerialPort

最简示例

打开 COM3,发送文本并读取响应:

vb
Dim sp As New cSerialPort
sp.PortName = "COM3"
sp.Config.BaudRate = br9600

If sp.OpenPort() Then
    sp.WriteText "Hello"
    Debug.Print sp.ReadExisting()
    sp.ClosePort
End If

常见场景

1. 事件驱动持续收发

使用 WithEvents 声明对象,通过事件自动接收数据:

vb
Private WithEvents m_Port As cSerialPort

Private Sub Form_Load()
    Set m_Port = New cSerialPort
    m_Port.PortName = "COM4"
    m_Port.Config.BaudRate = 9600
    m_Port.Config.DataBits = 8
    m_Port.Config.Parity = 0        ' ptNone
    m_Port.Config.StopBits = 0      ' sb1

    If Not m_Port.OpenPort() Then
        Debug.Print "打开失败: " & m_Port.LastErrorMsg
        Exit Sub
    End If

    m_Port.StartMonitoring 50       ' 50ms 轮询
    Debug.Print "已启动,等待数据..."
End Sub

Private Sub m_Port_DataReceived(ByVal BytesCount As Long)
    Debug.Print "收到: " & m_Port.ReadExisting()
End Sub

Private Sub m_Port_ErrorOccurred(ByVal ErrorCode As Long, ByVal ErrorMsg As String)
    Debug.Print "错误: " & ErrorMsg
End Sub

Private Sub Form_Unload(Cancel As Integer)
    If Not m_Port Is Nothing Then
        If m_Port.IsOpen Then m_Port.ClosePort
        Set m_Port = Nothing
    End If
End Sub

2. 请求-响应模式(带超时)

发送命令后等待响应,超时自动退出:

vb
Dim sp As New cSerialPort
sp.PortName = "COM3"
sp.Config.BaudRate = br9600
sp.Config.SetReadTimeout 2000       ' 读取超时2秒
sp.OpenPort

sp.WriteText "hello"

Dim received As String
Dim startTime As Single
startTime = Timer
Do
    DoEvents
    If sp.InBufferCount > 0 Then
        received = received & sp.ReadExisting()
        If InStr(received, "world") > 0 Then Exit Do
    End If
Loop While Timer - startTime < 10   ' 最多等10秒

If InStr(received, "world") > 0 Then
    Debug.Print "收到响应: " & received
Else
    Debug.Print "超时未收到响应"
End If

sp.ClosePort

3. 二进制协议收发

发送和接收字节数组,适用于 Modbus 等二进制协议:

vb
Dim sp As New cSerialPort
sp.PortName = "COM3"
sp.Config.BaudRate = br115200
sp.OpenPort

' 发送 Modbus 请求帧
Dim frame(7) As Byte
frame(0) = &H01    ' 设备地址
frame(1) = &H03    ' 功能码
frame(2) = &H00: frame(3) = &H00  ' 起始地址
frame(4) = &H00: frame(5) = &H0A  ' 寄存器数量
frame(6) = &HC5: frame(7) = &HCD  ' CRC
sp.WriteData frame

' 等待并读取响应
Dim startTime As Single
startTime = Timer
Do While sp.InBufferCount < 5 And Timer - startTime < 2
    DoEvents
Loop

Dim buf() As Byte
Dim n As Long
n = sp.ReadData(buf)               ' 读取所有可用数据
Debug.Print "收到 " & n & " 字节"
sp.ClosePort

4. 读取一行文本

按换行符分割,读取完整的一行:

vb
Dim sp As New cSerialPort
sp.PortName = "COM3"
sp.Config.BaudRate = br9600
sp.Config.SetReadTimeout 5000      ' 5秒超时
sp.OpenPort

Dim line As String
line = sp.ReadLine()                ' 读取到 vbCrLf 为止
Debug.Print "收到一行: " & line

sp.ClosePort

5. 枚举可用串口

扫描系统中所有可用的串口:

vb
Dim ports As Collection
Set ports = EnumSerialPorts()

Dim p As Variant
For Each p In ports
    Debug.Print p                  ' COM1, COM3, ...
Next

Debug.Print "共 " & ports.Count & " 个可用串口"

最后更新: 2026-07-05

VB6及其LOGO版权为微软公司所有