Vb6 TCPClient iFix错误:当前状态下的操作无效40020

Vb6 TCPClient iFix错误:当前状态下的操作无效40020,vb6,winsock,tcpclient,Vb6,Winsock,Tcpclient,这是我上一篇文章的延续: 在vb10中创建TCP连接后-我现在尝试从iFix(vb6)中的秤读取重量。如果我创建一个断点并单步执行,下面的代码可以工作:strdata获取天平的重量(目前为51g)。但是,当我简单地运行代码时,会出现以下错误: 当前状态40020下的操作无效 我认为发生的事情与它的阅读速度或试图阅读多次有关。任何提示都很好 TCPclient指的是winsock,而frmclient指的是我的表单。命令“S”是秤获取重量值所必需的命令。谢谢 Public Sub test() O

这是我上一篇文章的延续:

在vb10中创建TCP连接后-我现在尝试从iFix(vb6)中的秤读取重量。如果我创建一个断点并单步执行,下面的代码可以工作:strdata获取天平的重量(目前为51g)。但是,当我简单地运行代码时,会出现以下错误:

当前状态40020下的操作无效

我认为发生的事情与它的阅读速度或试图阅读多次有关。任何提示都很好

TCPclient指的是winsock,而frmclient指的是我的表单。命令“S”是秤获取重量值所必需的命令。谢谢

Public Sub test()
On Error GoTo errHandler

Dim strData As String
frmClient.tcpClient.LocalPort = 0
frmClient.tcpClient.Connect "192.168.0.1", 8000

'Dim i As Integer

' For i = 0 To 2000
'   Debug.Print "connection status=" & frmClient.tcpClient.State
'   If frmClient.tcpClient.State = 7 Then 
'   Exit For Next i

frmClient.tcpClient.SendData "S" & vbCrLf

frmClient.tcpClient.GetData strData
MsgBox ("weight =" & strData)

'Exit Sub
errHandler:
MsgBox Err.Description & " " & Err.Number

'Resume Next
 End Sub
使用Winsock控件的事件

比如:

' ... in your "frmClient" Form ...
Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)
    Dim strData As String
    tcpClient.GetData strData, vbString
    MsgBox ("weight =" & strData)
End Sub
*显然,正在删除原始
test()
方法中的
GetData()
调用。

使用Winsock控件的事件

比如:

' ... in your "frmClient" Form ...
Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)
    Dim strData As String
    tcpClient.GetData strData, vbString
    MsgBox ("weight =" & strData)
End Sub

*显然,在原始的
test()
方法中删除了
GetData()
调用。

成功了!代码如下。我创建了一个picture sub,在代码执行开始时初始化端口/IP,然后在结束时关闭连接。我制作了一个计时器,在稳定后自动读取重量,因此可以通过单击按钮或简单地等待2秒(2000毫秒)来找到重量。祝你好运,谢谢你的帮助

Public tcpC As New Winsock

Private Sub CFixPicture_Close()
  tcpC.Close
End Sub

Private Sub CFixPicture_Initialize()
  tcpC.LocalPort = 0
  tcpC.Connect "192.168.0.1", 8000
End Sub

Private Sub CommandButton1_Click()

 On Error GoTo errHandler
  Dim strData As String

  tcpC.SendData "S" & vbCrLf 
  tcpC.GetData strData
  Text4.Caption = "Weight: " & strData
 Exit Sub

 errHandler:
    MsgBox "error:" & Err.Description
End Sub

Private Sub readScale_OnTimeOut(ByVal lTimerId As Long)
  Dim strData As String

  tcpC.SendData "S" & vbCrLf 
  tcpC.GetData strData
  Text4.Caption = "Weight: " & strData
 Exit Sub
End Sub

开始工作了!代码如下。我创建了一个picture sub,在代码执行开始时初始化端口/IP,然后在结束时关闭连接。我制作了一个计时器,在稳定后自动读取重量,因此可以通过单击按钮或简单地等待2秒(2000毫秒)来找到重量。祝你好运,谢谢你的帮助

Public tcpC As New Winsock

Private Sub CFixPicture_Close()
  tcpC.Close
End Sub

Private Sub CFixPicture_Initialize()
  tcpC.LocalPort = 0
  tcpC.Connect "192.168.0.1", 8000
End Sub

Private Sub CommandButton1_Click()

 On Error GoTo errHandler
  Dim strData As String

  tcpC.SendData "S" & vbCrLf 
  tcpC.GetData strData
  Text4.Caption = "Weight: " & strData
 Exit Sub

 errHandler:
    MsgBox "error:" & Err.Description
End Sub

Private Sub readScale_OnTimeOut(ByVal lTimerId As Long)
  Dim strData As String

  tcpC.SendData "S" & vbCrLf 
  tcpC.GetData strData
  Text4.Caption = "Weight: " & strData
 Exit Sub
End Sub

我试过了,但没用。tcpClient是在表单设计器中初始化的,但我正在子设计器中关闭它,因此它尝试再次使用它,但不会重新初始化,因为表单仍然处于活动状态。这有意义吗?我想我让这变得不必要的复杂,因为我在表单设计器中调用了模块,因此表单设计器会继续运行,那么可能不关闭它?…如果必须关闭它,请将其设置为备份并使用Connect()方法。上面的代码片段也未能处理TCP数据是一个流的事实,并且接收的数据可能一次到达一个八位组,或者以任何方式分块。您的代码应该重新组装流并解析数据单元以使用它们。TCP不是一个数据报协议。没错……但是我们完全没有得到关于这个规模的协议的任何信息。这里的要点是Winsock控件有一个
DataReceived()
事件,该事件仅在连接处于正确状态时触发。如果没有它,您必须使用轮询循环来等待处于正确状态,然后才能继续使用其他代码。tcpClient是在表单设计器中初始化的,但我正在子设计器中关闭它,因此它尝试再次使用它,但不会重新初始化,因为表单仍然处于活动状态。这有意义吗?我想我让这变得不必要的复杂,因为我在表单设计器中调用了模块,因此表单设计器会继续运行,那么可能不关闭它?…如果必须关闭它,请将其设置为备份并使用Connect()方法。上面的代码片段也未能处理TCP数据是一个流的事实,并且接收的数据可能一次到达一个八位组,或者以任何方式分块。您的代码应该重新组装流并解析数据单元以使用它们。TCP不是一个数据报协议。没错……但是我们完全没有得到关于这个规模的协议的任何信息。这里的要点是Winsock控件有一个
DataReceived()
事件,该事件仅在连接处于正确状态时触发。没有它,您必须使用轮询循环来等待处于正确状态,然后才能继续使用其他代码。