2016-06-07 34 views
1

美好的一天! 我想从串口读取数据。数据可以每2秒读取一次并保存到数据库中,幸运的是,我使用了一个datagridview来显示并保存它。但它似乎非常滞后。我必须等待几秒钟才能点击另一个按钮。 如何做到这一点还有其他方法吗? 任何帮助都可以。谢谢!使用串行通信时UI很差

Imports System.Data.OleDb 
Public Class PICtoVB[enter image description here][1] 
Dim connString As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\Recto D Sanchez Jr\Desktop\Datalogger GUI\test\test\bin\Debug\database1.accdb" 
Dim MyConn As OleDbConnection 
Dim da As OleDbDataAdapter 
Dim ds As DataSet 
Dim tables As DataTableCollection 
Dim source1 As New BindingSource 
Dim timerval As Integer = 0 

Private Sub btnconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnconnect.Click 
    btnconnect.Enabled = False 
    btnread.Enabled = True 
    btndisconnect.Enabled = True 
    SerialPort1.Open() 
    Timer1.Enabled = True 
End Sub 

Private Sub btndisconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btndisconnect.Click 
    btndisconnect.Enabled = False 
    btnread.Enabled = False 
    btnconnect.Enabled = True 
    Timer1.Enabled = False 
    SerialPort1.Close() 
End Sub 


Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
    timerval = timerval + 1 

    Dim serialdata1 As String 
    Dim serialdata2 As String 
    Dim serialdata3 As String 
    Dim serialdata4 As String 

    Try 
     serialdata1 = SerialPort1.ReadLine.ToString 
     serialdata2 = SerialPort1.ReadLine.ToString 
     serialdata3 = SerialPort1.ReadLine.ToString 
     serialdata4 = SerialPort1.ReadLine.ToString 
     dgvdata.Rows.Add(serialdata1, serialdata2, serialdata3, serialdata4) 
     DATALOGBindingSource1.AddNew() 
     DATETextBox.Text = serialdata1 
     TIMETextBox.Text = serialdata2 
     TEMP__C_TextBox.Text = serialdata3 
     RH____TextBox.Text = serialdata4 
     DATALOGBindingSource1.EndEdit() 
     DATALOGTableAdapter1.Update(Database1DataSet1.DATALOG) 

    Catch ex As Exception 

    End Try 
End Sub 

回答

0

你的UI线程,这意味着它是太忙维持UI,因此UI冻结期阅读从SerialPort数据。一般来说,您处理SerialPortDataReceived事件并在那里读取数据。该事件处理程序在辅助线程上执行,这意味着您可以在不影响用户界面的情况下尽可能多地读取和操作数据。你不能从那里更新UI,所以一旦你处理了数据并准备好显示它,你需要编组一个方法调用到UI线程并在那里进行更新。这是一个可以找到很多示例的主题。

+0

你的意思是我需要创建另一种形式来读取数据?我仍然是vb.net的新手。请多多包涵。 – jaysonpogi

+0

您是否尝试过使用后台工作程序或其他线程? – Werdna

+0

如果我的意思是你应该创建另一个表单,那么我会说你应该创建另一个表单。我所说的是你应该处理'SerialPort'的'DataReceived'事件。我说这主要是因为你应该处理'SerialPort'的'DataReceived'事件。作为一个初学者,究竟是什么让你无法在Google中输入“serialport datareceived event”? – jmcilhinney