VBA是否存在可对标WSC32.DLL的原生串口通信处理函数?
VBA原生替代WSC32串口组件方案
VBA本身没有内置串口操作封装,但可以直接调用Windows系统原生的通信API实现所有常用WSC32函数功能,完全不需要额外安装第三方库或注册组件,完美适配32/64位Access环境。
核心实现逻辑
直接在VBA标准模块中声明Windows内置的串口相关API函数即可使用,这些API是系统自带的基础接口,无额外依赖,原有业务代码仅需少量适配即可迁移。
常用WSC32函数对标映射
你用到的少量WSC32功能都可以直接对应到Windows API实现:
SioOpen:对标CreateFileAPI,用于打开串口获取句柄,兼容COM1~COM255的串口命名规则SioSetBaud/SioSetParity/SioSetDataBits/SioSetStopBits:对标GetCommState+SetCommStateAPI,通过配置DCB结构体实现所有串口参数调整SioRead:对标ReadFileAPI,读取串口接收缓冲区数据,支持指定读取长度、返回实际读取字节数SioWrite:对标WriteFileAPI,向串口发送指定长度的字节数据SioClose:对标CloseHandleAPI,释放串口句柄SioRxQue/SioTxQue:对标ClearCommErrorAPI,查询收发缓冲区待处理字节数
兼容32/64位的API声明示例
' 条件编译适配不同版本VBA #If VBA7 Then ' 64位/32位VBA7版本声明 Declare PtrSafe Function CreateFile Lib "kernel32" Alias "CreateFileA" ( _ ByVal lpFileName As String, _ ByVal dwDesiredAccess As Long, _ ByVal dwShareMode As Long, _ ByVal lpSecurityAttributes As LongPtr, _ ByVal dwCreationDisposition As Long, _ ByVal dwFlagsAndAttributes As Long, _ ByVal hTemplateFile As LongPtr _ ) As LongPtr Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As LongPtr) As Long Declare PtrSafe Function GetCommState Lib "kernel32" (ByVal hCommDev As LongPtr, lpDCB As Any) As Long Declare PtrSafe Function SetCommState Lib "kernel32" (ByVal hCommDev As LongPtr, lpDCB As Any) As Long Declare PtrSafe Function ReadFile Lib "kernel32" (ByVal hFile As LongPtr, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As LongPtr) As Long Declare PtrSafe Function WriteFile Lib "kernel32" (ByVal hFile As LongPtr, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As LongPtr) As Long Declare PtrSafe Function ClearCommError Lib "kernel32" (ByVal hFile As LongPtr, lpErrors As Long, lpStat As Any) As Long #Else ' 旧版32位VBA声明 Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" ( _ ByVal lpFileName As String, _ ByVal dwDesiredAccess As Long, _ ByVal dwShareMode As Long, _ ByVal lpSecurityAttributes As Long, _ ByVal dwCreationDisposition As Long, _ ByVal dwFlagsAndAttributes As Long, _ ByVal hTemplateFile As Long _ ) As Long Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Declare Function GetCommState Lib "kernel32" (ByVal hCommDev As Long, lpDCB As Any) As Long Declare Function SetCommState Lib "kernel32" (ByVal hCommDev As Long, lpDCB As Any) As Long Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long Declare Function ClearCommError Lib "kernel32" (ByVal hFile As Long, lpErrors As Long, lpStat As Any) As Long #End If
迁移建议
你可以封装一层和原有WSC32函数命名、参数规则完全一致的自定义函数,原有业务逻辑代码不需要做任何修改,仅需替换底层实现即可完成迁移。
内容的提问来源于stack exchange,提问作者David Meyenberg
相关产品推荐
相关产品推荐

