Messwerte in txt Datei speichern

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von dittohead.

    Messwerte in txt Datei speichern

    Hallo zusammen,

    ich versuche zur Zeit ein Programm zu schreiben
    welches mir die Daten eines Messgerätes ausliest und als Text Datei
    speichert welche dann danach in Excel eingelesen wird zum weiteren
    Auswerten.
    Das Messgerät sendet im Sekundentakt Datum Uhrzeit und Messwert, sieht dann folgendermaßen aus: "17.01.2014 11:28 -0125Vs"
    Soweit
    funktioniert mein Programm auch ganz okay nur habe ich folgendes
    Problem, wenn ich die txt Datei in Excel einfüge dann befindet sich
    immer eine leere Zeile zwischen den Messdaten, d.h. es wird wohl immer
    ein zusätzlicher Zeilenumbruch zwischen den Messwerten eingefügt,
    welchen man in der txt Datei selber nicht sieht, da sieht man nur die
    Messwerte schön untereinander aufgelistet. Dies ist insofern nervig weil
    dieser "unsichtbare Zeilenumbruch" auch ab und zu ganz am Anfang der
    Datei ist was dann meine Tabelle um 1 Zeile nach unten verschiebt.

    Ein
    weiteres Problem ist, dass wenn kein Messgerät angeschlossen ist
    folgende Meldung kommt: "Ein Ausnahmefehler des Typs
    "System.InvalidOperationException" ist in System.dll aufgetreten.
    Zusätzliche Informationen: Der Anschluss ist geschlossen."
    Kann man diese Fehlermeldung irgendwie ignorieren und stattdessen eine eigene Fehlermeldung in der msgbox ausgeben?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim writer As New System.IO.StreamWriter(("C:\Users\Bene\Desktop\1st_" & Format(Now, "Short Date") & ".txt")) 'erstellt txt Datei mit aktuellem Datum für 1. Messung
    3. Dim writer2 As New System.IO.StreamWriter(("C:\Users\Bene\Desktop\2nd_" & Format(Now, "Short Date") & ".txt")) 'erstellt txt Datei mit aktuellem Datum für 2. Messung
    4. Dim Messwert
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'Mit COM Port verbinden
    6. Try
    7. SerialPort1.PortName = TextBox1.Text
    8. SerialPort1.Open()
    9. Button1.Enabled = False
    10. Button2.Enabled = True
    11. Button3.Enabled = False
    12. Button5.Enabled = True
    13. Button6.Enabled = False
    14. Catch ex As Exception
    15. MsgBox("Keine Verbindung möglich. Versuchen Sie einen anderen Port.")
    16. End Try
    17. End Sub
    18. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 'start der 1. Messung
    19. Button2.Enabled = False
    20. Button3.Enabled = False
    21. Button5.Enabled = False
    22. Button6.Enabled = True
    23. Me.Timer1.Interval = 1000
    24. Me.Timer1.Start()
    25. End Sub
    26. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 'Port schließen und Excel öffnen
    27. SerialPort1.Close()
    28. Button3.Enabled = False
    29. Button2.Enabled = False
    30. Button1.Enabled = True
    31. Button5.Enabled = False
    32. Button6.Enabled = False
    33. Process.Start("C:\Users\Bene\Desktop\Test2.xlsm")
    34. End Sub
    35. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click 'Programm schließen
    36. SerialPort1.Close()
    37. Me.Close()
    38. End Sub
    39. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing 'Port schließen falls Programm geschlossen wird
    40. If SerialPort1.IsOpen = True Then
    41. SerialPort1.Close()
    42. End If
    43. End Sub
    44. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 'Messwerte in txt Datei schreiben
    45. Messwert = SerialPort1.ReadLine
    46. writer.WriteLine(Messwert)
    47. End Sub
    48. Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click 'start der 2. Messung
    49. Button2.Enabled = False
    50. Button3.Enabled = False
    51. Button5.Enabled = False
    52. Button6.Enabled = True
    53. Me.Timer2.Interval = 1000
    54. Me.Timer2.Start()
    55. End Sub
    56. Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick 'Messwerte in txt Datei schreiben
    57. Messwert = SerialPort1.ReadLine
    58. writer2.WriteLine(Messwert)
    59. End Sub
    60. Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click 'Messung stoppen
    61. Try
    62. Dim fs As IO.FileStream = IO.File.OpenWrite("C:\Users\Bene\Desktop\1st_" & Format(Now, "Short Date") & ".txt")
    63. fs.Close()
    64. writer2.Close()
    65. Catch
    66. writer.Close()
    67. End Try
    68. Me.Timer1.Stop()
    69. Me.Timer2.Stop()
    70. Button3.Enabled = True
    71. Button2.Enabled = True
    72. Button6.Enabled = True
    73. Button5.Enabled = True
    74. End Sub
    75. End Class


    Gruß,
    dittohead
    bevor ich deinen Code überhaupt fertig gelesen habe ist mir eines als erstes aufgefallen:
    Bitte gewöhn dir an deine Controls ordentlich zu benennen, Button 1-x isses ja wohl nicht.

    Mir wurde hier gelernt das man es z.B. so machen kann das man nen Button "btn......." nennen kann
    oder eine Textbox mit "tb......" usw.

    MsgBox ausbessern auf MessageBox.Show()

    Edit: kannst du mal so eine .txt hochladen?
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.
    Danke für die schnellen Antworten. Ich bin total Anfänger was Programmieren angeht, bin aber für jede Verbesserung und Tipps dankbar!
    Kann jetzt nur leider nicht testen ob es funktioniert, da das Messgerät gerade eben für was anderes gebraucht wird. Werde aber darüber berichten sobald ich es wieder zu Verfügung habe und dann auch die txt Datei hochladen.

    Snaptu schrieb:

    Mir wurde hier gelernt das man es z.B. so machen kann das man nen Button "btn......." nennen kann
    oder eine Textbox mit "tb......" usw.
    Kann man.
    Ich hatte auch schon Projekte, wo das vorgeschrieben war.
    Und insbesondere in früheren Großprojekten mit vorwiegend prozeduralem Programmierstil war das auch hilfreich bis notwendig.

    Dennoch halte ich in Zeiten von Namespaces, objektorientierter Programmierung, "Option Strict On" und aktueller Entwicklungsumgebungen nicht viel davon, weil die Übersichtlichkeit eher abnimmt, wenn jeder Name mit Prefix versehen wird.
    Ich halte mich viel lieber an die Microsoft-Richtlinien für .NET:
    msdn.microsoft.com/de-de/library/ms229002(v=vs.85).aspx
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Danke @Eierlein
    ich konnte gerade deinen Vorschlag ausprobieren, >>WriteLine<< durch >>Write<< hat leider nicht geklappt da es dann gar keinen Zeilenumbruch mehr gemacht hat, der andere Vorschlag klappt aber super. Hast du vllt ne kurze Erklärung was die beiden Zeilen bewirken?

    VB.NET-Quellcode

    1. Messwert = Messwert.Replace(vbCr, "")
    2. Messwert = Messwert.Replace(vbLf, "")


    Jetzt hab ich nur noch das Problem mit der Fehlermeldung bei nicht angeschlossenem Messgerät, hat da noch jemand einen Lösungsvorschlag?