Problem mit RS232-Schnittstelle

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Year-One.

    Hi ich bin neu hier und wollte keinen extra Thread aufmachen,

    Ich arbeite mich momentan auch in die Serielle Schnittstelle ein, natürlich mit Visual Basic, und habe eine Art Messgerät mit dem ich kommunizieren will.

    Ich habe die letzten Wochen viel gelesen und auch Tutorials durchgemacht, wo ich immer wieder auf das DataReceived-Event und Delegatenaufruf gestoßen bin.

    Jetzt ist es so, dass das Messgerät nie von alleine Informationen sendet, sondern ich diese immer anfragen muss. Ich komm noch nicht ganz klar drauf, was ich davon habe alles über das Data_Received-Event zu filtern und dann umständlich zu verteilen. Da die Kommunikation ja sequentiell abläuft weiß ich ja, dass wenn ich etwas erfrage, auch etwas kommen muss.

    Ist es hier nicht sinnvoller, eine einfache Plausibilitätsprüfung beim empfangen mit bspw. .Readline() und danach eine Auswertung der empfangenen Zeichen zu machen?

    Was meint ihr dazu? Ich hänge eben dabei, alles Daten in einem Event auf Plausibiltät zu prüfen.... so könne ich Sie ja immer nach Stand des Programmes prüfen?!
    Also, es sind viele Einstellungen und verschiedene Messung parametrisierbar.... sorry falls es nicht ganz klar erklärt ist, wenn ihr genauere Fragen habt, her damit. Ich will hier ja auch weiter kommen.

    Gruß
    Andreas
    @Year-One Willkommen im Forum. :thumbup:
    Windows arbeitet Event-orientiert, also warten wir nach einer Anfrage, dass das Gerät eine Antwort sendet.
    Sicher kann man das alles sequentiell machen, jedoch kommst Du da zu einem antiquierten Spagetti-Code.
    Wie sieht denn ühaupt die Kommunikation mit diesem Gerät 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!
    Danke fürs verschieben!

    Also die Kommunikation geht mit Befehlen als ASCII-Zeichenfolgen... Gefühlt 300 verschiedene. Damit kann ich zum einen Parameter erfragen und setzen. Für verschiedene Anwendungen gibt es da unterschiedliche, hier würde ich gerne Parameter-files anlegen die beim Start oder wechseln der Anwendung durchlaufen und übergeben werden... Mit Rückfrage auf erfolgreiche Eintragung. Diese Parameter will ich gleichzeitig in einer Maske im Programm angezeigt bekommen.

    ich komm nur noch nicht ganz auf den delegaten klar, wie wähle ich denn dann den richtigen aus, wenn ich beispielsweiße bei Form 2 den Button 1 klicke und das dortige Label ändern möchte.... Der serialport wurde bei Form 1 bereits geöffnet... Ich stelle mir diese zentrale Datenverwaltung ziemlich kompliziert und unübersichtlich vor...

    bitte klärt auf und helft mir ;)

    Gruß
    Andreas
    @Year-One Es sieht so aus, als wäre die Nicht-Event-Lösung für Dich die richtigere, da hast Du auch keine Thread-Probleme.
    Mach Dir eine separate Klasse, die die SerialPort-Instanz hält und die die gesamte Komunikation abwickelt.
    Diese Klasse hat folgende Methoden:
    1. Init() - Initialisierung des Interfaces
    2. IsInit() - Abfrage, ob das Interface initialisiert ist
    3. Quit() - Beenden des Init-Zustandes
    4. SendCommand(cmd As String) - Senden eines Befehls ohne Antwort
    5. SendCommandWaitForAnswer(cmd As String) - Senden eines Befehls und Warten auf Antwort, die wird als Returnwert zurückgegeben.
    Das sollte fürs Erste reichen. :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!
    Guten Morgen!

    Ja so habe ich mir das vorgestellt. Mich würde trotzdem mal interessieren ob ich das richtig verstanden habe:

    mit dem Received_Event:
    Mir will immer noch nicht in den Kopf gehen, wie ich das mit delegaten machen würde.... Da müsste ich doch auch für jede Abfrage eine Funktion schreiben und bspw. Bei nem Button dann auf die Antwort von der "aktualisieren" Funktion warten, die wiederum wartet bis sie vom Delegaten aufgerufen wird?! Da müsste ich doch bereits beim Aufruf des klick Events übermitteln was ich mit dem receive_event erwarte..... Soooo, jetzt hab ich nen Knoten im Kopf

    Danke schon mal für die sehr gute Hilfestellung!

    Wie man man das mit dem Receive_Event und mehreren Delegaten regelt würde ich gerne aus Interesse verstehen.... Kann mir das jemand erklären, bzw. Eine gutes Tutorial empfehlen?

    Gruß
    Andreas
    Was ich beschrieben habe, geht ohne

    Year-One schrieb:

    Received_Event
    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!
    Hallo RodFromGermany,

    ja, das habe ich verstanden.

    Würde aber zusätzlich noch gern den gleichen Ablauf mit dem Received_Event zumindest ansatzweise verstehen wollen ;)

    kennen Sie hierzu ein hilfreiches Tutorial oder können Sie mir das mit simplen Code snippets verdeutlichen?

    Gruß
    Andreas

    Year-One schrieb:

    ansatzweise
    Das ist in diesem Kontext nicht sinnvoll.
    Das Event-Prinzip:
    Du bestellst genau eine Pizza.
    Du rennst nicht alle 3 Minuten an die Tür und siehst nach, ob der Pizza-Bote da ist, sondern Du wartest, bis er klingelt.
    Dein Prinzip:
    Du bestellst alle 20 Sekunden eine Pizza.
    Da ist es sinnvoll, wenn Du bereits an der Tür stehst.
    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!