我在VB中使用 WinSock 控件向别的机器发数据,用ICP/IP协议,在发送时经常会报错:“所需事物或请求的错误协议或连接状态”
Winsock1.SendData 时出错,但 Winsock1.Connect 没事,不知道为什么?
我在Form_Load时用Winsock1.Connect 建立联接 ,在Form_Unload 时Winsock1.Close另外,怎么检测串口有无设备?及设备是否可用?

解决方案 »

  1.   

    所需事物或请求的错误协议或连接状态主要原因就是没有联接成功而调用setdata或者连接后未关闭又去连接造成的
      Private Sub Form_Load()
        tcpClient.RemotePort = 1001
        tcpClient.RemoteHost = "192.168.168.100"
        IF tcpClient.state=0 then
          tcpClient.Connect
        end if
    End SubPrivate Sub Command1_Click()
        If tcpServer.State = 7 Then
           tcpServer.SetData strData
        End If
    end sub
      

  2.   

    关于WinSock的问题已解决了!
    http://www.ahetc.gov.cn/cit/200011/08.doc 这个文章说的很详细!
    我原来在服务器端的WinSock 没有写Close事件,
    Private Sub sckServer_Close()
         sckServer.Close        '释放接连
         
    End Sub客户端的WinSock执行Winsock1.Close 时会触发服务器端的sckServer_Close 事件,需要把联
    接关掉!多谢 online(龙卷风V2.0--再战江湖) !
    那我接着问第二个问题:怎么检测串口有无设备?及设备是否可用?
      

  3.   

    添加mscomm控件
    转载Private Sub FillPorts()
        On Error GoTo staErr
        Dim i As Long, fInvalid As Boolean
        For i = 1 To 256
            DoEvents
            With MSComm1(0)
                .CommPort = i
                Me.Caption = APP_NAME + "---正在搜索可用串口...已完成" + CStr(Int(i / 256 * 100)) + "%"
                If Not .PortOpen = True Then .PortOpen = True
                If Not fInvalid Then
                    Combo1.AddItem "COM" + Trim(CStr(i))
                    Combo1.ItemData(i) = 1
                    Load MSComm1(MSComm1.Count)
                    MSComm1(MSComm1.Count + 1).CommPort = i
                End If
                .PortOpen = False
             End With
        Next
        With Combo1
            If .ListCount > 0 Then .Text = .List(0)
            glCurrentPort = 1
            Me.Caption = APP_NAME + "---共找到" + CStr(.ListCount) + "个" + "可用串口"
        End With
        Exit Sub
    staErr:
        If Err.Number = comPortInvalid Then
            fInvalid = True
        Else
            fInvalid = False
        End If
        Resume Next
    End SubPrivate Sub Command1_Click()
    FillPorts
    End Sub
      

  4.   

    我的程序里有 mscomm 控件,我在Form_Load中写了下面的代码:(指定串口)
      With MSComm1
             '使用 COM2。
            .CommPort = 2              
            If .PortOpen Then
                .PortOpen = False
            End If
            If .PortOpen = False Then
                        '9600 波特,无奇偶校验,8 位数据,一个停止位。
                .Settings = "9600,N,8,1"
                        '打开端口。
                .PortOpen = True
                '
                If err Then     '错误处理
                  MsgBox "串口通信无效"
                  Exit Function
                End If        End If
            
            .InputMode = comInputModeBinary
                 '当输入占用时,
                 '告诉控件读入整个缓冲区。
            .InputLen = 0             '清空发送缓冲区
            .OutBufferCount = 0             '清空接收缓冲区
            .InBufferCount = 0
            '
            .RThreshold = 1
            .SThreshold = 1
            
                '清空
            BufferTemp = .Input
            BufferTemp = ""
        End With然后用 MSComm1.Output =  strPutData 向串口发数据,即便串口没有设备程序也返回错误!
    strPutData 在之前已经赋过值!
      

  5.   

    我考虑是否在窗体放一个Timer1 控件,Timer1.Interval = 2000 ,每两秒钟检查一下,
    dim mIntCount As IntegerPrivate Sub Timer1_Timer()
        If mIntCount > 5 Then
            Timer1.Interval = 0        LblTitle = LblTitle & vbCrLf & "未接收到串口数据,请重试!"
            Exit Sub
        End If
                '
        mIntCount = mIntCount + 1
    End Sub
    Private Sub MSComm1_OnComm()
      
         With MSComm1
            Select Case .CommEvent
                Case comEvReceive
                    
                     mIntCount = 0                 ............            Case Else
           End Select
         End With
    End Sub
    如果接收到数据就 mIntCount = 0,
    如果 Timer1_Timer 发现 mIntCount 已经大于5,即10秒钟(或更短时间)没有接收到数据,就提示!
      

  6.   

    前面写错了:然后用 MSComm1.Output =  Buffer 向串口发数据,即便串口没有设备程序也  不  返回错误!
    Buffer 在之前已经赋过值!
    我想在使用串口通讯前就能判断串口是否有可用设备,如果没有,就不进入发数据的模块,不想等发数据后再判断串口!