Event durch Signal an COM Port triggern

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von 42deluxe.

    Event durch Signal an COM Port triggern

    Hi Leute,

    ich starte gerade ein VB Projekt, bei dem ich Daten an der seriellen Schnittstelle (ggf. auch über USB) abfragen will. Mit VB.NET bin ich relativ vertraut, hab aber noch nie Schnittstellen programmiert.

    Ich habe einen Mikrocontroller (Atmega8), der einen Sensor abfragt und per Interrupt bei einem Signal (0 oder 1) die Daten per UART ausgibt. Wann das passiert ist nicht definiert. Irgendwann zwischen jetzt und in x Sekunden.

    Die VB Anwendung soll also auf das Signal "warten", einen Zeitstempel setzen und auf das nächste Signal warten, damit eine Zeitberechnung stattfinden kann. Die Genauigkeit sollte im Millisekundenbereich liegen, die Signale liegen ein paar Sekunden auseinander.

    Meine Frage: Wie realisiere ich sowas in VB?

    Ich brauche vor allem erstmal sowas wie einen Denkanstoß. In Assembler geht das per Interrupt. Geht in VB was ähnliches? Ich kann ja schlecht eine Endlosschleife programmieren, die dauerhaft die Schnittstelle abfragt und den Rest der Anwendung lahm legt.

    Für ein paar Tipps, in welche Richtung ich da mal googlen soll, wäre ich echt dankbar, weil ich so überhaupt keinen Ansatz hab.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „42deluxe“ () aus folgendem Grund: Titel angepasst. So wird es deutlicher.

    Ich nochmal. :)

    Nach ein bisschen Recherche bin ich auf das hier gestoßen: activevb.de/tipps/vbnettipps/tipp0071.html

    Ist das das, was ich suche? Sobald Daten auf dem Port ankommen, wird ein EventHandler aufgerufen?

    Falls ja, gebt doch mal kurz Bescheid, dann komme ich damit schon weiter. Ich kann es leider noch nicht testen weil die Schaltung noch nicht fertig ist und ich mich erst um die USB->Seriell Umsetzung kümmern muss.
    Ich nutze selber sowas. Leider kann ich grade nicht nachschauen (Urlaub, hehe ;) )

    Ich meine aber , das Event der Comport-Klasse heisst "PinChanged"-Event.
    Das wird geworfen, wenn einer der 3 oder 4 möglichen Pins eine Zustandsänderung erfährt.
    Das kannst du dann weiter-verwursten.


    Gruß

    Nachtrag: Wenn du auf Daten statt auf einen Pin-Zustand wartest, dann nutzt Du halt das DataReceived-Event.
    Zieh im Designer ein SerialPort auf Deine Form und gib ihr das Event DataReceived. Dies ist der EventHandler, wenn am COM-Port etwas angekommen ist.
    Da dies in einem anderen Thread als dem MainThread passiert, musst Du per Invoke dafür sorgen, dass Du keinen ungültigen threadübergreifenden Vorgang auslöst.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Me.Invoke(Sub() ReceiveText())
    3. End Sub
    4. Private Sub ReceiveText()
    5. Dim ToRead As Integer = SerialPort1.BytesToRead
    6. If ToRead > 0 Then
    7. 'Neu empfangene Zeichen an die Empfangspuffer anhängen
    8. Dim Buffer(ToRead - 1) As Byte
    9. SerialPort1.Read(Buffer, 0, ToRead)
    10. TextBox1.Text &= System.Text.Encoding.Default.GetString(Buffer) ' in Text konvertieren
    11. ' oder halt was anderes mit den Daten tun
    12. End If
    13. End Sub
    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!