Link to home
Start Free TrialLog in
Avatar of Navicerts
NavicertsFlag for United States of America

asked on

VB.NET Do While x <> y <> z

Hello,

I have some code that sends a print command to a scale and receives back a string (with a weight in it).  Because the program will be used for weighing live animals I want to continue to receive weights until I get 3 in a row that are the same (until the scale is stabilized).  To do this I made a Do While loop and compare the values.  My problem is that if the variables WeightOne = xx and WeightTwo = xx and WeightThree = xx (where "xx" is a number greater than 0) the loop does not stop!  However, if the variables are WeightOne = 0 WeightTwo = 0 and WeightThree = 0 it recognizes them as equal and exits the loop.

I do not know why it will not recognize any other values other than "0" as being equal?  If I output the variables to a msgbox("'"& WeightOne &"'") I get the following (and the loop keeps going)....

WeightOne = '25'
WeightTwo = '25'
WeightThree = '25'
Imports System
Imports System.Text
Imports System.Drawing
Imports System.IO.Ports
Imports System.Windows.Forms
Imports System.IO.Ports.SerialPort
Public Class Main
    Dim WeightValue As String
 
    Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SartoriusQC.DataReceived
 
        Dim TempWeight As String = SartoriusQC.ReadExisting
 
        If Len(TempWeight) > 2 Then
            WeightValue = ConvertWeight(TempWeight)
        End If
 
    End Sub
    Private Sub DataXferbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataXferbtn.Click
 
        Dim Counter As Integer = 0
        Dim WeightArray(30), WeightOne, WeightTwo, WeightThree As Integer
 
        WeightOne = 1
        WeightTwo = 2
        WeightThree = 3
 
        Do While WeightOne <> WeightTwo <> WeightThree
            SartoriusQC.Write(Chr(27) & "P")
            Call Delay(0.5)
            ScaleOutPut.Items.Add(WeightValue)
            WeightArray(Counter) = WeightValue
 
            If Counter > 1 Then
                WeightOne = WeightArray(Counter)
                WeightTwo = WeightArray(Counter - 1)
                WeightThree = WeightArray(Counter - 2)
            End If
 
            MsgBox("'" & WeightOne & "'")
            MsgBox("'" & WeightTwo & "'")
            MsgBox("'" & WeightThree & "'")
 
            If Counter < 30 Then
                Counter = Counter + 1
            Else
                Counter = 0
            End If
        Loop
 
        If Counter > 1 Then
            WeightOne = WeightArray(Counter)
            TextBox1.Text = WeightOne
 
            WeightTwo = WeightArray(Counter - 1)
            TextBox2.Text = WeightTwo
 
            WeightThree = WeightArray(Counter - 2)
            TextBox3.Text = WeightThree
        End If
 
    End Sub
    Private Sub Openbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Openbtn.Click
        SartoriusQC.Open()
    End Sub
    Private Sub Closebtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Closebtn.Click
        SartoriusQC.Close()
    End Sub
    Private Sub ExitApp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitApp.Click
        Application.Exit()
    End Sub
    Private Function ConvertWeight(ByVal WeightValue As String)
        Dim Position, Positiong As Integer
 
        Position = InStr(1, WeightValue, "+")
        Positiong = InStr(1, WeightValue, "g")
        Position = WeightValue.Length
        WeightValue = WeightValue.Substring(1, Positiong - 5)
        WeightValue = Trim(WeightValue)
 
        Return WeightValue
    End Function
    Sub Delay(ByVal dblSecs As Double)
 
        Const OneSec As Double = 1.0# / (1440.0# * 60.0#)
        Dim dblWaitTil As Date
        Now.AddSeconds(OneSec)
        dblWaitTil = Now.AddSeconds(OneSec).AddSeconds(dblSecs)
        Do Until Now > dblWaitTil
            Application.DoEvents()
        Loop
 
    End Sub
End Class

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of Guy Hengel [angelIII / a3]
Guy Hengel [angelIII / a3]
Flag of Luxembourg image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Navicerts

ASKER

That was easy :)  Thank You!
Hello Navicerts,

Because it is not doing what you think. What you are getting is let's say assume the values you show:

If 25 <> (25 <> 25) then

Which evaluates as

If 25 <> (0) then ' as 25<> 25 is false so equivalent to zero which is then calculated as 25 <> 0 which is true so the loop continues.

What you mean is:

If Not (WeightOne = WeightTwo And WeightTwo = WeightThree) Then

Or the converse approach

If (WeightOne <> WeightTwo) Or (WeightTwo <> WeightThree) Then

Regards,

TimCottee
perfect, as always angelIII
Thanks TimCottee!  You will have to settle for a tanks as I already gave points but I appreciate the explanation :)
Navicerts,

No problem, realised I was too slow anyway.

TimCottee