Visual Basic.NET - Problemas con el networkstream.write y textbox en while loop

 
Vista:

Problemas con el networkstream.write y textbox en while loop

Publicado por Fernando olmeda (2 intervenciones) el 07/02/2024 15:03:13
Buenos días

Tengo un problema con este código. Basicamente debe hacer lo siguiente

1 - Arrancamos el programa y conectamos el puerto ethernet a la IP y puerto especificados
2 - Mandamos cada 250 ms por timer1.tick una petición de lectura a una bascula conectada por ethernet y leemos la respuesta
3 - En un textbox ponemos el valor de la respuesta
4 - Una vez alcanzamos un peso de mas de 395 kg y está estable, ponemos variable en verdadero y continuamos enviando una señal de tara y una vez tarado y mientras tarado sea verdadero leeremos el peso neto y lo mostraremos en un textbox.

En el If pesoestable = true es donde tengo el primer problema. El peso400.write (tara,0,tara.length) solo funciona si pongo un stop en esa linea y pulso F10 para continuar. Si no hago stop ahí, directamente pasa de hacerlo y no ejecuta la tara. No entiendo el por que.

Vale, imaginemos que hemos tarado y ya puedo leer el neto. Hago un while tarado = verdadero para que lea el neto. El pesoneto.read lo hace pero el textbox3.text = pesoestable no se muestra, siempre está en blanco. Por que

El tercer problema lo tengo con la codificación, una vez extraido el recipiente de la báscula, el peso estará en negativo y debo destarar la bascula mandando un código y volver a empezar desde el inicio como si recien arranco el programa.

Como codifico el string recibido para que vea que es menor a 0 y ejecute esa parte del código.

Saludos y gracias.

Como resumen que es lo que pretendo que haga el código.

Al arrancar y pulsar el boton "Conectar", enlazamos la báscula ethernet con el pc
Una vez conectados, mandamos cada 250 ms un comando para leer el peso bruto y mostrarlo en un textbox
Si el peso bruto es superior a 395 kg y es estable durante 10 segundos, mandamos un comando de tara. Una vez tarada la báscula.
Mientras la báscula esté tarada, voy enviando comandos para leer el peso neto.
Cuando el peso neto sea negativo osea menor a cero, debo mandar otro comando de destarar y la báscula volverá a estar como al inicio y yo debo volver a leer cada 250 ms el peso bruto y esperar a que el peso bruto este por encima de 395 kg y estable.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
Imports System.Net.Sockets
Imports System.Text
Imports System.Text.UTF8Encoding
Imports System.Text.UTF7Encoding
Imports System.Net.NetworkInformation
Imports System.Runtime.InteropServices
 
