如何等待值执行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是传感器下方没有放置物体的高度
1515
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