Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.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_DataReceived事件下调用多个函数_Vb.net_Function_Serial Port - Fatal编程技术网

Vb.net 尝试在SerialPort_DataReceived事件下调用多个函数

Vb.net 尝试在SerialPort_DataReceived事件下调用多个函数,vb.net,function,serial-port,Vb.net,Function,Serial Port,我想做的是:(一堵巨大的文本墙,所以我给每个部分贴上标签,以便于阅读) 您好,我正在VS 2010中为RFID控制的磁性门锁电路制作一个应用程序,该电路通过串行端口接收RFID标签ID,从数据库(SQL server 2005)对其进行身份验证,通过串行端口向电路发送信号,并将当前时间和ID保存到数据库中 我设计的微控制器电路的工作原理如下:从RFID模块读取标签ID>按下电路上的按钮后通过串行端口将标签ID发送到PC>接收数据串,“接受”或“拒绝”>打开红色LED或根据接收到的数据串关闭磁锁

我想做的是:(一堵巨大的文本墙,所以我给每个部分贴上标签,以便于阅读)

您好,我正在VS 2010中为RFID控制的磁性门锁电路制作一个应用程序,该电路通过串行端口接收RFID标签ID,从数据库(SQL server 2005)对其进行身份验证,通过串行端口向电路发送信号,并将当前时间和ID保存到数据库中

我设计的微控制器电路的工作原理如下:从RFID模块读取标签ID>按下电路上的按钮后通过串行端口将标签ID发送到PC>接收数据串,“接受”或“拒绝”>打开红色LED或根据接收到的数据串关闭磁锁

我所做的:

Imports System.Data.Sql
Imports System.Data.SqlClient
Imports System.IO.Ports

Public Class Form1
    Dim sqlcon As New SqlConnection
    Dim Chars(11) As Char
    Dim CharsCnt As Integer
    Dim currtime As String
    Dim savename As String

Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        CharsCnt += SerialPort1.Read(Chars, CharsCnt, Chars.Length - CharsCnt)
        If CharsCnt = Chars.Length Then
            Me.Invoke(New SetReceivedText(AddressOf SetText))
            CharsCnt = 0
        End If
End Sub

Delegate Sub SetReceivedText()

Private Sub SetText()
        CheckValidate()
End Sub

Private Sub CheckValidate()
        Dim cmd As New SqlCommand
        cmd.Connection = sqlcon

        If (sqlcon.State = ConnectionState.Closed) Then
            sqlcon.Open()
        End If

        cmd.CommandText = "select Name from masterdata where ID = '" & Chars & "'"

        Dim da As New SqlDataAdapter
        Dim dt As New DataTable

        da.SelectCommand = cmd
        da.Fill(dt)

        If (dt.Rows.Count = 0) Then
            TextBox2.Text = "REJECTED"
            dt.Dispose()
        Else
            TextBox2.Text = "ACCEPTED"
        End If

        sqlcon.Close()

        SendData()
End Sub

Private Sub SendData()

        If SerialPort1.IsOpen Then
            SerialPort1.Close()
        End If

        Using com1 As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort("COM2")
            com1.WriteLine(TextBox2.Text)
        End Using

        If TextBox2.Text = "ACCEPTED" Then
            Intermediate()
        End If
End Sub

Private Sub Intermediate()
        TextBox1.Text = Chars

        Dim cmd As New SqlCommand
        cmd.Connection = sqlcon

        cmd.CommandText = "select Name from masterdata where ID = '" & Chars & "'"

        If (sqlcon.State = ConnectionState.Closed) Then
            sqlcon.Open()
        End If

        Dim ds As New DataSet
        Dim da As New SqlDataAdapter
        Dim dt As New DataTable

        da.SelectCommand = cmd
        da.Fill(ds)
        da.Fill(dt)

        DataGridView1.DataSource = ds.Tables(0)

        sqlcon.Close()

        SaveData()
End Sub

