VB.Net: Projekt mit SerialPort und Datenerfassung

PAHO

Grünschnabel
Hallo!

Daten vom SerialPort lesen u. speichern

Ich bin ziemlich neu in der VB.NET-Materie und habe heute den ganzen Tag versucht, eine "Datenwurst" in eine Textdatei zu speichern.
Bevor ich Euch den Code zeige eine kleine Erklärung:

Ich sende ein "Telegramm" über die SerialPort-Klasse zu einem Gerät. Je nach Telegramm antwortet das Gerät. Ich kann also das Gerät fragen: "Wie ist dein Name" und das Gerät liefert seinen Namen, oder "Wie lautet deine Version?" - das Gerät antwortet darauf.
Soweit sogut - die Kommunikation funktioniert ja (habe eine TextBox eingerichtet, die mir die Strings auflistet)

Nun das Problem:
Mit dem StreamWriter wollte ich einmal versuchen, die empfangene Wurst zu speichern. Doch das funktioniert irgendwie nicht so ganz...
Mit "StreamWriter.Write" wird nur ein kleiner "Fetzen" aus der ganzen Datenwurst gespeichert, mit "StreamWriter.WriteLine" schon der gesammte Inhalt, jedoch ein Charakter pro Zeile, und damit kann ich nun nichts anfangen.

Die "Datenwurst" setzt sich aus vielen einzelnen Namen zusammen, welche jeweils eine Funktion beschreiben und max. 20 Zeichen haben KÖNNEN! Mehr geht nicht, weniger natürlich schon.
Jetzt suche ich weiters eine Möglichkeit, diese "Datenwurst" zu zerlegen, um eventuell die Namen in eine XML-Datei zu schreiben, damit das ganze übersichtlicher wird und auch für den weiteren Programmablauf verwendet werden kann. Dummerweise sendet das Gerät am Anfang noch soetwas wie "Verstanden GerätNrX mit VersionY .und jetzt beginnt die Datenwurst..."
In meiner Textbox wird dieses "Verstanden" ebenfalls geschrieben, und ich nehme mal stark an, falls das speichern in eine Datei funktioniert, "Verstanden" mitgeschrieben wird und somit das Ganze System durcheinander bringt (System = 20 Zeichen pro Namen) ;-)


Puh, mein Kopf raucht - ich werd jetzt wohl noch ein bisschen in meinem VB.Net Entwicklerbuch von Löffelmann nachlesen, vielleicht finde ich noch etwas.
Falls nicht, ich bin für JEDE Hilfeleistung dankbar

PS: Der Code wird seperat geschrieben, um die Übersicht zu behalten ;-)
 
Code:
Imports System.Windows.Forms.Application
Imports System.Security.Principal
Imports System.Text
Imports System.IO.Ports
Imports System.Timers
Imports System.IO

Public Class Hauptfenster
    Inherits System.Windows.Forms.Form
  
    Dim objDateiMacher As New System.IO.StreamWriter("data.txt")
    Dim WithEvents SerialPort As New System.IO.Ports.SerialPort("COM3", 115200, Parity.None, 8, StopBits.One)
    Private Delegate Sub DelegateSub()
    Dim buf As String
    Dim Programm As String
    Dim StateConnection As Boolean
    Dim Connecting As New System.Threading.Thread(AddressOf CommStart)
    Private TextboxAktualisieren As New DelegateSub(AddressOf Wertübergabe)

    Public Sub Me_Closed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
        objDateiMacher.Close()
    End Sub

    Public Sub CommStart()
        With SerialPort
            Do Until .IsOpen
                DoEvents()
                Try
                    .Open()
                Catch ex As Exception : StateConnection = True
                End Try
                If StateConnection Then
                    ProgressBar1.Visible = True
                End If
            Loop
        End With
        StateConnection = False
        ProgressBar1.Visible = False
    End Sub
    Public Sub CommStop()
        With SerialPort
            .Close()
        End With
    End Sub

    Public Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived

        For i As Int32 = 0 To SerialPort.BytesToRead   ' Alle Bytes einzel lesen und anzeigen
            Try

                Dim buf As Byte() = {SerialPort.BaseStream.ReadByte}
                Dim enc As New System.Text.ASCIIEncoding()
                Programm = enc.GetString(buf)
                Programm = Programm.Replace(Chr(13), Nothing)
                objDateiMacher.Write(Programm)
                Me.Invoke(TextboxAktualisieren)

            Catch ex As Exception
                MessageBox.Show("Ein Übertragungsfehler ist aufgetreten.", "Fehler", MessageBoxButtons.OK)
            End Try
        Next i
    End Sub

    Private Sub DataStart()
        With SerialPort
            Dim FomTest As Byte() = {85, 255, 5, 1, 0}
            If .IsOpen Then
                .BaseStream.Write(FomTest, 0, 5)
                Return
            Else
                MsgBox(InfoPortClosed + .PortName, MsgBoxStyle.Critical)
            End If
        End With
    End Sub

    Private Sub NamenStart()
        With SerialPort
            Dim FomTest As Byte() = {85, 32, 5, 21, 0}
            If .IsOpen Then
                .BaseStream.Write(FomTest, 0, 5)
                Return
            Else
                MsgBox(InfoPortClosed + .PortName, MsgBoxStyle.Critical)
            End If
        End With
    End Sub

    Private Sub Wertübergabe()
        TextBox1.AppendText(Programm)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        CommStart()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        CommStop()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        DataStart()
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        NamenStart()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If SerialPort.IsOpen And Not StateConnection Then
            Me.Label1.Text = "Schnittstelle geöffnet: " + SerialPort.PortName
        Else
            Me.Label1.Text = "Schnittstelle geschlossen: " + SerialPort.PortName
        End If
        If StateConnection Then
            Me.Label1.Text = InfoPortTry
        End If
        If Timer1.Enabled And StateConnection Then
            Timer2.Start()
        End If
    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        Me.Label1.Text = InfoPortBemerkung
    End Sub

    Private Sub ProgrammeinstellungenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ProgrammeinstellungenToolStripMenuItem.Click
        FanControlX.Einstellungen.Show()
    End Sub
End Class
 
Hast du das Problem immer noch, oder ist der gepostete Code von dir die Lösung? So ganz ohne Kommentar nicht ganz zu durchschaun ...
 

Neue Beiträge

Zurück