RS232 Zähler programmieren

  • C#

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    RS232 Zähler programmieren

    Hallo Community,

    ich, blutiger Anfänger, geister nun schon ein paar Tage im Netz herum um ein - für wahrscheinlich viele von euch - einfaches Programm zu erstellen. Ich finde irgendwie nicht den richtigen Ansatz zu meinem Problem.

    Ich habe ein RS232 Kabel. Zwischen Pin 2 (RxD, RX, RD) und Pin 7 (RTS) hängt ein Schalter.
    Bei jeder Betätigung des Schalters soll in einem Label hochgezählt werden (0,01, 0,02, 0,03, usw.)
    Der hochgezählte Wert im Label soll nach einer Zeit X zwischengespeichert werden.

    Hat jemand einen Ansatzpunkt für mich?

    Danke schonmal!!!
    Entwickle dein Programm wachsend.

    1. Ein Programm das beim betätigen einer Schaltfläche in einem Label Hochzählt (so wie von dir gewünscht nur ohne RS232)
    2. Erweitere dein Programm um ein 2. Label in dem die Informationen die über das RS232 rein kommen angezeigt werden.
    3. Schreib alles so um das dass von dir gewünschte Verhalten erscheint.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    iOS78 schrieb:

    Ansatzpunkt
    Für einen Anfänger sehr viele Aufgaben / Probleme auf ein Mal.
    Lass Dir vom Designer einen Ereignishandler für das Event PinChanged generieren und gib dort als Test eine MessageBox aus.
    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!
    So, erstmal vielen Dank für die Ansätze!

    So sieht der Code bis jetzt aus:
    Es wird, wie gewollt, beim drücken des Button1 jeweils um 0,01 hochgezählt. Button2 setzt auf 0.
    Taster am RS232 reagiert "noch" mit einem Programmabsturz. Wie kann ich dem Programm nun sagen, dass beim PinChange-Event die Funktion des Button1 (hochzählen) ausgelöst werden soll?

    VB.NET-Quellcode

    1. Imports System.IO.Ports
    2. Public Class Form1
    3. Public Event PinChanged As SerialPinChangedEventHandler
    4. Dim i As String
    5. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    6. SerialPort1.Open()
    7. i = 0.01
    8. TextBox1.Text = i
    9. End Sub
    10. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    11. i += 0.01
    12. TextBox1.Text = i
    13. End Sub
    14. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    15. i = 0
    16. TextBox1.Text = i
    17. End Sub
    18. Private Sub SerialPort1_PinChanged(ByVal sender As Object, ByVal e As System.IO.Ports.SerialPinChangedEventArgs) Handles SerialPort1.PinChanged
    19. 'MsgBox(e.EventType & ", " & e.EventType.ToString)
    20. End Sub
    21. End Class

    iOS78 schrieb:

    Programmabsturz
    Thread-übergreifender Vorgang?
    Welche Fehlermeldung genau? In welcher Zeile?
    Da das SerialPort seine Events in einem anderen Thread wirft, musst Du invoken:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_PinChanged(ByVal sender As Object, ByVal e As System.IO.Ports.SerialPinChangedEventArgs) Handles SerialPort1.PinChanged
    2. Me.Invoke(Sub() DoAnything())
    3. End Sub
    4. Private Sub DoAnything()
    5. MessageBox.Show("angekommen")
    6. End Sub

    -----
    Und bevor Du weitermachst:
    Option Strict On.
    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!
    Supergeil!! Funktioniert! Vielen Dank!

    Allerdings wird bei jedem Klick am RS232-Taster jeweils um 0.02 hochgezählt!
    Kann man dies beeiflussen?


    Hab den Zähler nun einfach auf "+0,005" gestellt. Da es 2Pulse gibt, komm ich auf meine 0,01!

    Vielen dank für die Super-Unterstützung!!! :thumbsup:

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

    iOS78 schrieb:

    jeweils um 0.02 hochgezählt!
    In Deinem Code sehe ich nix von hochzählen.
    Poste am besten mal Deinen ganzen Code.
    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!
    Hier der Code:

    VB.NET-Quellcode

    1. Imports System.IO.Ports
    2. Public Class Form1
    3. Public Event PinChanged As SerialPinChangedEventHandler
    4. Dim i As String
    5. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    6. SerialPort1.Open()
    7. i = 0.01
    8. TextBox1.Text = i
    9. End Sub
    10. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    11. i += 0.01
    12. TextBox1.Text = i
    13. End Sub
    14. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    15. i = 0
    16. TextBox1.Text = i
    17. End Sub
    18. Private Sub SerialPort1_PinChanged(ByVal sender As Object, ByVal e As System.IO.Ports.SerialPinChangedEventArgs) Handles SerialPort1.PinChanged
    19. 'MsgBox(e.EventType & ", " & e.EventType.ToString)
    20. Me.Invoke(Sub() Button1_Click())
    21. End Sub
    22. Private Sub Button1_Click()
    23. i += 0.005
    24. TextBox1.Text = i
    25. End Sub
    26. End Class
    Option Strict On

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO.Ports
    3. Public Class Form1
    4. Dim delta As Double
    5. Dim summe As Double
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. SerialPort1.Open()
    8. delta = 0.01
    9. summe = 0
    10. TextBox1.Text = "0"
    11. End Sub
    12. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    13. delta = 0.01
    14. End Sub
    15. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    16. delta = 0
    17. End Sub
    18. Private Sub SerialPort1_PinChanged(ByVal sender As Object, ByVal e As System.IO.Ports.SerialPinChangedEventArgs) Handles SerialPort1.PinChanged
    19. 'MsgBox(e.EventType & ", " & e.EventType.ToString)
    20. Me.Invoke(Sub() Button1_Click())
    21. End Sub
    22. Private Sub Button1_Click()
    23. summe += delta
    24. TextBox1.Text = summe.ToString
    25. End Sub
    26. End Class
    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!

    iOS78 schrieb:

    nichts
    Dann klick auf Button 1 bevor Du die Drähte miteinander verbindest.
    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!