为什么我的VB MSCOMM 不能打开16 以后的串口号
为什么我的VB MSCOMM 不能打开16 以后的串口号
MSComm1.CommPort = 16
MSComm1.PortOpen = True
可以打开但
MSComm1.CommPort = 17
MSComm1.PortOpen = True
就错误 8002 无效端口号 但17号端口 存在的 我用超级终端就能打开
这是为什么
[解决办法]
CommPort 属性
设置并返回通讯端口号。
语法
object.CommPort[ = value ]
CommPort 属性语法包括下列部分:
部分 描述
object 对象表达式,其值是“应用于”列表中的对象。
value 一整型值,说明端口号。
说明
在设计时,value 可以设置成从 1 到 16 的任何数(缺省值为 1)。但是如果用 PortOpen 属性打开一个并不存在的端口时,MSComm 控件会产生错误 68(设备无效)。
警告 必须在打开端口之前设置 CommPort 属性。
数据类型
Integer
[解决办法]
就是这样设计的。
要访问大于 16 的端口,可以用 API。主要方式:
1 利用已有的或自己写的 DLL 动态库。库中调用 API。
2 在 VB 中直接编码调用 API。可以利用已有的类或标准模块,也可以自己写。
[解决办法]
以下是代码第一部分:
'*************************************************************************'**函 数 名:OpenPort'**输 入:ComNumber(Long) - 串口号'** :Comsettings(String) - 配置信息'**输 出:(Long) - 0 成功 非 0 失败'**功能描述:打开串口'**全局变量:'**调用模块:'**作 者:叶帆'**日 期:2006-08-17 14:40:14'**修 改 人:'**日 期:'**版 本:V1.0.0'*************************************************************************Public Function OpenPort(ComNumber As Long, Comsettings As String, Optional lngInSize As Long = 1024, Optional lngOutSize As Long = 512) As Long On Error GoTo handelinitcom Dim retval As Long Dim CtimeOut As COMMTIMEOUTS, dcbs As DCB Dim strCOM As String, strConfig As String If ComNumber > 9 Then strCOM = "\\\\.\\COM" & Format(ComNumber, "00") Else strCOM = "COM" & Format(ComNumber, "0") End If m_Handle = CreateFile(strCOM, GENERIC_READ Or GENERIC_WRITE, 0, 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL Or FILE_FLAG_OVERLAPPED, 0)' m_Handle = CreateFile("COM1", &HC0000000, 0, 0&, &H3, 0, 0) If m_Handle = -1 Then OpenPort = -1 Exit Function End If '设置dcb块 dcbs.DCBlength = Len(dcbs) '长度 Call GetCommState(m_Handle, dcbs) '波特率,奇偶校验,数据位,停止位 如:9600,n,8,1 strConfig = "COM" & Format(ComNumber, "0") & ":" & Comsettings Call BuildCommDCB(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 ^ 0 Or DTR_CONTROL_DISABLE * 2 ^ 4 Or 1 * 2 ^ 7 Or RTS_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 '停止位 '------------------------------ If dcbs.Parity = 0 Then ' 0-4=None,Odd,Even,Mark,Space dcbs.fBitFields = dcbs.fBitFields And &HFFFD 'dcbs.fParity = 0 '奇偶校验无效 Else dcbs.fBitFields = dcbs.fBitFields Or &H2 'dcbs.fParity = 1 '奇偶校验有效 End If '超时设置 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) If retval = -1 Then retval = GetLastError() OpenPort = retval retval = CloseHandle(m_Handle) Exit Function End If '获取信号句柄 Dim lpEventAttributes1 As SECURITY_ATTRIBUTES Dim lpEventAttributes2 As SECURITY_ATTRIBUTES m_OverlappedRead.hEvent = CreateEvent(lpEventAttributes1, 1, 0, 0) m_OverlappedWrite.hEvent = CreateEvent(lpEventAttributes2, 1, 0, 0) '判断设置参数是否成功 设置输入和输出缓冲区是否成功 If SetCommState(m_Handle, dcbs) = -1 Or SetupComm(m_Handle, lngInSize, lngOutSize) = -1 Or m_OverlappedRead.hEvent = 0 Or m_OverlappedWrite.hEvent = 0 Then retval = GetLastError() OpenPort = retval If (m_OverlappedRead.hEvent <> 0) Then CloseHandle (m_OverlappedRead.hEvent) If (m_OverlappedWrite.hEvent <> 0) Then CloseHandle (m_OverlappedWrite.hEvent) Call CloseHandle(m_Handle) m_Handle = 0 Exit Function End If OpenPort = 0 Exit Functionhandelinitcom: Call CloseHandle(m_Handle) m_Handle = 0 OpenPort = -2 Exit FunctionEnd Function'*************************************************************************'**函 数 名:ClosePort'**输 入:无'**输 出:(Long) - 0 成功 -1 失败'**功能描述:关闭串口'**全局变量:'**调用模块:'**作 者:叶帆'**日 期:2006-08-17 14:56:13'**修 改 人:'**日 期:'**版 本:V1.0.0'*************************************************************************Public Function ClosePort() As Long If (m_Handle = 0) Then ClosePort = 1 Exit Function End If Call SetCommMask(m_Handle, 0) Call SetEvent(m_OverlappedRead.hEvent) Call SetEvent(m_OverlappedWrite.hEvent) If (m_OverlappedRead.hEvent <> 0) Then CloseHandle (m_OverlappedRead.hEvent) If (m_OverlappedWrite.hEvent <> 0) Then CloseHandle (m_OverlappedWrite.hEvent) If CloseHandle(m_Handle) <> 0 Then ClosePort = 0 Else ClosePort = -1 End If m_Handle = 0End Function
[解决办法]
以下是代码第二部分:
'*************************************************************************'**函 数 名:ClearInBuf'**输 入:无'**输 出:无'**功能描述:清空输入缓冲区'**全局变量:'**调用模块:'**作 者:叶帆'**日 期:2006-08-17 14:57:26'**修 改 人:'**日 期:'**版 本:V1.0.0'*************************************************************************Public Function ClearInBuf() As Long If (m_Handle = 0) Then ClearInBuf = 1 Exit Function End If Call PurgeComm(m_Handle, PURGE_RXABORT Or PURGE_RXCLEAR) ClearInBuf = 0End Function'*************************************************************************'**函 数 名:ClearOutBuf'**输 入:无'**输 出:(Long) -'**功能描述:清空输出缓冲区'**全局变量:'**调用模块:'**作 者:叶帆'**日 期:2006-08-17 15:40:38'**修 改 人:'**日 期:'**版 本:V1.0.0'*************************************************************************Public Function ClearOutBuf() As Long If (m_Handle = 0) Then ClearOutBuf = 1 Exit Function End If Call PurgeComm(m_Handle, PURGE_TXABORT Or PURGE_TXCLEAR) ClearOutBuf = 0End Function'*************************************************************************'**函 数 名:SendData'**输 入:bytBuffer()(Byte) - 数据'** :lngSize(Long) - 数据长度'**输 出:(Long) -'**功能描述:发送数据'**全局变量:'**调用模块:'**作 者:叶帆'**日 期:2006-08-17 15:43:42'**修 改 人:'**日 期:'**版 本:V1.0.0'*************************************************************************Public Function SendData(bytBuffer() As Byte, lngSize As Long) As Long On Error GoTo ToExit '打开错误陷阱 '------------------------------------------------ If (m_Handle = 0) Then SendData = 1 Exit Function End If Dim dwBytesWritten As Long Dim bWriteStat As Long Dim ComStats As ComStat Dim dwErrorFlags As Long dwBytesWritten = lngSize Call ClearCommError(m_Handle, dwErrorFlags, ComStats) bWriteStat = WriteFile(m_Handle, bytBuffer(0), lngSize, dwBytesWritten, m_OverlappedWrite) If bWriteStat = 0 Then If GetLastError() = ERROR_IO_PENDING Then Call GetOverlappedResult(m_Handle, m_OverlappedWrite, dwBytesWritten, 1) '等待直到发送完毕 End If Else dwBytesWritten = 0 End If SendData = dwBytesWritten '------------------------------------------------ Exit Function '----------------ToExit: SendData = -1End Function'*************************************************************************'**函 数 名:ReadData'**输 入:bytBuffer()(Byte) - 数据'** :lngSize(Long) - 数据长度'**输 出:(Long) -'**功能描述:读取数据'**全局变量:'**调用模块:'**作 者:叶帆'**日 期:2006-08-17 16:04:38'**修 改 人:'**日 期:'**版 本:V1.0.0'*************************************************************************Public Function ReadData(bytBuffer() As Byte, lngSize As Long, Optional Overtime As Long = 3000) As Long On Error GoTo ToExit '打开错误陷阱 '------------------------------------------------ If (m_Handle = 0) Then ReadData = 1 Exit Function End If Dim lngBytesRead As Long Dim fReadStat As Long Dim dwRes As Long lngBytesRead = lngSize '读数据 fReadStat = ReadFile(m_Handle, bytBuffer(0), lngSize, lngBytesRead, m_OverlappedRead) If fReadStat = 0 Then If GetLastError() = ERROR_IO_PENDING Then '重叠 I/O 操作在进行中 dwRes = WaitForSingleObject(m_OverlappedRead.hEvent, Overtime) '等待,直到超时 Select Case dwRes Case WAIT_OBJECT_0: '读完成 If GetOverlappedResult(m_Handle, m_OverlappedRead, lngBytesRead, 0) = 0 Then '错误 ReadData = -2 Exit Function End If Case WAIT_TIMEOUT: '超时 ReadData = -1 Exit Function Case Else: 'WaitForSingleObject 错误 End Select End If End If ReadData = lngBytesRead '------------------------------------------------ Exit Function '----------------ToExit: ReadData = -1End Function'*************************************************************************'**函 数 名:Class_Terminate'**输 入:无'**输 出:无'**功能描述:'**全局变量:'**调用模块:'**作 者:叶帆'**日 期:2006-08-17 16:36:21'**修 改 人:'**日 期:'**版 本:V1.0.0'*************************************************************************Private Sub Class_Terminate() Call ClosePortEnd Sub