JustinIO的vb.NET版本!(串口操作类)
发表于:2007-06-30来源:作者:点击数:
标签:
Imports System Imports System.Runtime.InteropServices Namespace JustinIO Class CommPort Public PortNum As String Public BaudRate As Integer Public ByteSize As Byte Public Parity As Byte @#// 0-4=no,odd,even,mark,space Public StopBits As Byt
Imports System
Imports System.Runtime.InteropServices
Namespace JustinIO
Class CommPort
Public PortNum As String
Public BaudRate As Integer
Public ByteSize As Byte
Public Parity As Byte @#// 0-4=no,odd,even,mark,space
Public StopBits As Byte @#// 0,1,2 = 1, 1.5, 2
Public ReadTimeout As Integer @#//comm port win32 file handle
Private hComm As Integer = -1
Public Opened As Boolean = False
@#//win32 api const
ants
Private Const GENERIC_READ As Int64 = &H80000000
Private Const GENERIC_WRITE As Int64 = &H40000000
Private Const OPEN_EXISTING As Integer = 3
Private Const INVALID_HANDLE_VALUE As Integer = -1
#Region "struct"
<StructLayout(LayoutKind.Sequential)> _
Public Structure DCB
@#//taken from c struct in platform sdk
Public DCBlength As Integer @#// sizeof(DCB)
Public BaudRate As Integer @#// 指定当前波特率 current baud rate
@#// these are the c struct bit fields, bit twiddle flag to set
Public fBinary As Integer @#// 指定是否允许二进制模式,在
windows95中必须主TRUE binary mode, no EOF check
Public fParity As Integer @#// 指定是否允许奇偶校验 enable parity checking
Public fOutxCtsFlow As Integer @#// 指定CTS是否用于检测发送控制,当为TRUE是CTS为OFF,发送将被挂起。 CTS output flow control
Public fOutxDsrFlow As Integer @#// 指定CTS是否用于检测发送控制 DSR output flow control
Public fDtrControl As Integer @#// DTR_CONTROL_DISABLE值将DTR置为OFF, DTR_CONTROL_ENABLE值将DTR置为ON, DTR_CONTROL_HANDSHAKE允许DTR"握手" DTR flow control type
Public fDsrSensitivity As Integer @#// 当该值为TRUE时DSR为OFF时接收的字节被忽略 DSR sensitivity
Public fTXContinueOnXoff As Integer @#// 指定当接收缓冲区已满,并且驱动程序已经发送出XoffChar字符时发送是否停止。TRUE时,在接收缓冲区接收到缓冲区已满的字节XoffLim且驱动程序已经发送出XoffChar字符中止接收字节之后,发送继续进行。 FALSE时,在接收缓冲区接收到代表缓冲区已空的字节XonChar且驱动程序已经发送出恢复发送的XonChar之后,发送继续进行。XOFF continues Tx
Public fOutX As Integer @#// TRUE时,接收到XoffChar之后便停止发送接收到XonChar之后将重新开始 XON/XOFF out flow control
Public fInX As Integer @#// TRUE时,接收缓冲区接收到代表缓冲区满的XoffLim之后,XoffChar发送出去接收缓冲区接收到代表缓冲区空的XonLim之后,XonChar发送出去 XON/XOFF in flow control
Public fErrorChar As Integer @#// 该值为TRUE且fParity为TRUE时,用ErrorChar 成员指定的字符代替奇偶校验错误的接收字符 enable error replacement
Public fNull As Integer @#// eTRUE时,接收时去掉空(0值)字节 enable null stripping
Public fRtsControl As Integer @#// RTS flow control
@#/*RTS_CONTROL_DISABLE时,RTS置为OFF
@# * RTS_CONTROL_ENABLE时, RTS置为ON
@# * RTS_CONTROL_HANDSHAKE时,
@# * 当接收缓冲区小于半满时RTS为ON
@# * 当接收缓冲区超过四分之三满时RTS为OFF
@# * RTS_CONTROL_TOGGLE时,
@# * 当接收缓冲区仍有剩余字节时RTS为ON ,否则缺省为OFF*/
Public fAbortOnError As Integer @#// TRUE时,有错误发生时中止读和写操作 abort on error
Public fDummy2 As Integer @#// 未使用 reserved
Public flags As Int64
Public wReserved As UInt16 @#// 未使用,必须为0 not currently used
Public XonLim As UInt16 @#// 指定在XON字符发送这前接收缓冲区中可允许的最小字节数 transmit XON threshold
Public XoffLim As UInt16 @#// 指定在XOFF字符发送这前接收缓冲区中可允许的最小字节数 transmit XOFF threshold
Public ByteSize As Byte @#// 指定端口当前使用的数据位 number of bits/byte, 4-8
Public Parity As Byte @#// 指定端口当前使用的奇偶校验方法,可能为:EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY 0-4=no,odd,even,mark,space
Public StopBits As Byte @#// 指定端口当前使用的停止位数,可能为:ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS 0,1,2 = 1, 1.5, 2
Public XonChar As Char @#// 指定用于发送和接收字符XON的值 Tx and Rx XON character
Public XoffChar As Char @#// 指定用于发送和接收字符XOFF值 Tx and Rx XOFF character
Public ErrorChar As Char @#// 本字符用来代替接收到的奇偶校验发生错误时的值 error replacement character
Public EofChar As Char @#// 当没有使用二进制模式时,本字符可用来指示数据的结束 end of input character
Public EvtChar As Char @#// 当接收到此字符时,会产生一个事件 received event character
Public wReserved1 As UInt16 @#// 未使用 reserved; do not use
End Structure
<StructLayout(LayoutKind.Sequential)> _
Private Structure COMMTIMEOUTS
Public ReadIntervalTimeout As Integer
Public ReadTotalTimeoutMultiplier As Integer
Public ReadTotalTimeoutConstant As Integer
Public WriteTotalTimeoutMultiplier As Integer
Public WriteTotalTimeoutConstant As Integer
End Structure
<StructLayout(LayoutKind.Sequential)> _
Private Structure OVERLAPPED
Public Internal As Integer
Public InternalHigh As Integer
Public Offset As Integer
Public OffsetHigh As Integer
Public hEvent As Integer
End Structure
#End Region
#Region "
Windows API"
<DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function CreateFile( _
ByVal lpFileName As String, _
ByVal dwDesiredA
clearcase/" target="_blank" >ccess As UInt32, _
ByVal dwShareMode As Integer, _
ByVal lpSecurityAttributes As Integer, _
ByVal dwCreationDisposition As Integer, _
ByVal dwFlagsAndAttributes As Integer, _
ByVal hTemplateFile As Integer) As Integer
End Function
@#参数介绍:
@#lpFileName 要打开的串口名称
@#dwDesiredAccess 指定串口的访问方式,一般设置为可读可写方式
@#dwShareMode 指定串口的共享模式,串口不能共享,所以设置为0
@#lpSecurityAttributes 设置串口的
安全属性,WIN9X下不支持,应设为NULL
@#dwCreationDisposition 对于串口通信,创建方式只能为OPEN_EXISTING
@#dwFlagsAndAttributes 指定串口属性与标志,设置为FILE_FLAG_OVERLAPPED(重叠I/O操作),指定串口以异步方式通信
@#hTemplateFile 对于串口通信必须设置为NULL
<DllImport("kernel32.dll")> _
Private Shared Function GetCommState(ByVal hFile As Integer, ByRef lpDCB As DCB) As Boolean
End Function
@#参数介绍
@#hFile 通信设备句柄
@#DCB lpDCB 设备控制块DCB
<DllImport("kernel32.dll")> _
Private Shared Function BuildCommDCB(ByVal lpDef As String, ByRef lpDCB As DCB) As Boolean
End Function
@#参数介绍
@#lpDef 设备控制字符串
@#lpDCB 设备控制块DCB
<DllImport("kernel32.dll")> _
Private Shared Function SetCommState(ByVal hfile As Integer, ByRef lpDCB As DCB) As Boolean
End Function
@#参数说明
@#hFile 通信设备句柄
@#lpDCB 设备控制块
<DllImport("kernel32.dll")> _
Private Shared Function GetCommTimeouts(ByVal hfile As Integer, ByRef lpCommTimeouts As COMMTIMEOUTS) As Boolean
End Function
@#参数说明
@#hFile 通信设备句柄 handle to comm device
@#lpCommTimeouts 超时时间 time-out values
<DllImport("kernel32.dll")> _
Private Shared Function SetCommTimeouts(ByVal hfile As Integer, ByRef lpCommTimeouts As COMMTIMEOUTS) As Boolean
End Function
@#参数说明
@#hFile 通信设备句柄 handle to comm device
@#lpCommTimeouts 超时时间 time-out values
<DllImport("kernel32.dll")> _
Private Shared Function ReadFile(ByVal hFile As Integer, ByVal lpBuffer() As Byte, _
ByVal nNumberOfBytesToRead As Integer, ByRef lpNumberOfBytesRead As Integer, _
ByRef lpOverlapped As OVERLAPPED) As Boolean
End Function
@#参数说明
@#hFile 通信设备句柄 handle to file
@#lpBuffer 数据缓冲区 data buffer
@#nNumberOfBytesToRead 多少字节等待读取 number of bytes to read
@#lpNumberOfBytesRead 读取多少字节 number of bytes read
@#lpOverlapped 溢出缓冲区 overlapped buffer
<DllImport("kernel32.dll")> _
Private Shared Function WriteFile(ByVal hFile As Integer, ByVal lpBuffer() As Byte, _
ByVal nNumberOfBytesToRead As Integer, ByRef lpNumberOfBytesWritten As Integer, _
ByRef lpOverlapped As OVERLAPPED) As Boolean
End Function
@#参数介绍
@#hFile 通信设备句柄 handle to file
@#lpBuffer 数据缓冲区 data buffer
@#nNumberOfBytesToWrite 多少字节等待写入 number of bytes to write
@#lpNumberOfBytesWritten 已经写入多少字节 number of bytes written
@#lpOverlapped 溢出缓冲区 overlapped buffer
<DllImport("kernel32.dll")> _
Private Shared Function CloseHandle(ByVal hObject As Integer) As Boolean
End Function
@#参数hObject 要被关闭的句柄 handle to object
<DllImport("kernel32.dll")> _
Private Shared Function GetLastError() As UInt32
End Function
#End Region
Public Sub open()
Dim dcbCommPort As New DCB
Dim ctoCommPort As New COMMTIMEOUTS
@#// 打开串口 OPEN THE COMM PORT.
hComm = CreateFile(PortNum, UInt32.Parse(GENERIC_READ Or GENERIC_WRITE), 0, 0, OPEN_EXISTING, 0, 0)
@#// 如果串口没有打开,就打开 IF THE PORT CANNOT BE OPENED, BAIL OUT.
If hComm = INVALID_HANDLE_VALUE Then
Throw (New ApplicationException("非法操作,不能打开串口!"))
End If
@#// 设置通信超时时间 SET THE COMM TIMEOUTS.
GetCommTimeouts(hComm, ctoCommPort) @#ref
ctoCommPort.ReadTotalTimeoutConstant = ReadTimeout
ctoCommPort.ReadTotalTimeoutMultiplier = 0
ctoCommPort.WriteTotalTimeoutMultiplier = 0
ctoCommPort.WriteTotalTimeoutConstant = 0
SetCommTimeouts(hComm, ctoCommPort) @#ref
@#// 设置串口 SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS.
GetCommState(hComm, dcbCommPort) @#ref
dcbCommPort.BaudRate = BaudRate
dcbCommPort.flags = 0
@#//dcb.fBinary=1;
dcbCommPort.flags = dcbCommPort.flags Or (1)
If Parity > 0 Then
@#//dcb.fParity=1
dcbCommPort.flags = dcbCommPort.flags Or (2)
End If
dcbCommPort.Parity = Parity
dcbCommPort.ByteSize = ByteSize
dcbCommPort.StopBits = StopBits
If SetCommState(hComm, dcbCommPort) = False Then
@#//uint ErrorNum=GetLastError();
Throw (New ApplicationException("非法操作,不能打开串口!"))
End If
@#//unremark to see if setting took correctly
@#//DCB dcbCommPort2 = new DCB();
@#//GetCommState(hComm, ref dcbCommPort2);
Opened = True
End Sub
Public Sub Close()
If hComm <> INVALID_HANDLE_VALUE Then
CloseHandle(hComm)
End If
End Sub
Public Function Read(ByVal NumBytes As Integer) As Byte()
Dim BufBytes(NumBytes) As Byte
Dim OutBytes(0) As Byte
If (hComm <> INVALID_HANDLE_VALUE) Then
Dim ovlCommPort As New OVERLAPPED
Dim BytesRead As Integer = 0
ReadFile(hComm, BufBytes, NumBytes, BytesRead, ovlCommPort)
Array.Copy(BufBytes, OutBytes, BytesRead)
Else
Throw (New ApplicationException("串口未打开!"))
End If
Return OutBytes
End Function
Public Sub Write(ByVal WriteBytes As Byte())
If (hComm <> INVALID_HANDLE_VALUE) Then
Dim ovlCommPort As New OVERLAPPED
Dim BytesWritten As Integer
WriteFile(hComm, WriteBytes, WriteBytes.Length, BytesWritten, ovlCommPort)
Else
Throw (New ApplicationException("串口未打开!"))
End If
End Sub
End Class
End Namespace
原文转自:http://www.ltesting.net