Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.net serialport.readline vs datareceived vs threading_Vb.net_Multithreading_Serial Port_Readline - Fatal编程技术网

VB.net serialport.readline vs datareceived vs threading

VB.net serialport.readline vs datareceived vs threading,vb.net,multithreading,serial-port,readline,Vb.net,Multithreading,Serial Port,Readline,新手(非常新手)程序员,在VB.net中工作。。。关于这一点,我读过很多不同的观点,接缝线程将是最好的解决方案,但在这一点上我有点不知所措。 我试图完成的是从串行端口(蓝牙)读取一行数据。数据的长度始终相同,并且始终以CRLF结尾(数据为ASCII)。我从数字扭矩扳手读取数据,用户必须用扳手拧紧6个螺栓,每个螺栓通过串行端口发送一串数据。我读取这些原始数据,从字符串中提取实际的扭矩值,并将其保存到数据库中。我有数据库连接工作,我可以读取数据并提取我需要的值。问题是,如果出于某种原因必须停止读取,

新手(非常新手)程序员,在VB.net中工作。。。关于这一点,我读过很多不同的观点,接缝线程将是最好的解决方案,但在这一点上我有点不知所措。 我试图完成的是从串行端口(蓝牙)读取一行数据。数据的长度始终相同,并且始终以CRLF结尾(数据为ASCII)。我从数字扭矩扳手读取数据,用户必须用扳手拧紧6个螺栓,每个螺栓通过串行端口发送一串数据。我读取这些原始数据,从字符串中提取实际的扭矩值,并将其保存到数据库中。我有数据库连接工作,我可以读取数据并提取我需要的值。问题是,如果出于某种原因必须停止读取,我将无法退出事件。我尝试添加一个按钮,将变量设置为true(Dim BoolEscape as Boolean设置为“true”)。然后添加了一个Application.DoEvents()调用,然后检查BoolEscape=True,然后退出sub。。。从我所读到的来看,这是行不通的,也永远行不通

接收到的数据字符串格式为:“RE,001100.0,16/08/20,12:45:10CRLF”

下面是我的BtnStartRead_点击事件中的一些代码。。。我只显示了2个螺栓的价值,因为它只是重复。。。。我相信线程是答案,但同样,我不明白它是如何工作的

 Private Sub btnStartRead_Click(sender As Object, e As EventArgs) Handles btnStartRead.Click
    On Error GoTo err_handle
    boolEscape = False
    txtBolt1.BackColor = Color.FromArgb(255, 255, 128)
    txtBolt2.BackColor = Color.FromArgb(255, 255, 128)
    txtBolt3.BackColor = Color.FromArgb(255, 255, 128)
    txtBolt4.BackColor = Color.FromArgb(255, 255, 128)
    txtBolt5.BackColor = Color.FromArgb(255, 255, 128)
    txtBolt6.BackColor = Color.FromArgb(255, 255, 128)
    lblA1.Visible = True
    ShowRXon()
    txtRaw1.Text = mySerialPort.ReadLine
    ShowRXoff()
    txtBolt1.Text = txtRaw1.Text.Substring(7, 4)
    If checkValue(txtBolt1.Text) = False Then
        txtBolt1.BackColor = Color.Red
    End If
    lblA1.Visible = False
    lblA2.Visible = True

    Application.DoEvents()
    If boolEscape = True Then
        MsgBox("You have STOPPED the measurment logging...", vbOKOnly)
        boolEscape = False
        Exit Sub
    End If

    ShowRXon()
    txtRaw2.Text = mySerialPort.ReadLine
    ShowRXoff()
    txtBolt2.Text = txtRaw2.Text.Substring(7, 4)
    If checkValue(txtBolt2.Text) = False Then
        txtBolt2.BackColor = Color.Red
    End If
    lblA2.Visible = False
    lblA3.Visible = True

    Application.DoEvents()
    If boolEscape = True Then
        MsgBox("You have STOPPED the measurment logging...", vbOKOnly)
        boolEscape = False
        Exit Sub
    End If

我该如何将它添加到一个单独的线程中,或者将datareceived事件标识为一个更好的方法,使行始终保持相同的长度,并且始终以CRLF结尾。。。如果是这样的话,我修改它来使用它有多冷。

一般来说,您应该处理
串行端口的
DataReceived
事件。您可以在
按钮的
单击事件中启动您喜欢的任何流程,但这只是启动。当
SerialPort
对象接收到数据,然后您处理该数据时,将引发
DataReceived
事件。如果希望六次接收一行数据,则可以在事件处理程序中调用
ReadLine
,事件可能会引发六次

无需启动任何多线程,因为它已经为您完成了,即,
DataReceived
事件在辅助线程上引发,因此事件处理程序在辅助线程上执行。这意味着您不能直接访问该事件处理程序中的任何控件或从该事件处理程序调用的任何方法。您需要封送对UI线程的调用以更新UI。下面是一个向
串行端口发送多个命令并显示响应的简单示例:

Private命令作为队列(字符串)
私有子SendNextCommand()
如果命令为.Any(),则
SerialPort1.WriteLine(commands.Dequeue())
如果结束
端接头
私有子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
commands=新队列(字符串)({“第一”、“第二”、“第三”})
SendNextCommand()
端接头
私有子SerialPort1_DataReceived(发送方作为对象,e作为SerialDataReceivedEventArgs)处理SerialPort1.DataReceived
Dim响应=SerialPort1.ReadLine()
'此事件在辅助线程上引发,因此我们必须封送到UI线程以更新UI。
TextBox1.BeginInvoke(Sub()TextBox1.AppendText(response&Environment.NewLine))
SendNextCommand()
端接头