2016-06-07 6 views
1

Guten Tag! Ich möchte Daten von der seriellen Schnittstelle lesen. Die Daten können alle 2 Sekunden gelesen und in einer Datenbank gespeichert werden. Ich habe eine Datagridview verwendet, um sie anzuzeigen und zu speichern. Aber es scheint sehr verzögert zu sein. Ich muss einige Sekunden warten, um auf einen anderen Button klicken zu können. Gibt es andere Möglichkeiten, wie dies zu tun ist? Jede Hilfe würde tun. Vielen Dank!UI ist bei Verwendung der seriellen Kommunikation verzögert.

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 

Antwort

0

Sie Daten aus dem SerialPort auf dem UI-Thread zu lesen, was bedeutet, dass es zu viel zu tun ist, um die UI zu halten, damit die UI für einen Zeitraum einzufrieren. In der Regel behandeln Sie das DataReceived Ereignis des SerialPort und lesen dort Daten. Dieser Event-Handler wird in einem sekundären Thread ausgeführt. Dies bedeutet, dass Sie Daten beliebig oft lesen und bearbeiten können, ohne dass sich dies auf die Benutzeroberfläche auswirkt. Sie können die Benutzeroberfläche von dort aus jedoch nicht aktualisieren. Nachdem Sie die Daten verarbeitet und angezeigt haben, müssen Sie einen Methodenaufruf an den UI-Thread senden und die Aktualisierung dort durchführen. Das ist ein Thema, für das Sie viele Beispiele finden können.

+0

Meinen Sie, ich muss ein anderes Formular erstellen, um die Daten zu lesen? Ich bin immer noch ein Neuling für vb.net. Bitte bei mir tragen. – jaysonpogi

+0

haben Sie versucht, einen Hintergrundarbeiter oder einen anderen Thread zu verwenden? – Werdna

+0

Wenn ich meinte, dass Sie ein anderes Formular erstellen sollten, dann hätte ich gesagt, dass Sie ein anderes Formular erstellen sollten. Was ich sagte, war, dass Sie das 'DataReceived' Ereignis Ihres' SerialPorts' behandeln sollten. Ich sagte das hauptsächlich deshalb, weil Sie das 'DataReceived' Ereignis Ihres' SerialPorts' behandeln sollten. Was genau daran, ein Anfänger zu sein verhindert, dass Sie "Serialport Data Received Event" in Google eingeben? – jmcilhinney