'
-------------------------------------------------------------------------------
'
' This VB module is a collection of routines to perform serial port I/O without' using the Microsoft Comm Control component. This module uses the Windows API' to perform the overlapped I/O operations necessary for serial communications.'
' The routine can handle up to 4 serial ports which are identified with a
' Port ID.
'
'All routines (with the exception of CommRead and CommWrite) return an error' code or 0 if no error occurs. The routine CommGetError can be used to get' the complete error message.
'
-------------------------------------------------------------------------------
'
-------------------------------------------------------------------------------
' Public Constants
'
-------------------------------------------------------------------------------
'Output Control Lines (CommSetLine)
Const LINE_BREAK= 1
Const LINE_DTR= 2
Const LINE_RTS = 3
' Input Control Lines (CommGetLine)
Const LINE_CTS =&H10&
Const LINE_DSR=&H20&
Const LINE_RING=&H40&
Const LINE_RLSD=&H80&
Const LINE_CD=&H80&
'
-------------------------------------------------------------------------------
' System Constants
'
-------------------------------------------------------------------------------
Private Const ERROR_IO_INCOMPLETE = 996&
Private Const ERROR_IO_PENDING= 997
Private Const GENERIC_READ=&H80000000
Private Const GENERIC_WRITE=&H40000000
Private Const FILE_ATTRIBUTE_NORMAL =&H80
Private Const FILE_FLAG_OVERLAPPED=&H40000000
Private Const FORMAT_MESSAGE_FROM_SYSTEM=&H1000
Private Const OPEN_EXISTING= 3
' COMM Functions
Private Const MS_CTS_ON=&H10&
Private Const MS_DSR_ON=&H20&
Private Const MS_RING_ON=&H40&
Private Const MS_RLSD_ON=&H80&
Private Const PURGE_RXABORT =&H2
Private Const PURGE_RXCLEAR=&H8
Private Const PURGE_TXABORT =&H1
Private Const PURGE_TXCLEAR=&H4
' COMM Escape Functions
Private Const CLRBREAK= 9
Private Const CLRDTR= 6
Private Const CLRRTS = 4
Private Const SETBREAK= 8
Private Const SETDTR= 5
Private Const SETRTS = 3
'
-------------------------------------------------------------------------------
' System Structures
'
-------------------------------------------------------------------------------
Private Type COMSTATfBitFields As Long ' See Comment in Win32API.TxtcbInQue As LongcbOutQue As Long
End Type
Private Type COMMTIMEOUTS
ReadIntervalTimeout As Long
ReadTotalTimeoutMultiplier As Long
ReadTotalTimeoutConstant As Long
WriteTotalTimeoutMultiplier As Long
WriteTotalTimeoutConstant As Long
End Type
'
' The DCB structure defines the control setting for a serial
' communications device.
'
Private Type DCB
DCBlength As Long
BaudRate As LongfBitFields As Long ' See Comments in Win32API.TxtwReserved As Integer
XonLim As Integer
XoffLim As Integer
ByteSize As Byte
Parity As Byte
StopBits As Byte
XonChar As Byte
XoffChar As Byte
ErrorChar As Byte
EofChar As Byte
EvtChar As BytewReserved1 As Integer 'Reserved;Do Not Use
End Type
Private Type OVERLAPPED
Internal As Long
InternalHigh As Longoffset As Long
OffsetHigh As LonghEvent As Long
End Type
Private Type SECURITY_ATTRIBUTESnLength As LonglpSecurityDescriptor As LongbInheritHandle As Long
End Type
'
-------------------------------------------------------------------------------
' System Functions
'
-------------------------------------------------------------------------------
'
' Fills a specified DCB structure with values specified in
' a device-control string.
'
Private Declare Function BuildCommDCB Lib "kernel32"Alias "BuildCommDCBA"
_
(ByVal lpDef As String, lpDCB As DCB)As Long
'
'Retrieves information about a communications error and reports
' the current status of a communications device. The function is
' called when a communications error occurs, and it clears the
' device's error flag to enable additional input and output
' (I/O) operations.
'
Private Declare Function ClearCommError Lib "kernel32" _
(ByVal hFile As Long, lpErrors As Long, lpStat As COMSTAT)As Long
'
' Closes an open communications device or file handle.
'
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)As Long'
' Creates or opens a communications resource and returns a handle
' that can be used to access the resource.
'
Private Declare Function CreateFile Lib "kernel32"Alias "CreateFileA" _
(ByVal lpFileName As String,ByVal dwDesiredAccess As Long, _
ByVal dwShareMode As Long, lpSecurityAttributes As Any, _
ByVal dwCreationDisposition As Long,ByVal dwFlagsAndAttributes As Long, _
ByVal hTemplateFile As Long)As Long
'
'Directs a specified communications device to perform a function.
'
Private Declare Function EscapeCommFunction Lib "kernel32" _
(ByVal nCid As Long,ByVal nFunc As Long)As Long
'
' by anoher function.
'
Private Declare Function FormatMessage Lib "kernel32"Alias "FormatMessageA" _(ByVal dwFlags As Long, lpSource As Any,ByVal dwMessageId As Long, _ByVal dwLanguageId As Long,ByVal lpBuffer As String,ByVal nSize As Long, _Arguments As Long)As Long
'
'Retrieves modem control-register values.
'
Private Declare Function GetCommModemStatus Lib "kernel32" _
(ByVal hFile As Long, lpModemStat As Long)As Long
'
'Retrieves the current control settings for a specified
' communications device.
'
Private Declare Function GetCommState Lib "kernel32" _
(ByVal nCid As Long, lpDCB As DCB)As Long
'
'Retrieves the calling thread's last-error code value.
'
Private Declare Function GetLastError Lib "kernel32" ()As Long
'
'Retrieves the results of an overlapped operation on the
' specified file, named pipe, or communications device.
'
Private Declare Function GetOverlappedResult Lib "kernel32" _
(ByVal hFile As Long, lpOverlapped As OVERLAPPED, _lpNumberOfBytesTransferred As Long,ByVal bWait As Long)As Long
'
'Discards all characters from the output or input buffer of a
' specified communications resource. It can also terminate
' pending read or write operations on the resource.
'
Private Declare Function PurgeComm Lib "kernel32" _
(ByVal hFile As Long,ByVal dwFlags As Long)As Long
'
'Reads data from a file, starting at the position indicated by the
' file pointer.After the read operation has been completed, the
' file pointer is adjusted by the number of bytes actually read,
' unless the file handle is created with the overlapped attribute.
' If the file handle is created for overlapped input and output
' (I/O), the application must adjust the position of the file pointer
' after the read operation.
'
Private Declare Function ReadFile Lib "kernel32" _
(ByVal hFile As Long,ByVal lpBuffer As String, _
ByVal nNumberOfBytesToRead As Long,ByRef lpNumberOfBytesRead As Long, _lpOverlapped As OVERLAPPED)As Long
'
' Configures a communications device according to the specifications
' in a device-control block (a DCB structure). The function
' reinitializes all hardware and control settings, but it does not
' empty output or input queues.
'
Private Declare Function SetCommState Lib "kernel32" _
(ByVal hCommDev As Long, lpDCB As DCB)As Long
'
' Sets the time-out parameters for all read and write operations on a
' specified communications device.
'
Private Declare Function SetCommTimeouts Lib "kernel32" _
(ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS)As Long
'
' Initializes the communications parameters for a specified
' communications device.
'
Private Declare Function SetupComm Lib "kernel32" _
(ByVal hFile As Long,ByVal dwInQueue As Long,ByVal dwOutQueue As Long)As Long'
'Writes data to a file and is designed for both synchronous and a
' synchronous operation.The function starts writing data to the file
' at the position indicated by the file pointer.After the write
' operation has been completed, the file pointer is adjusted by the
' number of bytes actually written, except when the file is opened with
' FILE_FLAG_OVERLAPPED. If the file handle was created for overlapped
' input and output (I/O), the application must adjust the position of
' the file pointer after the write operation is finished.
'
Private Declare Function WriteFile Lib "kernel32" _
(ByVal hFile As Long,ByVal lpBuffer As String, _
ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, _lpOverlapped As OVERLAPPED)As Long
Private Declare Sub AppSleep Lib "kernel32"Alias "Sleep" (ByVal dwMilliseconds As Long)'
-------------------------------------------------------------------------------
'
-------------------------------------------------------------------------------
Private Const MAX_PORTS = 4
'
-------------------------------------------------------------------------------
' Program Structures
'
-------------------------------------------------------------------------------
Private Type COMM_ERRORlngErrorCode As LongstrFunction As String
strErrorMessage As String
End Type
Private Type COMM_PORTlngHandle As LongblnPortOpen As BooleanudtDCB As DCB
End Type
'
-------------------------------------------------------------------------------
' Program Storage
'
-------------------------------------------------------------------------------
Private udtCommOverlap As OVERLAPPED
Private udtCommError As COMM_ERROR
Private udtPorts(1 To MAX_PORTS)As COMM_PORT
'
-------------------------------------------------------------------------------
'GetSystemMessage -Gets system error text for the specified error code.
'
-------------------------------------------------------------------------------
Public Function GetSystemMessage(lngErrorCode As Long)As String
Dim intPos As Integer
Dim strMessage As String, strMsgBuff As String * 256
Call FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, lngErrorCode, 0, strMsgBuff,255, 0)intPos = InStr(1, strMsgBuff, vbNullChar)
If intPos > 0 ThenstrMessage = Trim$(Left$(strMsgBuff, intPos - 1))
ElsestrMessage = Trim$(strMsgBuff)
End If
GetSystemMessage = strMessage
End Function
Public Function PauseApp(PauseInSeconds As Long)
Call AppSleep(PauseInSeconds * 1000)
End Function
'
-------------------------------------------------------------------------------
' CommOpen -Opens/Initializes serial port.
'
'
' Parameters:
' intPortID - Port ID used when port was opened.
' strPort -COM port name. (COM1,COM2,COM3,COM4)
' strSettings -Communication settings.
' Example: "baud=9600 parity=N data=8 stop=1"
'
'Returns:
' Error Code - 0 =No Error.
'
'
-------------------------------------------------------------------------------
Public Function CommOpen(intPortID As Integer, strPort As String, _strSettings As String)As Long
Dim lngStatus As Long
Dim udtCommTimeOuts As COMMTIMEOUTS
On Error GoTo Routine_Error
' See if port already in use.
If udtPorts(intPortID).blnPortOpen ThenlngStatus = -1
With udtCommError
.lngErrorCode = lngStatus
.strFunction = "CommOpen"
.strErrorMessage = "Port in use."
End With
GoTo Routine_Exit
End If
'Open serial port.udtPorts(intPortID).lngHandle =CreateFile(strPort,GENERIC_READ Or _
GENERIC_WRITE, 0,ByVal 0&,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)If udtPorts(intPortID).lngHandle = -1 ThenlngStatus = SetCommError("CommOpen (CreateFile)")
GoTo Routine_Exit
End IfudtPorts(intPortID).blnPortOpen = True
' Setup device buffers (1K each).lngStatus = SetupComm(udtPorts(intPortID).lngHandle, 1024, 1024)
If lngStatus = 0 ThenlngStatus = SetCommError("CommOpen (SetupComm)")
GoTo Routine_Exit
End If
' Purge buffers.lngStatus = PurgeComm(udtPorts(intPortID).lngHandle, PURGE_TXABORT Or _
PURGE_RXABORT Or PURGE_TXCLEAR Or PURGE_RXCLEAR)
If lngStatus = 0 ThenlngStatus = SetCommError("CommOpen (PurgeComm)")
GoTo Routine_Exit
End If
' Set serial port timeouts.
With udtCommTimeOuts
.ReadIntervalTimeout = -1
.ReadTotalTimeoutMultiplier = 0
.ReadTotalTimeoutConstant = 1000
.WriteTotalTimeoutMultiplier = 0
.WriteTotalTimeoutMultiplier = 1000
End WithlngStatus = SetCommTimeouts(udtPorts(intPortID).lngHandle, udtCommTimeOuts)If lngStatus = 0 ThenlngStatus = SetCommError("CommOpen (SetCommTimeouts)")
GoTo Routine_Exit
End If
'Get the current state (DCB).lngStatus =GetCommState(udtPorts(intPortID).lngHandle, _udtPorts(intPortID).udtDCB)
If lngStatus = 0 ThenlngStatus = SetCommError("CommOpen (GetCommState)")
GoTo Routine_Exit
End If
'Modify the DCB to reflect the desired settings.lngStatus = BuildCommDCB(strSettings, udtPorts(intPortID).udtDCB)
If lngStatus = 0 ThenlngStatus = SetCommError("CommOpen (BuildCommDCB)")
GoTo Routine_Exit
End If
' Set the new state.lngStatus = SetCommState(udtPorts(intPortID).lngHandle, _udtPorts(intPortID).udtDCB)
If lngStatus = 0 ThenlngStatus = SetCommError("CommOpen (SetCommState)")
GoTo Routine_Exit
End IflngStatus = 0
Routine_Exit:
CommOpen = lngStatus
Exit Function
Routine_Error:
lngStatus = Err.Number
With udtCommError
.lngErrorCode = lngStatus
.strFunction = "CommOpen"
.strErrorMessage =Err.Description
End With
Resume Routine_Exit
End Function
Private Function SetCommError(strFunction As String)As Long
With udtCommError
.lngErrorCode = Err.LastDllError
.strFunction = strFunction
.strErrorMessage =GetSystemMessage(.lngErrorCode)
SetCommError = .lngErrorCode
End With
End Function
Private Function SetCommErrorEx(strFunction As String, lngHnd As Long)As LongDim lngErrorFlags As Long
Dim udtCommStat As COMSTAT
With udtCommError
.lngErrorCode =GetLastError
.strFunction = strFunction
.strErrorMessage =GetSystemMessage(.lngErrorCode)
Call ClearCommError(lngHnd, lngErrorFlags, udtCommStat)
.strErrorMessage = .strErrorMessage&" COMM Error Flags = "&_
Hex$(lngErrorFlags)
SetCommErrorEx = .lngErrorCode
End With
End Function
'
-------------------------------------------------------------------------------
' CommSet -Modifies the serial port settings.
'
' Parameters:
' intPortID - Port ID used when port was opened.
欧路云 主要运行弹性云服务器,可自由定制配置,可选加拿大的480G超高防系列,也可以选择美国(200G高防)系列,也有速度直逼内地的香港CN2系列。所有配置都可以在下单的时候自行根据项目 需求来定制自由升级降级 (降级按天数配置费用 退款回预存款)。由专业人员提供一系列的技术支持!官方网站:https://www.oulucloud.com/云服务器(主机测评专属优惠)全场8折 优惠码:zhuji...
hosthatch在做美国独立日促销,可能你会说这操作是不是晚了一个月?对,为了准备资源等,他们拖延到现在才有空,这次是针对自己全球14个数据中心的VPS。提前示警:各个数据中心的网络没有一个是针对中国直连的,都会绕道而且ping值比较高,想买的考虑清楚再说!官方网站:https://hosthatch.com所有VPS都基于KVM虚拟,支持PayPal在内的多种付款方式!芝加哥(大硬盘)VPS5...
cyun怎么样?cyun蓝米数据是一家(香港)藍米數據有限公司旗下品牌,蓝米云、蓝米主机等同属于该公司品牌。CYUN全系列云产品采用KVM架构,SSD磁盘阵列,优化线路,低延迟,高稳定。目前,cyun推出的香港云服务器性价比超高,香港cn2 gia云服务器,1核1G1M/系统盘+20G数据盘,低至29元/月起;香港多ip站群云服务器,16个ip/4核4G仅220元/月起,希望买香港站群服务器的站长...