Textdatei an virtuellen COM Port senden

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Thepinky.

    Textdatei an virtuellen COM Port senden

    Hallo zusammen,

    habe ein Programm welches normalerweise von einem externen Gerät über die serielle Schnittstelle Daten erhält.
    Diese Daten habe ich als Textdatei vorliegen und möchte diese für Testzwecken via virtuellen COM Port (Com0Com) an das Programm senden.

    Zum überprüfen wird die Textdatei als erstes in eine RichTextBox gelesen und soll anschließend an das andere Programm gesendet werden.
    Das ganze habe ich mit folgenden Code vor, allerdings weiß ich nicht wie ich den Inhalt der RichTextBox dann an den virtuellen COM Port senden kann.

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Threading
    3. Imports System.IO.Ports
    4. Imports System.ComponentModel
    5. Public Class Form1
    6. Private Sub btnReadFile_Click(sender As Object, e As EventArgs) Handles btnReadFile.Click
    7. ' Call ShowDialog.
    8. Dim result As DialogResult = OpenFileDialog1.ShowDialog()
    9. rtbContent.Text = System.IO.File.ReadAllText(OpenFileDialog1.FileName)
    10. End Sub
    11. Dim myPort As Array
    12. Delegate Sub SetTextCallBack(ByVal [Text] As String)
    13. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    14. myPort = IO.Ports.SerialPort.GetPortNames()
    15. portComboBox.Items.AddRange(myPort)
    16. WriteButton.Enabled = False
    17. End Sub
    18. Private Sub btnInit_Click(sender As Object, e As EventArgs) Handles btnInit.Click
    19. SerialPort1.PortName = portComboBox.Text
    20. SerialPort1.BaudRate = baudComboBox.Text
    21. SerialPort1.Open()
    22. btnInit.Enabled = False
    23. WriteButton.Enabled = True
    24. CloseButton.Enabled = True
    25. End Sub
    Falsche Heransgehensweise! Controls sind keine Datenspeicher! Die dienen nur zur Ansicht von Daten und Userinteraktion.

    Lade den Text in eine Variable vom Typ String. Dann weist du deiner Text/RichTextBox diesen string zu. Dann SerialPortXYZ.Write(DIE_STRING_VARIABLE).
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Woher kommt die Textdatei? Wie sind Zeilenumbrüche gemacht? Nur LF oder CR und LF? Da vermute ich mal als erstes ein Problem. Aber zu viele Whitespaces, da hab ich gerade keine Idee. Poste mal ein Resultat damit ich mir das besser vorstellen kann.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Die Textdatei ist eine Kopie aus dem Inputmonitor von dem anderen Programm, wenn es die Daten von dem externen Gerät erhalten hat.
    Kurios, jetzt wollte ich Datei einmal vor und einmal nachdem senden über den virtuellen COM Port hier Abbilden.
    Allerdings sieht diese danach wieder korrekt aus!

    Wie kann ich den Sendevorgang von dem externen Gerät simulieren? Denn so werden die Daten von dem anderen Programm nicht weiter verarbeitet.

    Aufbau der Datei

    ST C7
    SE 4C212049 4.63e D1
    DA 2024/05/25 04:13:35 75
    MS 83964 test Mitte li-re_2020-06-16 E2
    LO BB
    CH AB
    IT 1 26.227 mm Ma?-1 26.250 0.100 -0.100 OK B6
    IT 2 26.218 mm Ma?-2 26.250 0.100 -0.100 OK B8
    IT 3 26.223 mm Ma?-3 26.250 0.100 -0.100 OK B6
    IT 4 26.230 mm Ma?-4 26.250 0.100 -0.100 OK B6
    EN B3
    Wie ist die Datei entstanden? Hat dieser "Inputmonitor" die erstellt, hast du sie erstellt und den Text reinkopiert?

    Thepinky schrieb:

    Wie kann ich den Sendevorgang von dem externen Gerät simulieren?


    Erstmal herausfinden welches Encoding verwendet wird(Daher auch die Frage zur TextDatei). Dann auch herausfinden wie die Zeileumbrüche zu sein haben. Also LF oder CR und LF. Passt das Encoding und auch die Zeilenumbrüche sollte das gehen. Mit notepad++ (Ansicht->Symbnole Anzeigen->Zeilenenden Anzigen.) kannst du dir auch die Zeilenenden in der Textdatei anzeigen lassen um zu erfahren was du da sendest, kannste auch mit VB schauen aber dann auf Byte-Ebene.

    Du solltest auch alles relevante in der Doku der Apparaturen/Softwares finden.
    Bilder
    • Unbenannt.jpg

      11,15 kB, 149×137, 4.168 mal angesehen
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Vielen Dank DTF für den Tipp mit dem notepad++ die Software ist sehr hilfreich.
    Die Übertragung hatte ausgerechnet mit meiner Versuchstextdatei nicht funktioniert, anschließend mit allen anderen schon! :)

    Eine andere Frage oder Idee.
    Die Textdateien beginnen immer mit ST C7, wie kann ich über eine einfach IF Abfrage sicherstellen das ausschließlich diese Dateien eingelesen werden.
    Andernfalls eine Meldung mit z.B. "Quelldatei prüfen" kommt.
    Mit String.StartsWith, die Funktion gibt dir einen boolean, also True oder False.
    learn.microsoft.com/en-us/dotn…g.startswith?view=net-8.0

    DIe überladung mit StartsWith(String) reicht evtl. schon aus. Dann die MessageBox anzeigen.

    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DTF“ ()

    Nochmal besten Dank.
    Programm macht was es soll, es ist lediglich ein kleines Programm für Zuhause wo ich der einzige Anwender bin.

    Aber ich möchte sehr gerne noch einiges dazu lernen, deshalb wäre es super lieb, wenn ihr mal über den Code schauen würdet und mir entsprechende Tipps geben könntet was ich definitiv noch abändern oder ergänzen soll / muss und Dinge aufzeigen die anders einfach besserer Stil wären.
    Z.B.
    Meine Lösung um den BtnInit Button auf True setzen finde ich komisch. (die beiden letzten Sub's portComboBox_SelectedIndexChanged)
    Könnte mir vorstellen, dass Ihr noch einiges zu kritisieren habt.
    ,
    Bin aber über jeden TIpp dankbar!

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Threading
    3. Imports System.IO.Ports
    4. Imports System.ComponentModel
    5. Public Class Form1
    6. Dim myPort As Array
    7. Delegate Sub SetTextCallBack(ByVal [Text] As String)
    8. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. myPort = IO.Ports.SerialPort.GetPortNames()
    10. portComboBox.Items.AddRange(myPort)
    11. BtnSend.Enabled = False
    12. BtnInit.Enabled = False
    13. BtnClose.Enabled = False
    14. End Sub
    15. Private Sub BtnInit_Click(sender As Object, e As EventArgs) Handles BtnInit.Click
    16. SerialPort1.PortName = portComboBox.Text
    17. SerialPort1.BaudRate = baudComboBox.Text
    18. SerialPort1.Open()
    19. BtnInit.Enabled = False
    20. BtnReadFile.Enabled = True
    21. BtnClose.Enabled = True
    22. BtnSend.Enabled = True
    23. End Sub
    24. Private Sub BtnClose_Click(sender As Object, e As EventArgs) Handles BtnClose.Click
    25. SerialPort1.Close()
    26. BtnInit.Enabled = True
    27. BtnReadFile.Enabled = True
    28. BtnClose.Enabled = False
    29. End Sub
    30. Public strContent As String
    31. Private Sub BtnReadFile_Click(sender As Object, e As EventArgs) Handles BtnReadFile.Click
    32. ' Call ShowDialog.
    33. Dim result As DialogResult = OpenFileDialog1.ShowDialog()
    34. strContent = System.IO.File.ReadAllText(OpenFileDialog1.FileName)
    35. If strContent.StartsWith("ST C7") Then
    36. rtbInput.Text = strContent
    37. Else
    38. MsgBox("Bitte Quelldatei prüfen!")
    39. strContent = ""
    40. End If
    41. End Sub
    42. Private Sub BtnSend_Click(sender As Object, e As EventArgs) Handles BtnSend.Click
    43. SerialPort1.Write(strContent)
    44. End Sub
    45. Private Sub BtnDelete_Click(sender As Object, e As EventArgs) Handles BtnDelete.Click
    46. rtbInput.Text = ""
    47. strContent = ""
    48. End Sub
    49. Private Sub portComboBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles portComboBox.SelectedIndexChanged
    50. If baudComboBox.Text <> "" Then
    51. BtnInit.Enabled = True
    52. End If
    53. End Sub
    54. Private Sub baudComboBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles baudComboBox.SelectedIndexChanged
    55. If portComboBox.Text <> "" Then
    56. BtnInit.Enabled = True
    57. End If
    58. End Sub
    59. End Class
    @Thepinky Wenn Du Deine ComboBoxen baudComboBox und portComboBox befüllst, selektiere sofort einen sinnvollen Wert, dann kannst Du Deine SelectedIndexChanged abspecken.
    Wo kommen die Werte für baudComboBox her? Dort sollte ein einziger Wert genügen, dann kannst Du diese Auswahl eliminieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok, werde nachher "Option Strict On" aktivieren. Was ich bisher darüber gelesen habe, wird das ganze erstmal für mehr Probleme führen. Aber vermutlich irgendwann auch zu mehr Verständnis.


    @RodFromGermany
    Habe die Werte der baudComboBox über deren Eigenschaften bei Items (Sammlung) eingeben. Ist das nicht korrekt?
    Oder sollte ich das besser so machen?

    VB.NET-Quellcode

    1. Private Sub fillCBBaud()
    2. With cbBaud
    3. .Items.Clear()
    4. .Items.Add("1200")
    5. .Items.Add("9600")
    6. .Items.Add("14000")
    7. .Items.Add("19200")
    8. .Items.Add("38400")
    9. .Items.Add("57600")
    10. .Items.Add("115200")
    11. .Items.Add("128000")
    12. End With

    Thepinky schrieb:

    Was ich bisher darüber gelesen habe, wird das ganze erstmal für mehr Probleme führen. Aber vermutlich irgendwann auch zu mehr Verständnis.
    Es führt keineswegs zu Problemen, es zeigt viel mehr die Probleme auf, die schon da sind.
    Wenn das doch mal ohne Option Strict in die Buchs geht, dann ist das Fragezeichen groß.

    RFG meint warum muss der User die Baudrate wechseln? Kann er vielleicht verschiedene Endgeräte anschließen? Falls nicht brauchst gar keine Combobox
    Combobox im Designer befüllen ist an sich gut, wo's geht.
    @Thepinky Welche Boudraten kann denn die Gegenstelle? Wie teilst Du ihr mit, welche Boudrate eingestellt ist?
    Ansonsten kannst Du das so machen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Haudruferzappeltnoch

    Wie du bestimmt schon wusstest, erhalte ich jetzt folgende Fehler.
    Wie kann ich diese beheben? Muss ich diese vorher explizit konvertieren?

    "Option Strict On" lässt keine impliziten Konvertierungen von "Array" in "Object()" zu.
    "Option Strict On" lässt keine impliziten Konvertierungen von "String" in "Integer" zu.

    @RodFromGermany

    Du hast recht. Es reicht mir eine Baud-Rate von 115200.
    Möchte dies aber gerne in der Form angezeigt bekommen, wenn ich jetzt lediglich enabled auf false stelle ist dies nur die halbe Lösung.
    Benötige ich dafür zusätzlich eine ini Datei, oder kann ich die Einstellung auch anderweitig speichern.

    Oder beim laden der Form aufrufen?
    Hover mal mit der Maus über GetPortNames, da wird dir angezeigt was zurückgegeben wird. Ein String(), das bedeutet ein Array aus dem Typ String
    Das heißt Dim myPort As String() deklarieren.

    Auch bei SerialPort.BaudRate kannst du genauso nachgucken. Da gehört ein Integer rein. Da aber ComboBox.Text ein String ist, ist hier eine Konvertierung nötig.
    In diesem Fall z.B. mit Integer.Parse(baudComboBox.Text)

    Wenn die BaudRate immer 115200 ist, dann machst du SerialPort.BaudRate = 115200 (am besten direkt im Designer einstellen).
    Dann fliegt die Combobox raus.
    Wenn du die BaudRate anzeigen willst, kannst du das ja auch in einem Label.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()