Serielle Schnittstelle kontinuierlich abfragen



  • Hallo Leute,
    für ein Schulprojekt kommuniziere ich über den COM Port mit einem Microcontroller. Dieser dient als Ein-/Ausgabeeinheit. Wie kann ich den COM Port kontinuierlich abfragen sobald ich ein Dialogfeld öffne? Ist das möglich?
    Kenne mich im Programmieren nicht so gut da ich nicht aus dem Bereich komme.
    Schon mal vielen Dank für eure Antworten.



  • Mach es bitte nicht selber! Die serielle Schnittstelle hört sich zwar einfach anb, ist es aber nicht.
    Nimm fertige Klassen, die alles für Dich machen:
    http://www.codeproject.com/system/serial.asp



  • Auf die Schnittstelle zugreifen ist nicht das Problem, das habe ich schon geschafft. Möchte nun aber über die Schnittstelle die Eingänge des MC immer wieder einlesen solange mein Dialogfeld geöffnet ist. Dachte das wie in einer Endlosschleife zu machen oder ähnlich. Weiß nicht welche Möglichkeiten da bestehen.



  • Was heisst den "Abfragen"!? Ber der seriellen Schnittstelle kann man nichts "abfragen"...



  • Also ich möchte die Daten von der Schnittstelle zum Beispiel alle 0,5 Sekunden
    einlesen, sodaß ich immer die aktuellen Portzustände meines MC zur Verfügung habe. Dieses einlesen soll solange geschehen wie mein Dialogfeld geöffnet ist.



  • Du meinst vermutlich "Daten lesen"... da man immer noch nichts abfragen kann...

    Das setzte natürlich voraus, dass Du das Protokoll des MicroControllers kennst und weist was Du empfangen willst...
    Und dann sollte eigentlich die Codeproject-Klasse Dir wunderbar weiterhelfen können.
    Mir scheint so, als ob Du Dir aber über das Protokoll, welches der MicroController verwendet, noch nicht ganz im klaren bist...



  • Hallo ihr beiden,

    arbeite auch gerade an einer Sache mit serieller Kommunikation.
    @long1278: Mit kontinuierlich abfragen meinst du bestimmt das Polling-Prinzip, also in definierten Zeitabschnitten abfragen egal ob gesendet wird oder nicht. Das ist ineffektiv, weil du Ressourcen (Prozessorauslastung) benutzt, obwohl eventuell nichts gesendet wird. Richte es so ein, dass, wenn Daten an der Schnittstelle anliegen, diese auch abgefragt wird. Dann sollte auch die Synchronisation einfacher sein. Aber dazu hab ich noch eine Frage an Jochen.
    @Jochen: Du hattest mir diese Klasse auch schon mal empfohlen. Hatte in der letzten Zeit wenig mit Programmierung zu tun und befasse mich erst jetzt wieder damit. Diese Klasse stellt doch die Möglichkeit dar, beim Anliegen von Daten eine WM-Nachricht loszuschicken, die dann separat über die Nachrichtenbearbeitung des aktuellen View abgearbeitet wird. Ich hab das aus dem Beispiel übernommen. Kann wunderbar Daten senden. Allerdings wird nie die WM_NULL generiert wenn Daten am Port anliegen. Hast du da noch einen Tipp wo ich suchen soll?



  • Verwendest Du CSerialMFC und hast folgendes gemacht!?

    //////////////////////////////////////////////////////////////////////
    //
    // CSerialMFC - MFC wrapper for serial communication handling
    //
    // CSerialMFC is a very thing wrapper around the CSerialWnd class,
    // which makes it more suitable for use in MFC-based applications.
    // Unfortenately, the MFC framework isn't very flexible when it comes
    // to adding custom message handlers. We cannot add our own types to
    // the message handlers, but we're stuck to use 32-bit integers.
    //
    // Add the following entry to the window's message map to make sure
    // that MFC calls your handler, when a serial message comes in.
    //
    //      DECLARE_MESSAGE_MAP(CMyClass,CWnd)
    //          ...
    //          ON_WM_SERIAL(OnSerialMsg)
    //          ...
    //     END_MESSAGE_MAP()
    //
    // A typical handler could look like this:
    //
    //     afx_msg LRESULT CMyClass::OnSerialMsg (WPARAM wParam, LPARAM lParam)
    //     {
    //         CSerial::EEvent eEvent = CSerial::EEvent(LOWORD(wParam));
    //         CSerial::EError eError = CSerial::EError(HIWORD(wParam));
    //
    //         // lParam: User-defined 32-bit integer (type LPARAM)
    //         switch (eEvent)
    //         {
    //         case CSerialMFC::EEventRecv:
    //             // TODO: Read data from the port
    //             break;
    //         ...
    //         }
    //         
    //         // Return successful
    //         return 0;
    //     }
    


  • Ja ich verwende CSerialMFC und hab das auch eingebunden. Allerdings verwende Visual Studio 2003 und bin mir jetzt nicht ganz sicher ob das so richtig ist:

    // CMySerialView.h
    
    // Generierte Funktionen für die Meldungstabellen
    protected:
    	DECLARE_MESSAGE_MAP()
    
    public:
    	LRESULT OnSerialMsg (WPARAM wParam, LPARAM lParam);
    ...
    
    // CMySerialView.cpp
    IMPLEMENT_DYNCREATE(CSerial2View, CView)
    
    BEGIN_MESSAGE_MAP(CSerial2View, CView)
    	// Standarddruckbefehle
    	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
    	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
    	ON_WM_SERIAL(OnSerialMsg)
    	ON_COMMAND(ID_SCHNITTSTELLE_SENDD, OnSchnittstelleSendd)
    END_MESSAGE_MAP()
    

    So funktionierts jedenfalls nicht. Das ganze lässt sich kompilieren und man kann auch Daten senden.



  • Und was hast Du bei "Open" als HWND angegeben!? Ob das so mit Views geht... da musst Du vermutlich das CWinApp angeben (bin jetzt aber gerade überfragt)



  • Jochen Kalmbach schrieb:

    Und was hast Du bei "Open" als HWND angegeben!? Ob das so mit Views geht... da musst Du vermutlich das CWinApp angeben (bin jetzt aber gerade überfragt)

    Ja genau an dieser Stelle vermute ich auch den Fehler. Ich hab zunächst den this-Zeiger übergeben und da scheints nicht zu funktionieren.



  • So ich glaub ich hab den Fehler gefunden. Bei HWND einen Zeiger auf das CWinApp zu übergeben geht nicht. Das mit dem this-Zeiger funktioniert aber. Der Fehler lag daran, dass ich im Konstruktor der View-Klasse versucht habe die Schnittstelle zu initialisieren. Das geht zwar aber der this-Zeiger ist zeigt da noch nicht auf das View. Habe jetzt die Initialisierung aus dem Konstruktor rausgenommen und es läuft.


Anmelden zum Antworten