VB的MSCOMM控件虽然很好用,但是在没有装VB的机器上用该控件总觉得有些累赘,网上的VB API代码大部分都基于是同步方式,处理复杂的通信模式不是太理想,所以用了一些时间,把VC项目中的异步串口读写代码翻译为VB格式。
在VB新建一个类,把下面的代码复制后即可使用
'*************************************************************************
'**模块名:SerialPort
'**说明:YFsoft版权所有2006-2007(C)
'**创建人:叶帆
'**日期:2006-08-1714:32:29
'**修改人:
'**日期:
'**描述:串口异步读写(API)
'**版本:V1.0.0
'*************************************************************************
OptionExplicit
PrivateTypeComStat
fCtsHoldAsLong
fDsrHoldAsLong
fRlsdHoldAsLong
fXoffHoldAsLong
fXoffSentAsLong
fEofAsLong
fTximAsLong
fReservedAsLong
cbInQueAsLong
cbOutQueAsLong
EndType
PrivateTypeCOMMTIMEOUTS
ReadIntervalTimeoutAsLong
ReadTotalTimeoutMultiplierAsLong
ReadTotalTimeoutConstantAsLong
WriteTotalTimeoutMultiplierAsLong
WriteTotalTimeoutConstantAsLong
EndType
PrivateTypeDCB
DCBlengthAsLong
BaudRateAsLong
'DWORDDCBlength;/*sizeof(DCB)*/
'DWORDBaudRate;/*Baudrateatwhichrunning*/
'DWORDfBinary:1;/*BinaryMode(skipEOFcheck)*/
'DWORDfParity:1;/*Enableparitychecking*/
'DWORDfOutxCtsFlow:1;/*CTShandshakingonoutput*/
'DWORDfOutxDsrFlow:1;/*DSRhandshakingonoutput*/
'DWORDfDtrControl:2;/*DTRFlowcontrol*/
'DWORDfDsrSensitivity:1;/*DSRSensitivity*/
'DWORDfTXContinueOnXoff:1;/*ContinueTXwhenXoffsent*/
'DWORDfOutX:1;/*EnableoutputX-ON/X-OFF*/
'DWORDfInX:1;/*EnableinputX-ON/X-OFF*/
'DWORDfErrorChar:1;/*EnableErrReplacement*/
'DWORDfNull:1;/*EnableNullstripping*/
'DWORDfRtsControl:2;/*RtsFlowcontrol*/
'DWORDfAbortOnError:1;/*AbortallreadsandwritesonError*/
'DWORDfDummy2:17;/*Reserved*/
fBitFieldsAsLong'SeeCommentsinWin32API.Txt
wReservedAsInteger
XonLimAsInteger
XoffLimAsInteger
ByteSizeAsByte
ParityAsByte
StopBitsAsByte
XonCharAsByte
XoffCharAsByte
ErrorCharAsByte
EofCharAsByte
EvtCharAsByte
wReserved1AsInteger'Reserved;DoNotUse
EndType
PrivateTypeOVERLAPPED
InternalAsLong
InternalHighAsLong
offsetAsLong
OffsetHighAsLong
hEventAsLong
EndType
PrivateTypeSECURITY_ATTRIBUTES
nLengthAsLong
lpSecurityDescriptorAsLong
bInheritHandleAsLong
EndType
PrivateDeclareFunctionCloseHandleLib"kernel32"(ByValhObjectAsLong)AsLong
PrivateDeclareFunctionGetLastErrorLib"kernel32"()AsLong
PrivateDeclareFunctionReadFileLib"kernel32"(ByValhFileAsLong,lpBufferAsAny,ByValnNumberOfBytesToReadAsLong,lpNumberOfBytesReadAsLong,lpOverlappedAsOVERLAPPED)AsLong
PrivateDeclareFunctionWriteFileLib"kernel32"(ByValhFileAsLong,lpBufferAsAny,ByValnNumberOfBytesToWriteAsLong,lpNumberOfBytesWrittenAsLong,lpOverlappedAsOVERLAPPED)AsLong'OVERLAPPED
PrivateDeclareFunctionSetCommTimeoutsLib"kernel32"(ByValhFileAsLong,lpCommTimeoutsAsCOMMTIMEOUTS)AsLong
PrivateDeclareFunctionGetCommTimeoutsLib"kernel32"(ByValhFileAsLong,lpCommTimeoutsAsCOMMTIMEOUTS)AsLong
PrivateDeclareFunctionBuildCommDCBLib"kernel32"Alias"BuildCommDCBA"(ByVallpDefAsString,lpDCBAsDCB)AsLong
PrivateDeclareFunctionSetCommStateLib"kernel32"(ByValhCommDevAsLong,lpDCBAsDCB)AsLong
PrivateDeclareFunctionGetCommStateLib"kernel32"(ByValnCidAsLong,lpDCBAsDCB)AsLong
PrivateDeclareFunctionCreateFileLib"kernel32"Alias"CreateFileA"(ByVallpFileNameAsString,ByValdwDesiredAccessAsLong,ByValdwShareModeAsLong,ByVallpSecurityAttributesAsLong,ByValdwCreationDispositionAsLong,ByValdwFlagsAndAttributesAsLong,ByValhTemplateFileAsLong)AsLong
PrivateDeclareFunctionFlushFileBuffersLib"kernel32"(ByValhFileAsLong)AsLong
PrivateDeclareFunctionCreateEventLib"kernel32"Alias"CreateEventA"(lpEventAttributesAsSECURITY_ATTRIBUTES,ByValbManualResetAsLong,ByValbInitialStateAsLong,ByVallpNameAsString)AsLong
PrivateDeclareFunctionSetCommMaskLib"kernel32"(ByValhFileAsLong,ByValdwEvtMaskAsLong)AsLong
PrivateDeclareFunctionSetEventLib"kernel32"(ByValhEventAsLong)AsLong
PrivateDeclareFunctionPurgeCommLib"kernel32"(ByValhFileAsLong,ByValdwFlagsAsLong)AsLong
PrivateDeclareFunctionClearCommErrorLib"kernel32"(ByValhFileAsLong,lpErrorsAsLong,lpStatAsComStat)AsLong
PrivateDeclareFunctionGetOverlappedResultLib"kernel32"(ByValhFileAsLong,lpOverlappedAsOVERLAPPED,lpNumberOfBytesTransferredAsLong,ByValbWaitAsLong)AsLong
PrivateDeclareFunctionWaitForSingleObjectLib"kernel32"(ByValhHandleAsLong,ByValdwMillisecondsAsLong)AsLong
PrivateDeclareFunctionSetupCommLib"kernel32"(ByValhFileAsLong,ByValdwInQueueAsLong,ByValdwOutQueueAsLong)AsLong
PrivateConstGENERIC_WRITE=&H40000000
PrivateConstGENERIC_READ=&H80000000
PrivateConstOPEN_EXISTING=3
PrivateConstFILE_ATTRIBUTE_NORMAL=&H80
PrivateConstFILE_FLAG_OVERLAPPED=&H40000000
PrivateConstDTR_CONTROL_DISABLE=&H0
PrivateConstRTS_CONTROL_ENABLE=&H1
PrivateConstPURGE_RXABORT=&H2
PrivateConstPURGE_RXCLEAR=&H8
PrivateConstPURGE_TXABORT=&H1
PrivateConstPURGE_TXCLEAR=&H4
PrivateConstERROR_IO_PENDING=997
PrivateConstSTATUS_WAIT_0=&H0
PrivateConstWAIT_OBJECT_0=(STATUS_WAIT_0+0)
PrivateConstWAIT_TIMEOUT=258&
Privatem_HandleAsLong
Privatem_OverlappedReadAsOVERLAPPED
Privatem_OverlappedWriteAsOVERLAPPED
'*************************************************************************
'**函数名:OpenPort
'**输入:ComNumber(Long)-串口号
'**:Comsettings(String)-配置信息
'**输出:(Long)-0成功非0失败
'**功能描述:打开串口
'**全局变量:
'**调用模块:
'**作者:叶帆
'**日期:2006-08-1714:40:14
'**修改人:
'**日期:
'**版本:V1.0.0
'*************************************************************************
PublicFunctionOpenPort(ComNumberAsLong,ComsettingsAsString,OptionallngInSizeAsLong=1024,OptionallngOutSizeAsLong=512)AsLong
OnErrorGoTohandelinitcom
DimretvalAsLong
DimCtimeOutAsCOMMTIMEOUTS,dcbsAsDCB
DimstrCOMAsString,strConfigAsString
strCOM="/.COM"&Format(ComNumber,"0")
m_Handle=CreateFile(strCOM,GENERIC_READOrGENERIC_WRITE,0,0&,OPEN_EXISTING,FILE_ATTRIBUTE_NORMALOrFILE_FLAG_OVERLAPPED,0)
Ifm_Handle=-1Then
OpenPort=-1
ExitFunction
EndIf
'设置dcb块
dcbs.DCBlength=Len(dcbs)'长度
CallGetCommState(m_Handle,dcbs)
'波特率,奇偶校验,数据位,停止位如:9600,n,8,1
strConfig="COM"&Format(ComNumber,"0")&":"&Comsettings
CallBuildCommDCB(strConfig,dcbs)
'------------------------------
'dcbs.fBinary=1'二进制方式
'dcbs.fOutxCtsFlow=0'不用CTS检测发送流控制
'dcbs.fOutxDsrFlow=0'不用DSR检测发送流控制
'dcbs.fDtrControl=DTR_CONTROL_DISABLE'禁止DTR流量控制
'dcbs.fDsrSensitivity=0'对DTR信号线不敏感
'dcbs.fTXContinueOnXoff=1'检测接收缓冲区
'dcbs.fOutX=0'不做发送字符控制
'dcbs.fInX=0'不做接收控制
'dcbs.fErrorChar=0'是否用指定字符替换校验错的字符
'dcbs.fNull=0'保留NULL字符
'dcbs.fRtsControl=RTS_CONTROL_ENABLE'允许RTS流量控制
'dcbs.fAbortOnError=0'发送错误后,继续进行下面的读写操作
'dcbs.fDummy2=0'保留
dcbs.fBitFields=1*2^0OrDTR_CONTROL_DISABLE*2^4Or1*2^7OrRTS_CONTROL_ENABLE*2^12
dcbs.wReserved=0'没有使用,必须为0
dcbs.XonLim=0'指定在XOFF字符发送之前接收到缓冲区中可允许的最小字节数
dcbs.XoffLim=0'指定在XOFF字符发送之前缓冲区中可允许的最小可用字节数
dcbs.XonChar=0'发送和接收的XON字符
dcbs.XoffChar=0'发送和接收的XOFF字符
dcbs.ErrorChar=0'代替接收到奇偶校验错误的字符
dcbs.EofChar=0'用来表示数据的结束
dcbs.EvtChar=0'事件字符,接收到此字符时,会产生一个事件
'dcbs.wReserved1=0'没有使用
'dcbs.BaudRate=9600'波特率
'dcbs.Parity=0'奇偶校验
'dcbs.ByteSize=8'数据位
'dcbs.StopBits=0'停止位
'------------------------------
Ifdcbs.Parity=0Then'0-4=None,Odd,Even,Mark,Space
dcbs.fBitFields=dcbs.fBitFieldsAnd&HFFFD'dcbs.fParity=0'奇偶校验无效
Else
dcbs.fBitFields=dcbs.fBitFieldsOr&H2'dcbs.fParity=1'奇偶校验有效
EndIf
'超时设置
CtimeOut.ReadIntervalTimeout=20'0
CtimeOut.ReadTotalTimeoutConstant=1'2500
CtimeOut.ReadTotalTimeoutMultiplier=1'0
CtimeOut.WriteTotalTimeoutConstant=10'2500
CtimeOut.WriteTotalTimeoutMultiplier=1'0
retval=SetCommTimeouts(m_Handle,CtimeOut)
Ifretval=-1Then
retval=GetLastError()
OpenPort=retval
retval=CloseHandle(m_Handle)
ExitFunction
EndIf
'获取信号句柄
DimlpEventAttributes1AsSECURITY_ATTRIBUTES
DimlpEventAttributes2AsSECURITY_ATTRIBUTES
m_OverlappedRead.hEvent=CreateEvent(lpEventAttributes1,1,0,0)
m_OverlappedWrite.hEvent=CreateEvent(lpEventAttributes2,1,0,0)
'判断设置参数是否成功设置输入和输出缓冲区是否成功
IfSetCommState(m_Handle,dcbs)=-1OrSetupComm(m_Handle,lngInSize,lngOutSize)=-1Orm_OverlappedRead.hEvent=0Orm_OverlappedWrite.hEvent=0Then
retval=GetLastError()
OpenPort=retval
If(m_OverlappedRead.hEvent<>0)ThenCloseHandle(m_OverlappedRead.hEvent)
If(m_OverlappedWrite.hEvent<>0)ThenCloseHandle(m_OverlappedWrite.hEvent)
CallCloseHandle(m_Handle)
m_Handle=0
ExitFunction
EndIf
OpenPort=0
ExitFunction
handelinitcom:
CallCloseHandle(m_Handle)
m_Handle=0
OpenPort=-2
ExitFunction
EndFunction
'*************************************************************************
'**函数名:ClosePort
'**输入:无
'**输出:(Long)-0成功-1失败
'**功能描述:关闭串口
'**全局变量:
'**调用模块:
'**作者:叶帆
'**日期:2006-08-1714:56:13
'**修改人:
'**日期:
'**版本:V1.0.0
'*************************************************************************
PublicFunctionClosePort()AsLong
If(m_Handle=0)Then
ClosePort=1
ExitFunction
EndIf
CallSetCommMask(m_Handle,0)
CallSetEvent(m_OverlappedRead.hEvent)
CallSetEvent(m_OverlappedWrite.hEvent)
If(m_OverlappedRead.hEvent<>0)ThenCloseHandle(m_OverlappedRead.hEvent)
If(m_OverlappedWrite.hEvent<>0)ThenCloseHandle(m_OverlappedWrite.hEvent)
IfCloseHandle(m_Handle)<>0Then
ClosePort=0
Else
ClosePort=-1
EndIf
m_Handle=0
EndFunction
'*************************************************************************
'**函数名:ClearInBuf
'**输入:无
'**输出:无
'**功能描述:清空输入缓冲区
'**全局变量:
'**调用模块:
'**作者:叶帆
'**日期:2006-08-1714:57:26
'**修改人:
'**日期:
'**版本:V1.0.0
'*************************************************************************
PublicFunctionClearInBuf()AsLong
If(m_Handle=0)Then
ClearInBuf=1
ExitFunction
EndIf
CallPurgeComm(m_Handle,PURGE_RXABORTOrPURGE_RXCLEAR)
ClearInBuf=0
EndFunction
'*************************************************************************
'**函数名:ClearOutBuf
'**输入:无
'**输出:(Long)-
'**功能描述:清空输出缓冲区
'**全局变量:
'**调用模块:
'**作者:叶帆
'**日期:2006-08-1715:40:38
'**修改人:
'**日期:
'**版本:V1.0.0
'*************************************************************************
PublicFunctionClearOutBuf()AsLong
If(m_Handle=0)Then
ClearOutBuf=1
ExitFunction
EndIf
CallPurgeComm(m_Handle,PURGE_TXABORTOrPURGE_TXCLEAR)
ClearOutBuf=0
EndFunction
'*************************************************************************
'**函数名:SendData
'**输入:bytBuffer()(Byte)-数据
'**:lngSize(Long)-数据长度
'**输出:(Long)-
'**功能描述:发送数据
'**全局变量:
'**调用模块:
'**作者:叶帆
'**日期:2006-08-1715:43:42
'**修改人:
'**日期:
'**版本:V1.0.0
'*************************************************************************
PublicFunctionSendData(bytBuffer()AsByte,lngSizeAsLong)AsLong
OnErrorGoToToExit'打开错误陷阱
'------------------------------------------------
If(m_Handle=0)Then
SendData=1
ExitFunction
EndIf
DimdwBytesWrittenAsLong
DimbWriteStatAsLong
DimComStatsAsComStat
DimdwErrorFlagsAsLong
dwBytesWritten=lngSize
CallClearCommError(m_Handle,dwErrorFlags,ComStats)
bWriteStat=WriteFile(m_Handle,bytBuffer(0),lngSize,dwBytesWritten,m_OverlappedWrite)
IfbWriteStat=0Then
IfGetLastError()=ERROR_IO_PENDINGThen
CallGetOverlappedResult(m_Handle,m_OverlappedWrite,dwBytesWritten,1)'等待直到发送完毕
EndIf
Else
dwBytesWritten=0
EndIf
SendData=dwBytesWritten
'------------------------------------------------
ExitFunction
'----------------
ToExit:
SendData=-1
EndFunction
'*************************************************************************
'**函数名:ReadData
'**输入:bytBuffer()(Byte)-数据
'**:lngSize(Long)-数据长度
'**输出:(Long)-
'**功能描述:读取数据
'**全局变量:
'**调用模块:
'**作者:叶帆
'**日期:2006-08-1716:04:38
'**修改人:
'**日期:
'**版本:V1.0.0
'*************************************************************************
PublicFunctionReadData(bytBuffer()AsByte,lngSizeAsLong,OptionalOvertimeAsLong=3000)AsLong
OnErrorGoToToExit'打开错误陷阱
'------------------------------------------------
If(m_Handle=0)Then
ReadData=1
ExitFunction
EndIf
DimlngBytesReadAsLong
DimfReadStatAsLong
DimdwResAsLong
lngBytesRead=lngSize
'读数据
fReadStat=ReadFile(m_Handle,bytBuffer(0),lngSize,lngBytesRead,m_OverlappedRead)
IffReadStat=0Then
IfGetLastError()=ERROR_IO_PENDINGThen'重叠I/O操作在进行中
dwRes=WaitForSingleObject(m_OverlappedRead.hEvent,Overtime)'等待,直到超时
SelectCasedwRes
CaseWAIT_OBJECT_0:'读完成
IfGetOverlappedResult(m_Handle,m_OverlappedRead,lngBytesRead,0)=0Then
'错误
ReadData=-2
ExitFunction
EndIf
CaseWAIT_TIMEOUT:'超时
ReadData=-1
ExitFunction
CaseElse:'WaitForSingleObject错误
EndSelect
EndIf
EndIf
ReadData=lngBytesRead
'------------------------------------------------
ExitFunction
'----------------
ToExit:
ReadData=-1
EndFunction
'*************************************************************************
'**函数名:Class_Terminate
'**输入:无
'**输出:无
'**功能描述:
'**全局变量:
'**调用模块:
'**作者:叶帆
'**日期:2006-08-1716:36:21
'**修改人:
'**日期:
'**版本:V1.0.0
'*************************************************************************
PrivateSubClass_Terminate()
CallClosePort
EndSub
分享到:
相关推荐
使用Win32API实现Windows下异步串口通讯:目录:1. 异步非阻塞串口通讯的优点2. 异步非阻塞串口通讯的基本原理3. 异步非阻塞串口通讯的基础知识4. 异步非阻塞串口通讯的实现步骤
使用Win32API实现Windows下异步串口通讯 目录:1.异步非阻塞串口通讯的优点2.异步非阻塞串口通讯的基本原理3.异步非阻塞串口通讯的基础知识4.异步非阻塞串口通讯的实现步骤一,异步非阻塞串口通讯的优点读写...
异步读写串口API 异步读写串口API 异步读写串口API
WinApi操作串口(异步方式),无法正确接收数据,欢迎大家指点
根据网上资料的整理,写了个API收发串口的小程序,走的标准232协议,没写modbus之类的,新手上路可以学习一下通信方式,用的同步方式,因为异步方式大部分情况不需要,一般上位机很少会碰到1ms一收发速度的串口硬件...
多线程异步串口通信, 通过底层API实现,VS2010 vs2015环境编码
自己写的。串口读写,自己设置串口号,波特率,校验,字节位数,停止位,异步发送读取串口数据 自己写的。串口读写,自己设置串口号,波特率,校验,字节位数,停止位,异步发送读取串口数据
以上简要介绍了大部分的串口通信api 函数,笔者所写的串口通信软件用的是事件通知方式,该方式 是windows2000 下效率较高的一种方式。而且只熟悉这些api 函数也还是不够的,该机制下还要牵涉到多线 程和消息机制,...
一点API串口通信基本函数的操作,包含了打开文件,设置串口,读写文件,异步I/O操作等等
DR 将./web_serial_onboard_led.ino的代码上传到您的Arduino设备通过访问chrome:// flags /#enable-experimental-web-platform-features启用Chrome的实验性Web平台功能在本地运行演示应用使用Web应用程序的“连接...
自写的一段用于读写串口的程序,此程序我是用来接收无线信号和发送无线信号数据的。感觉有点繁琐,但是还是想不出比这更好的办法。
4.4 Win32 API串口通信编程的一般流程和特殊实例 4.4.1 Win32 API串口通信编程的一般流程 4.4.2 用查询方式读串口 4.4.3同步I/O读写数据 4.4.4 关于流控制的设置问题 4.5 CSerialPort类中的API函数编程...
书中精选来自工程实践的应用范例,主要涵盖串口通信的理论基础、Visual c++集成开发环境简介、MSComm控件串口编程、Windows API串口编程、TAPI通信编程、串口实现双机互连、串口调试精灵、串口控制Modem设备、串口...
4.4 win32 api串口通信编程的一般流程和特殊实例 116 4.4.1 win32 api串口通信编程的一般流程 116 4.4.2 用查询方式读串口 116 4.4.3 同步i/o读写数据 117 4.4.4 关于流控制的设置问题 118 4.5 cserialport类中...
4.4 win32 api串口通信编程的一般流程和特殊实例 116 4.4.1 win32 api串口通信编程的一般流程 116 4.4.2 用查询方式读串口 116 4.4.3 同步i/o读写数据 117 4.4.4 关于流控制的设置问题 118 4.5 cserialport类中...
4.4 Win32 API串口通信编程的一般流程和特殊实例 116 4.4.1 Win32 API串口通信编程的一般流程 116 4.4.2 用查询方式读串口 116 4.4.3 同步I/O读写数据 117 4.4.4 关于流控制的设置问题 118 4.5 CSerialPort类中的API...
支持USB串口芯片,CH34X系列,CP21XX系列,Ftdi系列,采用基于安卓的USB访问API实现,支持跨平台安卓处理器,不需要编译二进制USB驱动支持,读写支持异步,直接加载到工程,直接使用
4.4 win32 api串口通信编程的一般流程和特殊实例 116 4.4.1 win32 api串口通信编程的一般流程 116 4.4.2 用查询方式读串口 116 4.4.3 同步i/o读写数据 117 4.4.4 关于流控制的设置问题 118 4.5 cserialport类中...
4.4 Win32 API串口通信编程的一般流程和特殊实例 116 4.4.1 Win32 API串口通信编程的一般流程 116 4.4.2 用查询方式读串口 116 4.4.3 同步I/O读写数据 117 4.4.4 关于流控制的设置问题 118 4.5 CSerialPort类中的API...
支持USB串口芯片,CH34X系列,CP21XX系列,Ftdi系列,采用基于安卓的USB访问API实现,支持跨平台安卓处理器,不需要编译二进制USB驱动支持,读写支持异步,直接加载到工程,直接使用,压缩包含有JAR包和demo工程,...