如何等待值执行VB.NET中的下一个语法?

如何等待值执行VB.NET中的下一个语法?,vb.net,if-statement,Vb.net,If Statement,我正在从传感器获取高度数据,以下是我的代码: If Sensor1 = 5 Or Sensor1 = 6 Or Sensor1 = 7 Then If Sensor1 >= 13 Then flagCtr1 = 1 End If ElseIf Sensor1 = 8 Or Sensor1 = 9 Then If Sensor1 >= 13 Then flagCtr1 = 2 EndIf ElseIf Sensor1 = 10 Then

我正在从传感器获取高度数据,以下是我的代码:

If Sensor1 = 5 Or Sensor1 = 6 Or Sensor1 = 7 Then
   If Sensor1 >= 13 Then
      flagCtr1 = 1
   End If
ElseIf Sensor1 = 8 Or Sensor1 = 9 Then
   If Sensor1 >= 13 Then
      flagCtr1 = 2
   EndIf
ElseIf Sensor1 = 10 Then
   If Sensor1 >= 13 Then
      flagCtr1 = 3
   End If
End If
基本上,我希望发生的是,例如,当我的传感器检测到高度7时,它将等待大于或等于13的值,然后再执行flagCtr=1。我测试了这段代码,什么也没发生

这就是我的困境。这是一个我如何读取高度的示例,其中15是传感器下方没有放置物体的高度

15
15
15
7-已放置对象
7
7
7
7
8-正在删除对象
15
15
15

每次我将删除对象时,它会转到某个特定的数字,该数字也处于某个条件下。我的问题是正在读取最新的高度数据,而不是在某个时间间隔读取的数据。所以我想做的是,在执行下一条指令之前,我将等待传感器返回到大于或等于13的值

就像这样,如果我检测到7,我想忽略我读取的其他值,等待值>=13

抱歉发了这么长的帖子,我真的需要帮助,这是我的论文。多谢各位

EDIT1:

如何从传感器读取数据

AxWinsock1.GetData(strData)
for ctr = 0 To UBound(strData)
tstring = tstring + Chr(strData(ctr))
If DisconnectF1=0 Then
If tstring Like "*DATA_*_OK*" Then
Dim parsedStr() As String = Split(tsring,"_")
Sensor1 = parsedSTR(1) : Sensor2 = parsedSTR(2)
Sensor3 = parsedSTR(3) : Sensor4 = parsedSTR(4)
这是我的arduino带给我的: 数据_15_15_15_15_15_正常

EDIT2:


对于那些在正确的解决方案上仍有问题的人,只需将previousState设置为全局。

您当前的if语句从这以后就没有意义了

If Sensor1 = 5 Or Sensor1 = 6 Or Sensor1 = 7 Then
   If Sensor1 >= 13 Then
假设可变传感器1可以同时低于和高于12

您需要做的是跟踪以前的传感器

If PreviousSensor1 = 5 Or PreviousSensor1 = 6 Or PreviousSensor1 = 7 Then
   If Sensor1 >= 13 Then
      flagCtr1 = 1
   End If
ElseIf PreviousSensor1 = 8 Or PreviousSensor1 = 9 Then
   If Sensor1 >= 13 Then
      flagCtr1 = 2
   EndIf
ElseIf PreviousSensor1 = 10 Then
   If Sensor1 >= 13 Then
      flagCtr1 = 3
   End If
End If

PreviousSensor1 = Sensor1
编辑

因为你想忽略值直到你达到13。您可以保留标志值,并在点击>=13时进行设置。PreviousState将默认设置为0,并保留在两次调用之间

If PreviousState = 0 Then
   If Sensor1 = 5 Or Sensor1 = 6 Or Sensor1 = 7 Then
      PreviousState = 1
   ElseIf Sensor1 = 8 Or Sensor1 = 9 Then
      PreviousState = 2
   ElseIf Sensor1 = 10 Then
      PreviousState = 3
   End If
Else
   If Sensor1 >= 13 Then
      flagCtr1 = PreviousState
      PreviousState = 0
   End If
End If
这里有一个例子

Module Module1

    Sub Main()

        Dim state As Integer = 0
        Dim sensorData() As Integer = {15, 15, 15, 7, 7, 7, 7, 7, 8, 15, 15, 15}

        For Each data As Integer In sensorData
            state = ProcessSensor(state, data)
        Next

        Console.ReadLine()

    End Sub

    Public Function ProcessSensor(ByVal state As Integer, ByVal sensor1 As Integer)

        If state = 0 Then
            If sensor1 = 5 Or sensor1 = 6 Or sensor1 = 7 Then
                state = 1
            ElseIf sensor1 = 8 Or sensor1 = 9 Then
                state = 2
            ElseIf sensor1 = 10 Then
                state = 3
            End If
        Else
            If sensor1 >= 13 Then
                'flagCtr1 = previousState
                Console.WriteLine("Set flagCtr1 to {0}", state)
                state = 0
            End If
        End If

        Return state
    End Function

End Module

显示如何读取值。如果所有操作都在同一个线程上执行,那么您的代码自然不会执行任何操作(例如,如果
Sensor1
为10,则不能>=13)。如果它不在同一个线程上,您将有竞争条件。嗨,先生,编辑我的帖子这是一个状态机的完美用例。我建议读几篇关于这个概念的文章。
flagCtr1
代表什么?您如何使用它?我觉得可能有更好的选择。我使用flagCtr1只是为了存储常量,它会导致执行特定语法,这也可能是集成到状态机中的候选者。不完全是这样。如果
Sensor1
5
,则代码应等到变为
13
,然后将
flagCtrl
设置为
1
。如果传感器值每次增加
1
,则代码不会出现这种情况。实际上,当
Sensor1
达到
13
时不会发生任何事情,因为
PreviousSensor1
将是
12
。我考虑过这一点,但问题是当我的传感器读数为7时:PreviousSensor1将是7,但是当我移除对象时,它的读数是8,那么之前的Sensor1将被8取代,所以我返回到正方形1。为了使事情更简单,我希望这样做:读取7,等待值13及以上,然后执行flagCtr1=1。读取值7时,值8、9、10、11、12将被忽略。@the_lotus sir我通过断点调试代码,因为没有发生任何事情,它不会通过Else。。。它不是检查Sensor1>=13:(@the_lotus拥有PreviousState=1,并且PreviousState的检查在它上面(通过行),它将如何检查PreviousState是否为0?谢谢你这么多人!分析了所有事情,我希望发生的逻辑工作了!@the_lotus