StopBitsVBA 中使用 API 串口通信 Serial Port (英文)

declare_serial  时间:2021-02-14  阅读:()

'

-------------------------------------------------------------------------------

'

' 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.

HostDare($33.79/年)CKVM和QKVM套餐 可选CN2 GIA线路

关于HostDare服务商在之前的文章中有介绍过几次,算是比较老牌的服务商,但是商家背景财力不是特别雄厚,算是比较小众的个人服务商。目前主流提供CKVM和QKVM套餐。前者是电信CN2 GIA,不过库存储备也不是很足,这不九月份发布新的补货库存活动,有提供九折优惠CN2 GIA,以及六五折优惠QKVM普通线路方案。这次活动截止到9月30日,不清楚商家这次库存补货多少。比如 QKVM基础的五个方案都...

DMIT:美国cn2 gia线路vps,高性能 AMD EPYC/不限流量(Premium Unmetered),$179.99/月起

DMIT怎么样?DMIT最近动作频繁,前几天刚刚上架了日本lite版VPS,正在酝酿上线日本高级网络VPS,又差不多在同一时间推出了美国cn2 gia线路不限流量的美国云服务器,不过价格太过昂贵。丐版只有30M带宽,月付179.99美元 !!目前,美国云服务器已经有个4个套餐,分别是,Premium(cn2 gia线路)、Lite(普通直连)、Premium Secure(带高防的cn2 gia线...

博鳌云¥799/月,香港110Mbps(含10M CN2)大带宽独立服务器/E3/8G内存/240G/500G SSD或1T HDD

博鳌云是一家以海外互联网基础业务为主的高新技术企业,运营全球高品质数据中心业务。自2008年开始为用户提供服务,距今11年,在国人商家中来说非常老牌。致力于为中国用户提供域名注册(国外接口)、免费虚拟主机、香港虚拟主机、VPS云主机和香港、台湾、马来西亚等地服务器租用服务,各类网络应用解決方案等领域的专业网络数据服务。商家支持支付宝、微信、银行转账等付款方式。目前香港有一款特价独立服务器正在促销,...

declare_serial为你推荐
文件夹删不掉文件夹删不掉怎么办中国联通话费查询中国联通话费查询拨打什么号郭吉军新媒体营销的咨询行业有哪些好的老师?伪装微信地理位置怎么伪装微信地理位置?淘宝收费淘宝要收费吗?无线路由器限速设置无线路由器限速怎么设置!渗透测试渗透测试的专业服务伪静态怎么做伪静态?显卡温度多少正常电脑显卡温度多少正常?网易公开课怎么下载如何将网易公开课下载到电脑上?
网站虚拟主机空间 备案域名出售 flashfxp怎么用 百度云100as 名片模板psd win8升级win10正式版 godaddy域名证书 免空 hostker ntfs格式分区 刀片式服务器 135邮箱 天翼云盘 卡巴斯基破解版 net空间 广东主机托管 测试网速命令 买空间网 广东服务器托管 windowssever2008 更多