首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

为什么小弟我的VB MSCOMM 不能打开16 以后的串口号

2012-01-19 
为什么我的VB MSCOMM 不能打开16 以后的串口号为什么我的VB MSCOMM 不能打开16 以后的串口号MSComm1.CommP

为什么我的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。可以利用已有的类或标准模块,也可以自己写。
[解决办法]
以下是代码第一部分:

VB code
'*************************************************************************'**函 数 名: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 


[解决办法]
以下是代码第二部分:

VB code
'*************************************************************************'**函 数 名: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 

热点排行