Private Sub SaveData()
        currtime = DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss tt")
        savename = DataGridView1.CurrentRow.Cells(0).Value.ToString

        Dim cmd As New SqlCommand
        If (sqlcon.State = ConnectionState.Closed) Then
            sqlcon.Open()
        End If
        cmd.Connection = sqlcon

        cmd.CommandText = "insert into logdata values('" & Chars & "','" & savename & "','" & currtime & "')"

        Dim ds As New DataSet
        Dim da As New SqlDataAdapter

        da.SelectCommand = cmd
        da.Fill(ds)

        sqlcon.Close()
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For Each s In System.IO.Ports.SerialPort.GetPortNames()
            ListBox1.Items.Add(s)
        Next s
        Label1.Text = "All COM ports are closed."

        sqlcon.ConnectionString = "Data Source=localhost;User ID=TAS; password = TAS123; database=secure"
        sqlcon.Open()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            If SerialPort1.IsOpen Then
                SerialPort1.Close()
            End If

            If ListBox1.SelectedIndex = -1 Then
                MessageBox.Show("Please Select a Port.", "", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Exit Sub
            Else
                SerialPort1.BaudRate = 9600
                SerialPort1.DataBits = 8
                SerialPort1.Parity = IO.Ports.Parity.None
                SerialPort1.StopBits = IO.Ports.StopBits.One
                SerialPort1.PortName = ListBox1.SelectedItem.ToString
                SerialPort1.Open()
                Label1.Text = "'" & ListBox1.SelectedItem.ToString & "' COM port is Open"
            End If
        Catch
            MessageBox.Show("Could not open Port, please try again!", "", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
End Sub
End Class
我将上述任务分为两个函数:CheckValidate()从DB验证ID,SendData()向我的电路发送数据字符串,Intermediate()从DB获取ID对应的名称,SaveData()将ID、名称和当前时间保存到DB中

问题:

Imports System.Data.Sql
Imports System.Data.SqlClient
Imports System.IO.Ports

Public Class Form1
    Dim sqlcon As New SqlConnection
    Dim Chars(11) As Char
    Dim CharsCnt As Integer
    Dim currtime As String
    Dim savename As String

Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        CharsCnt += SerialPort1.Read(Chars, CharsCnt, Chars.Length - CharsCnt)
        If CharsCnt = Chars.Length Then
            Me.Invoke(New SetReceivedText(AddressOf SetText))
            CharsCnt = 0
        End If
End Sub

Delegate Sub SetReceivedText()

Private Sub SetText()
        CheckValidate()
End Sub

Private Sub CheckValidate()
        Dim cmd As New SqlCommand
        cmd.Connection = sqlcon

        If (sqlcon.State = ConnectionState.Closed) Then
            sqlcon.Open()
        End If

        cmd.CommandText = "select Name from masterdata where ID = '" & Chars & "'"

        Dim da As New SqlDataAdapter
        Dim dt As New DataTable

        da.SelectCommand = cmd
        da.Fill(dt)

        If (dt.Rows.Count = 0) Then
            TextBox2.Text = "REJECTED"
            dt.Dispose()
        Else
            TextBox2.Text = "ACCEPTED"
        End If

        sqlcon.Close()

        SendData()
End Sub

Private Sub SendData()

        If SerialPort1.IsOpen Then
            SerialPort1.Close()
        End If

        Using com1 As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort("COM2")
            com1.WriteLine(TextBox2.Text)
        End Using

        If TextBox2.Text = "ACCEPTED" Then
            Intermediate()
        End If
End Sub

Private Sub Intermediate()
        TextBox1.Text = Chars

        Dim cmd As New SqlCommand
        cmd.Connection = sqlcon

        cmd.CommandText = "select Name from masterdata where ID = '" & Chars & "'"

        If (sqlcon.State = ConnectionState.Closed) Then
            sqlcon.Open()
        End If

        Dim ds As New DataSet
        Dim da As New SqlDataAdapter
        Dim dt As New DataTable

        da.SelectCommand = cmd
        da.Fill(ds)
        da.Fill(dt)

        DataGridView1.DataSource = ds.Tables(0)

        sqlcon.Close()

        SaveData()
End Sub

Private Sub SaveData()
        currtime = DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss tt")
        savename = DataGridView1.CurrentRow.Cells(0).Value.ToString

        Dim cmd As New SqlCommand
        If (sqlcon.State = ConnectionState.Closed) Then
            sqlcon.Open()
        End If
        cmd.Connection = sqlcon

        cmd.CommandText = "insert into logdata values('" & Chars & "','" & savename & "','" & currtime & "')"

        Dim ds As New DataSet
        Dim da As New SqlDataAdapter

        da.SelectCommand = cmd
        da.Fill(ds)

        sqlcon.Close()
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For Each s In System.IO.Ports.SerialPort.GetPortNames()
            ListBox1.Items.Add(s)
        Next s
        Label1.Text = "All COM ports are closed."

        sqlcon.ConnectionString = "Data Source=localhost;User ID=TAS; password = TAS123; database=secure"
        sqlcon.Open()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            If SerialPort1.IsOpen Then
                SerialPort1.Close()
            End If

            If ListBox1.SelectedIndex = -1 Then
                MessageBox.Show("Please Select a Port.", "", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Exit Sub
            Else
                SerialPort1.BaudRate = 9600
                SerialPort1.DataBits = 8
                SerialPort1.Parity = IO.Ports.Parity.None
                SerialPort1.StopBits = IO.Ports.StopBits.One
                SerialPort1.PortName = ListBox1.SelectedItem.ToString
                SerialPort1.Open()
                Label1.Text = "'" & ListBox1.SelectedItem.ToString & "' COM port is Open"
            End If
        Catch
            MessageBox.Show("Could not open Port, please try again!", "", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
End Sub
End Class
当我分别执行它们时,它们都可以完美地工作,但我需要它们在一个事件SerialPort_DataReceived事件下一个接一个地执行。我尝试一个接一个地调用DataReceived事件子项下的所有函数。我尝试调用DataReceived事件下的第一个函数,然后将其他函数嵌套在彼此中。两者都不起作用,第一个函数执行,我的应用程序停止响应

我的完整代码:

Imports System.Data.Sql
Imports System.Data.SqlClient
Imports System.IO.Ports

Public Class Form1
    Dim sqlcon As New SqlConnection
    Dim Chars(11) As Char
    Dim CharsCnt As Integer
    Dim currtime As String
    Dim savename As String

Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        CharsCnt += SerialPort1.Read(Chars, CharsCnt, Chars.Length - CharsCnt)
        If CharsCnt = Chars.Length Then
            Me.Invoke(New SetReceivedText(AddressOf SetText))
            CharsCnt = 0
        End If
End Sub

Delegate Sub SetReceivedText()

Private Sub SetText()
        CheckValidate()
End Sub

Private Sub CheckValidate()
        Dim cmd As New SqlCommand
        cmd.Connection = sqlcon

        If (sqlcon.State = ConnectionState.Closed) Then
            sqlcon.Open()
        End If

        cmd.CommandText = "select Name from masterdata where ID = '" & Chars & "'"

        Dim da As New SqlDataAdapter
        Dim dt As New DataTable

        da.SelectCommand = cmd
        da.Fill(dt)

        If (dt.Rows.Count = 0) Then
            TextBox2.Text = "REJECTED"
            dt.Dispose()
        Else
            TextBox2.Text = "ACCEPTED"
        End If

        sqlcon.Close()

        SendData()
End Sub

Private Sub SendData()

        If SerialPort1.IsOpen Then
            SerialPort1.Close()
        End If

        Using com1 As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort("COM2")
            com1.WriteLine(TextBox2.Text)
        End Using

        If TextBox2.Text = "ACCEPTED" Then
            Intermediate()
        End If
End Sub

Private Sub Intermediate()
        TextBox1.Text = Chars

        Dim cmd As New SqlCommand
        cmd.Connection = sqlcon

        cmd.CommandText = "select Name from masterdata where ID = '" & Chars & "'"

        If (sqlcon.State = ConnectionState.Closed) Then
            sqlcon.Open()
        End If

        Dim ds As New DataSet
        Dim da As New SqlDataAdapter
        Dim dt As New DataTable

        da.SelectCommand = cmd
        da.Fill(ds)
        da.Fill(dt)

        DataGridView1.DataSource = ds.Tables(0)

        sqlcon.Close()

        SaveData()
End Sub

Private Sub SaveData()
        currtime = DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss tt")
        savename = DataGridView1.CurrentRow.Cells(0).Value.ToString

        Dim cmd As New SqlCommand
        If (sqlcon.State = ConnectionState.Closed) Then
            sqlcon.Open()
        End If
        cmd.Connection = sqlcon

        cmd.CommandText = "insert into logdata values('" & Chars & "','" & savename & "','" & currtime & "')"

        Dim ds As New DataSet
        Dim da As New SqlDataAdapter

        da.SelectCommand = cmd
        da.Fill(ds)

        sqlcon.Close()
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For Each s In System.IO.Ports.SerialPort.GetPortNames()
            ListBox1.Items.Add(s)
        Next s
        Label1.Text = "All COM ports are closed."

        sqlcon.ConnectionString = "Data Source=localhost;User ID=TAS; password = TAS123; database=secure"
        sqlcon.Open()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            If SerialPort1.IsOpen Then
                SerialPort1.Close()
            End If

            If ListBox1.SelectedIndex = -1 Then
                MessageBox.Show("Please Select a Port.", "", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Exit Sub
            Else
                SerialPort1.BaudRate = 9600
                SerialPort1.DataBits = 8
                SerialPort1.Parity = IO.Ports.Parity.None
                SerialPort1.StopBits = IO.Ports.StopBits.One
                SerialPort1.PortName = ListBox1.SelectedItem.ToString
                SerialPort1.Open()
                Label1.Text = "'" & ListBox1.SelectedItem.ToString & "' COM port is Open"
            End If
        Catch
            MessageBox.Show("Could not open Port, please try again!", "", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
End Sub
End Class
当我想做的事情起作用时:(使用按钮分别执行每个功能)

如果您能帮助我在一个DataReceived事件下执行所有函数,我将不胜感激


谢谢。

找到了解决方案,问题就在这里:

Using com1 As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort("COM2")
     com1.WriteLine(TextBox2.Text)
End Using
已删除Using语句并保持端口处于打开状态。仅用于:

SerialPort1.WriteLine(TextBox2.Text)