Serielle Kommunikation und das WM_Nachrichtensystem



  • Habe folgendes heruntergeladen um eine RS232 auszulesen.
    http://www.codeproject.com/system/serial.asp
    aber ich bekomm nichts, aber auch gar nichts davon zum laufen.
    Hab zwar Programmierkenntnisse in C++ und Visual C,
    aber nur vom Level "Markt und Technik Buch " komplett durchgearbeitet.
    Beim kompilieren gibts schon ständig Fehler.
    Könnte mir jemand mal eine Klickanleitung geben,
    ich bin echt kurz vorm durchdrehen.

    Vielen,vielen,vielen
    Dank

    Sven



  • Solange Du nicht sagts, was genau Dein Problem ist, kann man Dir nicht helfen... bei mir geht auf jedenfall alles.

    Auch solltest Du Dir einen besseren Title Deines Threads wählen...

    Auch brauchst Du nicht einen neuen Thread aufzumachen (ok, der alte Thread-Titel ist genauso bes*):
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-146542.html



  • Ja ich weiß , sorry für die ruppige schreibweise.
    Also ich hatte gehofft das heruntergeladenen Programm
    einfach ausführen zu können, um daraus dann nach und nach
    Schlüsse ziehen zu können wie es funktionert.
    Nur weiß ich ehrlich gesagt nicht was ich da anklicken soll.
    Intuitiv hätte ich die SerialTestMFC Datei doppelgeklickt -> kompiliert und gestartet.Sie befindet sich im Ordner serial.
    oder?



  • Wenn Du hier im MFC-Forum bist, wäre es wohl das, was Du suchst, oder?



  • Schau am besten in die FAQ. Da gibts es eine Klasse dafür.
    Solltest Du aber nun nicht wissen wie man eine Klasse verwendet bist du mit Seriell sowieso weit falsch da dir Grundlagen fehlen.



  • Nunja... man sollte dann auch wissen wie man ein Programm startet gescheige denn bedient 😃

    Nuja. 🤡



  • Vielleicht war es ja auch nur der übliche "Fehler" MFC dynamisch oder statisch. 😉
    Aber dazu hätte man die Meldung sehen müssen. 🙄



  • hallo erstmal,
    ich schreib einfach mal in diesen beitrag rein da mein problem sich ebenfalls auf die oben genannte klasse bezieht.
    ich bin neuling auf dem gebiet programmierung und habe mir gleich mal das gebiet kommunikation über die serielle schnittstelle als spielwiese ausgesucht.
    als konsolenanwendung funktioniert auch alles einwandfrei.

    nun habe ich jedoch über den MFC-Anwendungsassistenten ein neues projekt erstellt, welches nur einen "EXIT-Button", einen "Empfangs-Button" und ein Kombinationsfeld zur darstellung der empfangenen daten besitzt.

    nun mein problem:
    wenn ich auf den empfangsbutton klicke bleibt das progrämmchen hängen bis eine nachricht eingegangen ist(danach ists wieder normal). ich möchte jedoch quasi nur auf empfangsbereitschaft gehen und dann alle nachrichten "abfangen".

    hier mal der codeschnippsel:

    void CTesgui2Dlg::OnEmpfangen() 
    {
    
    char str[100];
    
    // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    CSerial serial;
    LONG    lLastError = ERROR_SUCCESS;
    
    // Attempt to open the serial port (COM1)
    lLastError = serial.Open(_T("\\\\.\\COM1"),0,0,false);
    
    // Setup the serial port (9600,8N1, which is the default setting)
    lLastError = serial.Setup(CSerial::EBaud9600,CSerial::EData8,CSerial::EParNone,CSerial::EStop1);
    
    // Use 'non-blocking' reads, because we don't know how many bytes
    // will be received. This is normally the most convenient mode
    // (and also the default mode for reading data).
    
    lLastError = serial.SetupReadTimeouts(CSerial::EReadTimeoutNonblocking);
    
    // Wait for an event
    	lLastError = serial.WaitEvent();
    
    	// Save event
    	const CSerial::EEvent eEvent = serial.GetEventType();
    
    	// Handle data receive event
    	if (eEvent & CSerial::EEventRecv)
    	{
    		// Read data, until there is nothing left
    		DWORD dwBytesRead = 0;
    		char szBuffer[2];
    		do
    		{
    			// Read data from the COM-port
    			lLastError = serial.Read(szBuffer,sizeof(szBuffer)-1,&dwBytesRead);
    
    			if (dwBytesRead > 0)
    			{
    				// Finalize the data, so it is a valid string
    				szBuffer[dwBytesRead] = '\0';
    
    				// Display the data
    				sprintf(str,"%s", szBuffer);
    
    				m_Ausgabe.AddString(str);
    			}
    		}
    	    while (dwBytesRead == sizeof(szBuffer)-1);
    	}
    
    	// Close the port again
        serial.Close();
    }
    

    schon mal danke für evtl. hilfe und sorry für diesen textberg^^
    grüssle
    balu



  • hmm sry ich musste noch nix mit der Seriellen Schnittstelle machen... aber ich würde evt. einfach das Empfangen in einen Thread packen und das GUI in einen anderen 🙂



  • Oder wenn Du schon MFC verwendest, dann verwende doch CSerialMFC! Dann bekommst Du eine Message, wenn sich was tut...



  • ok, die idee hatte ich auch schon. allerdings werde ich aus dem MFC-Beispiel welches bei der klasse beiliegt nicht schlau.
    vom ablauf her müsste es doch eigentlich wie folgt gehen oder?

    1. klick auf empfangsbereitschaft
    2. warten auf event
    3. event verarbeiten (anzeigen der daten)
    4. wieder bei 2.

    vielen dank nochmal für die hilfe. hoffe ich komme damit noch weiter 😃

    gruss
    balu



  • Wenn Du die MFC-Klasse verwendest musst Du gar nicht warten, da Du dann eine Message bekommst (bzw. die "OnSerialMsg" wird aufgerufen).



  • ok, von der logik her denk ich mal das es mir klar ist.
    mein problem liegt wahrscheinlich eher darin, das ich bisher nur mit der konsole gearbeitet habe und das hier meine "MFC-entjungferung" ist. 😉

    kannst du mir vieleicht ein einfaches beispiel sagen, wie ich "OnSerialMsg" anwende?

    hab mich hier irgendwie total festgefahren und wär für eine hilfe von einem pro riesig dankbar.

    gruss balu



  • Balu123321 schrieb:

    kannst du mir vieleicht ein einfaches beispiel sagen, wie ich "OnSerialMsg" anwende?

    Du musst Dir eigentlich nur das mitgelieferte Beispiel genau anschauen... was anderes kann ich Dir auch nicht zeigen 😕



  • Ich fürchte, es scheitert daran, dass er noch nicht mit dem Prizip und der Handhabung von Nachrichten vertraut ist. 😕



  • naj...dank dir auf jeden fall. hast es ja versucht.
    das mitgelieferte beispiel ist halt für nen anfänger ziemlich komplex, da es aus mehreren dialogen besteht und ich da einfach nich durchblicke wo ich überhaupt anfangen soll.
    und ich schau es mir ja schon seit 3 tagen an und bin noch keinen millimeter weiter gekommen.
    aber dann guck ichs mir halt immer weiter an 😞

    ..aber sollte ich dann doch weiterkommen und konkretere fragen haben scheue ich mich nicht diesten tread aus der versenkung zu holen 😃

    gruss
    balu

    edit: @estartu: du sprichst mir aus dem herzen aber ohne das ohne hilfe zu verstehen ist halt für nen anfänger ein brocken



  • habt ihr vielleicht irgendwo irgendwie ein sehr einfaches bespiel zu nachrichtenhandling?
    vielleicht komm ich ja dann auf den trichter
    gruss balu



  • Ein ganz einfaches Beispiel:
    Du hast einen Dialog. Dadrauf ist ein Knopf.
    Der Knopf hat eine Nachricht BN_CLICKED, diese wird dem Dialog von Windows geschickt, wenn der User auf dem Knopf die linke Maustaste drückt.
    In der MessageMap (such im Code) steht das Makro ON_BN_CLICKED, was dem Dialog sagt, welche Funktion er in dem Fall aufrufen soll, wenn der Knopf geklickt wird.

    ON_BN_CLICKED(IDC_KNOPF, OnBnClickedKnopf)
    

    Es wird also OnBnClickedKnopf aufgerufen, ganz automatisch. 🙂

    So, das war die Kurzversion, aber jetzt hast du ne Grundlage zum Fragen stellen. 😉



  • Les dir am besten mal ein MFC-Tutorial durch, ich kann dir dieses hier sehr empfehlen: http://www.cpp-tutor.de/mfc/toc.htm

    Dort wird auch das Nachrichtensystem von Windows sehr gut erklärt. Kurz, übersichtlich und mit vielen Beispielen. 👍



  • ok, so langsam bekomm ich wieder hoffnung.
    des mit dem ON_BN_CLICKED hab ich ja schon mal herausgefunden und konnt auch was damit anfangen. 🙂
    prinzipiel stell ich mir das jtz so vor, dass ich zu meinem "IDC_COMBO1"-objekt irgendwie die Nachricht "OnSerialMsg" hinzufüge ( da ich ja die daten im Combofenster darstellen will) oder muss ich dafür ein eigenes objekt erstellen?

    aber nu erstmal fleissig tutorial lesen 🙂

    vielen dank bis jtz
    balu

    ps: kann man dem thema eigentlich nachträglich noch nen richtigen namen geben?


Anmelden zum Antworten