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 Sub2. 请求-响应模式(带超时)
发送命令后等待响应,超时自动退出:
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.ClosePort3. 二进制协议收发
发送和接收字节数组,适用于 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.ClosePort4. 读取一行文本
按换行符分割,读取完整的一行:
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.ClosePort5. 枚举可用串口
扫描系统中所有可用的串口:
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