Vb6 TCPClient iFix错误:当前状态下的操作无效40020
这是我上一篇文章的延续: 在vb10中创建TCP连接后-我现在尝试从iFix(vb6)中的秤读取重量。如果我创建一个断点并单步执行,下面的代码可以工作:strdata获取天平的重量(目前为51g)。但是,当我简单地运行代码时,会出现以下错误: 当前状态40020下的操作无效 我认为发生的事情与它的阅读速度或试图阅读多次有关。任何提示都很好 TCPclient指的是winsock,而frmclient指的是我的表单。命令“S”是秤获取重量值所必需的命令。谢谢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
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()
事件,该事件仅在连接处于正确状态时触发。没有它,您必须使用轮询循环来等待处于正确状态,然后才能继续使用其他代码。