Reedkontakt soll rennzeit stoppen

  • VB.NET

Es gibt 37 Antworten in diesem Thema. Der letzte Beitrag () ist von fraju.

    Das was Manawyrm sagt musst du natürlich beachten, denn aus dem Event heraus solltest du nicht im GUI-Thread rumpfuschen (Labels setzten, etc)^^

    Schreibe mal ins PinChange-Event die Zeile:
    Console.WriteLine(CInt(e.EventType).ToString)

    und poste dann mal die Ausgabe, wenn du die Sensoren nacheinander auslöst. Kommentare reinschreiben, was du wann gemacht hast, sonst lässt es sich nicht nachvollziehen.
    mh, wenn du dein Programm debuggst ist im VisualStudio ein Fenster (ähnlich der Fehlerliste) mit der Bezeichnung "Ausgabe" (Falls nicht, STRG+ALT+O). Dort wird mit meiner Codezeile hingeschrieben.
    Bei dir müssten aber auch mehrere msg-boxen auftauchen... du löst Reed1 aus und irgendwas müsste ausgegeben werden, dann löst du Reed2 aus und wieder wird etwas (hoffentlich anderes) ausgegeben.
    mein Programm sieht jetzt so aus:



    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim aa As Integer
    4. Dim zeit1 As Integer
    5. Dim zeit2 As IntegerDim pins As System.IO.Ports.SerialPinChange = IO.Ports.SerialPinChange.CDChanged
    6. Private Function ChangeOnDSR(ByVal pins As System.IO.Ports.SerialPinChange) As BooleanReturn (pins And IO.Ports.SerialPinChange.DsrChanged) <> 0
    7. End Function
    8. Private Function ChangeOnDCD(ByVal pins As System.IO.Ports.SerialPinChange) As BooleanReturn (pins And IO.Ports.SerialPinChange.CDChanged) <> 0
    9. End Function
    10. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    11. aa = 0
    12. Try
    13. SerialPort1.Open()MsgBox("verbunden")
    14. Catch ex As ExceptionMessageBox.Show(ex.Message)
    15. End Try
    16. End SubPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    17. zeit1 += 1
    18. Label1.Text = zeit1.ToString
    19. End SubPrivate Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    20. Timer1.Stop()
    21. End SubPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    22. Timer1.Start()
    23. End SubPrivate Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
    24. End SubPrivate Sub SerialPort1_PinChanged(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialPinChangedEventArgs) Handles SerialPort1.PinChanged
    25.  
    26. If Me.Label2.Text = "0" And aa = 0 ThenMe.Invoke(Sub() Me.ListBox1.Items.Add(Label1.Text))
    27. aa = 1Me.Invoke(Sub() Timer2.Start())
    28. MsgBox(pins)
    29. End If
    30.  
    31. End SubPrivate Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    32. ListBox1.Items.Add(Label1.Text)
    33. End SubPrivate Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    34. zeit2 += 1
    35. Label2.Text = zeit2.ToString
    36. If zeit2 > 20 Then
    37. Timer2.Stop()
    38. zeit2 = 0
    39. Label2.Text = "0"
    40. aa = 0
    41. End If
    42. End SubPrivate Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click
    43. End Sub
    44. End Class




    dabei gibt die msb immer 32 aus
    Formatier deinen Code mal anständig. Kopiere ihn einfach direkt aus VisualStudio in den Editor (Quellcode-Reiter, nicht Editor-Reiter!) und mach die VB-Marker rundrum.
    Und zum Thema "Es wird immer nur 32 ausgegeben" - das soll wohl ein Scherz sein?! xD Du gibts immer die pins-Variable aus (die brauchst du nichtmal), ich sagte aber du sollst e.EventType ausgeben, also

    VB.NET-Quellcode

    1. Console.WriteLine(CInt(e.EventType).ToString)

    FreakJNS schrieb:

    Console.WriteLine
    Wird wohl nur in einem Console-Programm funktionieren.
    Das ist ein Forms-Programm.

    svensvenson schrieb:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_PinChanged(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialPinChangedEventArgs) Handles SerialPort1.PinChanged
    2. If Me.Label2.Text = "0" And aa = 0 Then
    3. Me.Invoke(Sub() Me.ListBox1.Items.Add(Label1.Text))
    4. aa = 1
    5. Me.Invoke(Sub() Timer2.Start())
    6. MsgBox(pins)
    7. End If
    8. End Sub
    Kannst du das mal abändern in

    VB.NET-Quellcode

    1. Private Sub SerialPort1_PinChanged(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialPinChangedEventArgs) Handles SerialPort1.PinChanged
    2. Select Case e.EventType
    3. Case System.IO.Ports.Break
    4. Stop
    5. Case System.IO.Ports.CDChanged
    6. Stop
    7. Case System.IO.Ports.CtsChanged
    8. Stop
    9. Case System.IO.Ports.DsrChanged
    10. Stop
    11. Case System.IO.Ports.Ring
    12. Stop
    13. Case Else
    14. Stop
    15. End Select
    16. End Sub
    und dann erzählen, in welcher Zeile das Programm stehen bleibt, nachdem du welchen Kontakt ausgelöst hast.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Console.WriteLine funktioniert auch in Forms-Anwendungen und schreibt in das "Ausgabe"-Fenster von VisualStudio.
    Die Sache mit dem Select-Case-Block ist ja schön und gut, nur kann es (wie in Post#20 beschrieben) sein, dass eben mehrere Werte kombiniert werden. In dem Fall würde diese Abfrage bei keinem anschlagen, obwohl sie für mehrere zutrifft. Darum auch die beiden Hilfsmethoden.

    @TE
    Ich will von dir eigentlich genau das gleiche wie petaod: Wissen, welche Werte das Event liefert. Hilfreich wäre ein Kommentierter Ausschnitt der Ausgabe (mit meiner einzelnen Zeile da), etwa so:

    Quellcode

    1. //Sensor1 auslösen:
    2. 32
    3. 32
    4. 32
    5. //Sensor2 auslösen:
    6. 43
    7. 43
    8. 43


    Das Problem ist nämlich, dass wir deine Hardware nicht haben um das selbst zu testen, so wissen wir aber genau was passiert.

    svensvenson schrieb:

    mein Programm sieht jetzt so aus:
    Kann es sein, dass ein Timer.Start auch ohne Invoke funktioniert?
    M.E. muss nur bei Zugriff auf GUI-Elemente invoked werden.
    Wenn Du allerdings eine Ausgabe sehen willst, mach Dir ein Debug.WriteLine(DEIN_TEXT) und verfolge die Ausgaben im Output-Fenster des Debuggers. Da musst Du Dich (zunächst) nicht mit threadübergreifenden Ausgaben befassen.
    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!
    nach langem rumgrübeln und probieren + eurem tollen (ich mein im ernst - super Sache hier) habe ich eine lösung gefunden, die beiden schalter zu unterscheiden:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_PinChanged(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialPinChangedEventArgs) Handles SerialPort1.PinChanged
    2.  
    3. If Me.Label2.Text = "0" And aa = 0 Then
    4. If SerialPort1.CDHolding = False ThenMe.Invoke(Sub() Me.ListBox1.Items.Add(Label1.Text & "..... AUTO 1"))
    5. End If
    6. If SerialPort1.CDHolding = True ThenMe.Invoke(Sub() Me.ListBox1.Items.Add(Label1.Text & "..... AUTO 2"))
    7. End If
    8. aa = 1Me.Invoke(Sub() Timer2.Start())
    9. End If
    10.  
    11. End Sub




    hierbei lieferte das SerialPort1.CDHolding einmal ein TRUE und das andere mal ein FALSE



    wahrscheinlich geht das auch anders oder??

    svensvenson schrieb:

    VB.NET-Quellcode

    1. If Me.Label2.Text = "0" And aa = 0 Then
    1. Texte von Controls nicht als Steuer-Variablen verwenden, dazu gibt es Boolean-Variablen.
    2. Mach aus dem And ein AndAlso.
    3. Mach das Timer2.Start() ohne Invoke.
    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!

    svensvenson schrieb:

    das mit dem ivoken find ich etwas umständlich von vb 10
    Dann informiere Dich mal, wie das Invoken im Studio 2005 oder 2008 gehandhabt wurde. :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!
    du könntest die ganzen invokes auch durch ein einziges ersetzen: einfach eine Methode schreiben und diese mit invoke aus dem Ereignis heraus aufrufen. Wurde auch schon ein paar mal gesagt afaik^^

    Falls du mit "wahrscheinlich geht es auch anders" eine alternative suchst, dann geb uns doch mal ein "Event-Logger-Mitschnitt" wie in Post #29 von mir angedeutet.
    Suche hier nach Bitwackeln!

    Damit kannst du die Ausgänge und Eingänge der seriellen setzen und abfragen.
    Dein Ausgang muss richtig gesetzt sein ,damit die Kontakt Abfrage funktioniert.

    Was nützt die Software ,wenn das Prinzip der Abfrage nicht bekannt ist.

    Edit:
    [VB 2008] Visual Basic Com1 RI (Ring Indicator) ohne dll auslesen
    Könnte nützlich sein!

    Das auch:
    [VB.NET] Bitwackeln mit der seriellen (Abfrage RI u.RxD wird noch gesucht)
    Habe mal ein weiteres Prog angehängt.

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