Public Class Form1
    Dim open As TcpListener
    Dim server As TcpListener
    Dim client, client2, host As TcpClient
    Dim dati, hdat, peso400, desbloqueatara, pesoneto, leerpesoneto As NetworkStream
    Dim ip As String = Nothing
    Dim port As Integer
    Dim peso As StringBuilder = New StringBuilder()
    Dim pesoactual As Double = 0.0
    Dim pesonetoactual As Double = 0.0
    Dim lecturas As Integer = 1
    Dim lastWeight As Double
    Const stableRange As Double = 0.05
    Dim currentWeight As Double
    Dim pesoestable, tarado As Boolean
 
 
    Private Sub btnconectar_Click_1(sender As Object, e As EventArgs) Handles btnconectar.Click
        ip = txtip.Text
        'port = Val(txtpuerto.Text)
        client = New TcpClient
        client.Connect("192.168.1.28", 5000)
 
        If client.Connected = True Then
            dati = client.GetStream
            hdat = client.GetStream
            peso400 = client.GetStream
            desbloqueatara = client.GetStream
            pesoneto = client.GetStream
            leerpesoneto = client.GetStream
 
            MsgBox("Connected", MsgBoxStyle.Information)
            btnconectar.Enabled = False
            Timer1.Start()
        Else
            MsgBox("Error", MsgBoxStyle.Critical)
        End If
 
    End Sub
    Public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If client.Available > 0 Then
 
            Dim mistring As String
            mistring = "SB" & vbCr
            Dim sb As [Byte]() = System.Text.Encoding.ASCII.GetBytes(mistring)
            hdat.Write(sb, 0, sb.Length)
 
            Dim t(client.Available) As Byte
            dati.Read(t, 0, t.Length)
            Dim testo As String = UTF7.GetString(t)
            TextBox1.Text = testo & vbCrLf
 
            pesoactual = Val(testo)
            currentWeight = Val(testo)
 
            If (Math.Abs(currentWeight - lastWeight) < 0.05) And lecturas < 50 And currentWeight > 395 Then
                TextBox4.Text = lecturas & " - " & pesoestable
                lecturas = lecturas + 1
                If lecturas = 20 Then pesoestable = True Else pesoestable = False
            Else
                TextBox3.Text = lecturas & " " & "Detectando peso estable"
                lecturas = 1
            End If
            lastWeight = currentWeight
 
            If pesoestable = True Then
                TextBox3.Text = "peso estable"
                Dim enviartara As String
                enviartara = "ST" & vbCr
                Dim tara As [Byte]() = System.Text.Encoding.ASCII.GetBytes(enviartara)
                peso400.Write(tara, 0, tara.Length)
                pesoestable = False
                lecturas = 1
                tarado = True
            End If
            While tarado = True
                Dim pestable As String
                pestable = "SN" & vbCr
                Dim pe As [Byte]() = System.Text.Encoding.ASCII.GetBytes(pestable)
                leerpesoneto.Write(pe, 0, pe.Length)
 
                pesoneto.Read(t, 0, t.Length)
                Dim pesestable As String = UTF8.GetString(t)
                TextBox3.Text = "dasdf"
                TextBox3.Text = pesestable
                pesonetoactual = Val(pesestable)
                If pesonetoactual < 0 Then
                    tarado = False
                    Dim destara As String
                    destara = "SD" & vbCr
                    Dim dtara As [Byte]() = System.Text.Encoding.ASCII.GetBytes(destara)
                    desbloqueatara.Write(dtara, 0, dtara.Length)
                End If
            End While
        End If
    End Sub
End Class
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Problemas con el networkstream.write y textbox en while loop

Publicado por Phil Rob (1554 intervenciones) el 07/02/2024 15:58:44
Hola,

No comprendo bien tu problema pero, según el titulo, puedo decir que cuanto una TextBox no se actualiza en una bucle, es suficiente de escribir Application.DoEvents después la afectación de la TextBox.

Por ejemplo
1
2
3
4
5
6
:
' ... ... ...
                TextBox3.Text = pesestable
Application.DoEvents
                pesonetoactual = Val(pesestable)
' ... ... ...

No comprendo por que escribir 2 afectaciones de la misma TextBox, la primera es inútil..

1
2
TextBox3.Text = "dasdf"
                TextBox3.Text = pesestable

Espero que este te ayudará ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problemas con el networkstream.write y textbox en while loop

Publicado por Fernando olmeda (2 intervenciones) el 07/02/2024 16:09:12
Hola y gracias por responder

Respecto a
1
2
TextBox3.Text = "dasdf"
                TextBox3.Text = pesestable

Es un error, puesto que como no me mostraba nada el textbox había puesto un simple string pero tampoco lo escribia y olvidé borrarlo.

Al aplicar el application.doevents, funciona fatal. Me borra los datos de los otros textbox, me escribe caracteres extraños. No me ha servido poner Application.doevents().
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Problemas con el networkstream.write y textbox en while loop

Publicado por Phil Rob (1554 intervenciones) el 07/02/2024 16:45:30
Lo siento.

También puedes probar TextBox3.Refresh a lugar de DoEvents,

No tengo otra idea ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar