Serielle Schnittstelle lesen und weiterleiten an andere serielle Schnittstelle und verfälschen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Andi_GZ.

    Serielle Schnittstelle lesen und weiterleiten an andere serielle Schnittstelle und verfälschen

    Hallo,
    ich habe da ein Problem. Und zwar hab ich ein PC und ein Messgerät welche beide über eine serielle Schnittstelle kommunizieren.
    Das läuft so ab. Der PC sendet den Befehl welche Daten er will und dann sendet das Messgerät diese zurück. Jetzt ist mein Problem aber, dass das Messgerät erst ausgetauscht worden ist und an dem jetzigem Gerät der Befehl zum auslesen ein anderer ist als zuvor.
    Leider kann ich aber in der Software vom PC diesen Befehl nicht umändern. :evil:
    Deshalb habe ich mir überlegt,dass ich einen PC dazwischen hänge mit 2 seriellen Schnittstellen und dafür ein Programm schreibe, welches die Daten vom PC liest und weitersendet und wenn der eine Befehl kommt ihn austauscht. Wenn Daten dann vom Messgerät kommen, müssen diese quasi durchgeschleift werden durch dass Programm zum PC.
    Der Code der ausgetauscht werden muss ist: 1020?<\r><\n>
    Stattdessen muss dieser Code rein: 1083?<\r><\n>

    Leider habe ich mit Visual Basic noch nicht so viel Erfahrung und hoffe dass mir hier jemand helfen kann. :)
    Dankeschön schon mal im Voraus! :)
    Willkommen im Forum. :thumbup:

    Andi_GZ schrieb:

    Leider kann ich aber in der Software vom PC diesen Befehl nicht umändern.
    Ist das eine dienstliche Software?
    Wer benutzt sie?
    Wessen Software ist das?
    Gibt es Quellen dafür?
    ---
    Grundsätzlich rate ich Dir ab, solch zu machen, denn wenn Du keine Ahnung hast, was da wo passiert, kommst Du mit dem Aufwand mal fix vom hindertsten ins tausendste.
    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!
    Hm, für mich sieht es einfach aus, dein Programm prüft im DataReceived-Event, ob die Bytes an der bestimmten Stelle "1020?<\r><\n>" enthalten, und wenn ja, dann werden sie mit "1083?<\r><\n>" ausgetauscht und weitergeleitet (auf eine andere COM), wenn nicht, werden die Daten so weitergeschleift.
    @ RodFromGermany Ja sie ist an einer Maschine welche dann durch die Messwerte, welcher der Paramter 1083 ist, die Maschine nachregelt.
    Die Software stamm von einer französischen Firma, die es leider nicht mehr gibt und die Quellcodes habe ich leider nicht und sind auch nirgendwo zu finden.
    Deshalb wollte ich ja diese Lösung machen, weil ich keine andere Lösung finden kann.

    @

    sonne75
    Top, aber wie kann ich des in vb dann programmieren
    Sorry wenn ich so blöd frag, aber leider hatte ich mit seriellen Schnittstellen in vb bis jetzt nichts zu tun...

    Danke schon mal!
    Du möchtest ein ganzen PC dazu verwenden, nur um Serielle Befehle & Daten auszutauschen?

    Ich empfehle dir einfach ein kleines programmierboard, z.B. das Netduino. Das kannst du auch in VB programmieren ohne irgendwie dich umzugewöhnen. Ein Netduino kostet ca. 30 Euro und hat 2 Serielle Schnittstellen. Vergiss aber nicht, dass RS232 mit +12V/-12V gesendet wird. Ein Netduino aber nur mit +5/0V pegel arbeitet. Also ein MAX232 muss noch dazwischen.

    Kleiner aufwand bei der Hardware, kein Aufwand bei der programmierung (gegenüber VB-PC)

    mfg

    gfc

    gfcwfzkm schrieb:

    Du möchtest ein ganzen PC dazu verwenden
    Wieso?
    @Andi_GZ:: Rein formal gesehen brauchst Du einen PC insgesamt mit 2 weiteren RS232, die kann man ggf. als Steckkarte dazukaufen plus einem sehr kurzen gekreuzten RS232-Kabel. Also:
    Du empfängst Daten vom Gerät mit Deiner Software.
    Du baust die Daten um.
    Du sendest die neuen Daten an die Origimnalsoftware.
    Das Programm selbst sollte absolut keine Schwierigkeiten machen, Startkennung, Wert, Endekennung.
    Problem:
    Wenn eine weitere Kommunikationseinheit anders sein sollte, passiert iwas, und da kannst Du im Moment nix 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!
    @ @Andi_GZ: Rein formal gesehen brauchst Du einen PC insgesamt mit 2 weiteren RS232, die kann man ggf. als Steckkarte dazukaufen plus einem sehr kurzen gekreuzten RS232-Kabel.
    Ja das hab ich mir auch überlegt und ich müsst sogar no 2 Karten übrig haben.
    Es werden auch noch andere Daten vom PC zum Messgerät gesendet, die aber passen.
    Wie kann ich dass denn einbinden??

    @ gfcwfzkm
    Ich werd es wohl eher mit den 2 seriellen Karten machen. Aber danke!!!

    Andi_GZ schrieb:

    Wie kann ich dass denn einbinden?
    Du musst zunächst die Zuordnung der Ports organisieren.
    PortA empfängt Daten vom externen Gerät.
    PortB sendet "übersetzte" Daten nach außen.
    PortC empfängt "übersetzte" Daten von außen.
    Dies musst Du einfach verkabeln, dazu brauchst Du 3 serielle Ports.
    Du machst eine Form und gibst ihr 2 SerialPorts. Diesen weist Du im Designer die üblichen Properties zu, sofern sie fix sind. Die PortNummer würde ich über je eine ComboBox auswählbar machen.
    Öffne beide Ports.
    Das DataReceived-Event von PortA erzeugt einen Interrupt, Du liest alle vorhandenen Bytes / Chars ein.
    Du konvertierst die Zeichen wie auch immer.
    Du sendest die Zeichen über PortB.
    Feddich.
    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!
    Anstatt Steckkarten einzubauen brauchst du nur 1 Serielle Schnittstelle. Und das indem du mit com0com einen weiteren Seriellen Port 'emulierst' und dein (Mess-)Programm auf diesen einstellst. Dein VB-SerialPort-übersetzter hört dabei die richtige Schnittstelle ab und gibt diese an die virtuelle weiter.

    So sparst du Hardware und Zeitaufwand ;)

    mfg

    gfc
    Wie spart man

    gfcwfzkm schrieb:

    Zeitaufwand
    ?
    Wo wird die Zeit gespart?
    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!
    Zeitaufwand = Zeit + Aufwand(Kraft, Ressourcen)

    PC aufmachen, Steckkarten einbauen, (ggf. BIOS-Zeugs druchführen), Treiber installieren, Kurzes RS232-Kabel besorgen, VB.net-Programm schreiben

    Bei Meiner Version: com0com starten, Gewünschte COM-Ports emulieren (paar klicks), VB.net-Programm schreiben

    also ja, da wird Zeit gespart ^^.

    Wenn's aber was für dauerhaft ist empfehle ich dir weiterhin die Hardware-Lösung ;)

    mfg

    gfc

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „gfcwfzkm“ ()

    @

    gfcwfzkm

    Das muss ich erst noch schauen, wie ich das löse

    @ RodFromGermany
    Also die Ports öffnen kann ich, aber wie muss ich des weitere Programmieren???

    Mein Programm sieht grad so aus:

    VB.NET-Quellcode

    1. Public Class Datenumwandlung
    2. Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    3. End Sub
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. End Sub
    6. Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged
    7. End Sub
    8. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    9. Try
    10. SerialPort1.PortName = TextBox3.Text ' zuweisung von Sender
    11. SerialPort2.PortName = TextBox2.Text ' zuweisung vom Empfänger
    12. Catch ex As Exception
    13. MsgBox("Verbindung konnte nicht hergestellt werden")
    14. End Try
    15. If Button3.Text = "Verbinden" Then
    16. SerialPort1.Open()
    17. SerialPort2.Open()
    18. Button1.Enabled = True
    19. Button2.Enabled = True
    20. Button3.Text = "Verbindung trennen"
    21. Else
    22. SerialPort1.Close()
    23. SerialPort2.Close()
    24. Button1.Enabled = False
    25. Button2.Enabled = False
    26. Button3.Text = "Verbinden"
    27. End If
    28. Try
    29. SerialPort1.PortName = TextBox3.Text ' zuweisung von Sender
    30. SerialPort2.PortName = TextBox2.Text ' zuweisung vom Empfänger
    31. Catch ex As Exception
    32. MsgBox("Verbindung konnte nicht hergestellt werden")
    33. End Try
    34. End Sub

    Aber weiter komm ich irgendwie nicht...

    Andi_GZ schrieb:

    Aber weiter komm ich irgendwie nicht...
    So isses. :D
    Mach zunächst alle leeren Prozeduren raus.
    If Button3.Text = "Verbinden" Then ist schlecht. Mach 2 Button. Open und Close, da hast Du die Funktionalität sauber getrennt.
    Für SerialPort1.PortName nimm eine Combobox, die Du wie folgt befüllst:

    VB.NET-Quellcode

    1. Me.ComboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames)
    ------
    So. Nun schmökerst Du mal ein wenig in diesem Unterforum rum und wendest das Gelesene auf Dein Problem an.
    Wir wollen doch beide nicht, dass Du am Ende eine fertige Lösung und keine Ahnung hast. :D
    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!

    Andi_GZ schrieb:

    da noch einfügen
    Wo hast Du denn meinen Code eingefügt?
    Pack ihn in die Form_Load.
    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!
    Also ich hab es jetzt mal so probiert:

    VB.NET-Quellcode

    1. Public Class Datenänderung
    2. 'Serialport1 = PC
    3. 'Serialport2 = NDC
    4. Private Property x As String
    5. Private Property z As String
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. Try
    8. SerialPort1.PortName = ComboBox1.Text
    9. SerialPort2.PortName = ComboBox2.Text
    10. Catch ex As Exception
    11. MsgBox("Verbindung konnte nicht hergestellt werden")
    12. End Try
    13. SerialPort1.Open()
    14. SerialPort2.Open()
    15. Button1.Enabled = False
    16. Button2.Enabled = True
    17. End Sub
    18. Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    19. 'TextBox3.Text = ""
    20. Dim x, z As String
    21. x = SerialPort1.ReadExisting
    22. 'Kontrollausgabe
    23. TextBox3.Text = x & "---"
    24. z = x.Replace("1020?<\r><\n>", "1083?<\r><\n>") 'Filter
    25. SerialPort2.Write(z)
    26. End Sub
    27. Private Sub SerialPort2_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort2.DataReceived
    28. 'TextBox4.Text = ""
    29. Dim v As String
    30. v = SerialPort1.ReadExisting
    31. 'Kontrollausgabe
    32. TextBox4.Text = v & "---"
    33. SerialPort2.Write(V)
    34. End Sub
    35. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    36. SerialPort1.Close()
    37. SerialPort2.Close()
    38. Button1.Enabled = True
    39. Button2.Enabled = False
    40. End Sub
    41. Private Sub Datenänderung_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    42. If SerialPort1.IsOpen = True Then
    43. SerialPort1.Close()
    44. SerialPort2.Close()
    45. End If
    46. End Sub
    47. End Class

    Sollte das so klappen??
    Oder muss ich was ändern???
    Ach ja, den Code hab ich nicht hinzugefügt, hab die werte in die Combobox direkt eingegeben...

    Andi_GZ schrieb:

    Sollte das so klappen??
    Was soll denn passieren?

    Andi_GZ schrieb:

    VB.NET-Quellcode

    1. TextBox3.Text = x & "---"
    müsste eine Exception wegen threadübergreifendem Vorgang bringen.
    ==> Me.Invoke(Sub() TextBox3.Text = x & "---")
    Wozu machst Du den Zinnober mit den Zeilenumbrüchen? z = x.Replace("1020?<\r><\n>", "1083?<\r><\n>")
    Lass sie einfach weg: z = x.Replace("1020?", "1083?")
    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!