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.

ZJI(月付450元),香港华为云线路服务器、E3服务器起

ZJI发布了9月份促销信息,针对香港华为云线路物理服务器华为一型提供立减300元优惠码,优惠后香港华为一型月付仅450元起。ZJI是原来Wordpress圈知名主机商家:维翔主机,成立于2011年,2018年9月更名为ZJI,提供中国香港、台湾、日本、美国独立服务器(自营/数据中心直营)租用及VDS、虚拟主机空间、域名注册等业务,商家所选数据中心均为国内访问质量高的机房和线路,比如香港阿里云、华为...

Virmach$7.2/年,新款月抛vps上线,$3.23/半年,/1核640M内存/10 GB存储/ 1Gbps/1T流量

Virmach自上次推出了短租30天的VPS后,也就是月抛型vps,到期不能续费,直接终止服务。此次又推出为期6个月的月抛VPS,可选圣何塞和水牛城机房,适合短期有需求的用户,有兴趣的可以关注一下。VirMach是一家创办于2014年的美国商家,支持支付宝、PayPal等方式,是一家主营廉价便宜VPS服务器的品牌,隶属于Virtual Machine Solutions LLC旗下!在廉价便宜美国...

特网云(1050元),IP数5 个可用 IP (/29) ,美国高防御服务器 无视攻击

特网云特网云为您提供高速、稳定、安全、弹性的云计算服务计算、存储、监控、安全,完善的云产品满足您的一切所需,深耕云计算领域10余年;我们拥有前沿的核心技术,始终致力于为政府机构、企业组织和个人开发者提供稳定、安全、可靠、高性价比的云计算产品与服务。官方网站:https://www.56dr.com/ 10年老品牌 值得信赖 有需要的请联系======================特网云美国高防御...

declare_serial为你推荐
博客外链请问怎么利用博客做外链呢无线路由器限速设置无线路由器速度如何设置?吴晓波频道买粉罗辑思维,晓松奇谈,鸿观,吴晓波频道,财经郎眼哪个更有深度1433端口怎么开启本机1433端口arm开发板开发板是什么?如ARM开发板,DSP开发板等。。它和最终目标板有何区别?显卡温度多少正常显卡温度多少正常中小企业信息化信息化为中小企业发展带来了哪些机遇滚动代码来回滚动代码神雕侠侣礼包大全神雕侠侣手游每天送的元宝买什么合适怎么点亮qq空间图标如何点亮QQ空间图标
网站备案域名查询 万网域名空间 中国域名交易中心 淘宝抢红包攻略 新秒杀 enzu omnis 美国便宜货网站 天猫双十一秒杀 远程登陆工具 京东商城0元抢购 可外链网盘 空间租赁 网页提速 新加坡空间 德讯 永久免费空间 杭州电信宽带优惠 购买空间 攻击服务器 更多