【问题标题】:While loop never ends in visual basic sendin data to serial port虽然循环永远不会在 Visual Basic 向串口发送数据时结束
【发布时间】:2014-04-25 09:49:46
【问题描述】:

我正在尝试向串口发送一些数据!实际上我使用的是从 0 到 100 的 schroll bar 当我选择一个值时,让我们说 44 数据连续进入串行但不能停止,并且程序在连续循环中冻结我尝试了很多东西.. 这是代码......

Private Sub HScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar1.Scroll
    Label6.Text = ""
    Label4.Text = ""
    Label1.Text = "Pwm " + Format(HScrollBar1.Value) + " %"

    x = Format(HScrollBar1.Value)

    Try
       Do While x > 0
           SerialPort1.Open()
           SerialPort1.Write(x)
           If x = 0 Then
              Exit Do
           End If
       Loop
       SerialPort1.Close()

       Catch ex As Exception               'se periptwsh pou paei na ginei exception dld na mhn uparxei katholou h seiriakh pou epilekxthke kanei catch exception kai emfanizei mhnuma lathous
          Label1.Text = "No Serial Port is Connected"
          Label4.Text = ""
     End Try
End Sub

但永远不能到 0 来停止循环...

谢谢!!但我觉得这对我不起作用!!想象一下,当我将条从 0 滚动到 100 并停止时,让我们说 43 我希望 43 去串行,直到我说不要去!我想要这个,因为 43 代表 pwm 到 arduino 端口,所以 arduino 一直读取这个数字并将其转换为 pwm 输出信号,如果它为零,我希望 pwm 信号停止..但是一旦我进入循环 x 就不能永远归零(无限循环)!还有什么建议吗?

好吧,你是我的上帝!!!呵呵,我调查了这个,我想我工作得很好!!我为开始和停止添加了两个额外的按钮,所以现在的代码变成了这样:

Private Sub HScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) 处理 HScrollBar1.Scroll 标签6.Text = "" Label4.Text = "" Label1.Text = "Pwm" + Format(HScrollBar1.Value) + "%" 滚动 = 格式(HScrollBar1.Value)

End Sub



Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
    'start
    If Not worker.IsBusy Then                   'button pou kanei thn methodo sub_foodowork na treksei
        worker.WorkerReportsProgress = True
        worker.WorkerSupportsCancellation = True
        worker.RunWorkerAsync()
    End If

    Label1.Text = "Pwm Started: " + Format(HScrollBar1.Value) + " %"

End Sub

Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
    'cancel
    If worker.IsBusy AndAlso worker.WorkerSupportsCancellation Then 'button pou kanei thn methodo foo_work na stamathsei
        worker.CancelAsync()
    End If
    Label6.Text = ""
End Sub

Private Sub foo_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles worker.DoWork

    Try

        Do While scroll > 0                         'h methodos pou stelnei pwm sthn seiriakh
            SerialPort1.Open()
            SerialPort1.Write(scroll)
            SerialPort1.Close()
            If worker.CancellationPending Then
                e.Cancel = True
                Exit Do

            End If

            worker.ReportProgress(scroll)
            'Threading.Thread.Sleep(100)
        Loop

    Catch ex As Exception               'se periptwsh pou paei na ginei exception dld na mhn uparxei katholou h seiriakh pou epilekxthke kanei catch exception kai emfanizei mhnuma lathous
        Label1.Text = "No Serial Port is Connected"  'einai delay sto thread orizw oso thelw egw 'h to bgazw teleiws gia na trexw me to clock tou pc
        Label4.Text = ""
    End Try
End Sub

Private Sub foo_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles worker.ProgressChanged
    'Label1.Text = e.ProgressPercentage.ToString
End Sub

Private Sub foo_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles worker.RunWorkerCompleted
    If e.Cancelled Then                             'mhnumata rermatismou kai teloys ths methodou foodowork
        Label1.Text = "Pwm Stoped"
    ElseIf Not IsNothing(e.Error) Then
        Label1.Text = "Error " & e.Error.Message
    ElseIf Not SerialPort1.IsOpen() Then
        Label1.Text = "No Serial Port is Connected"

    End If
    If scroll = 0 Then
        Label1.Text = "Pwm is set to 0"
    End If

End Sub

【问题讨论】:

  • 如果您想连续发送直到用户采取一些行动,您需要将其卸载到 BackgroundWorker。

标签: vb.net


【解决方案1】:

'x' 的值永远不会改变,所以do ... while 循环永远不会终止。

Do While x > 0
  SerialPort1.Open()
  SerialPort1.Write(x)
  If x = 0 Then
    Exit Do
  Else 
    x -= 1
  End If
Loop

【讨论】:

    【解决方案2】:

    将代码更改为:

    Do While x > 0
           SerialPort1.Open()
           SerialPort1.Write(x)
           If x = 0 Then
              Exit Do
           End If
           x -= 1   '' this is newly added line
    Loop
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多