OnSerialMsg wird nicht aufgerufen
-
Hey ich verwende die SerialMFC Klasse. Nur leider wird meine "OnSerialMsg"-Funktion nicht aufgerufen. Das ganze läuft als Dialogfeldanwendung. Dabei bin ich wie folgt vorgegangen.
Folgender Code befindet sich in meiner Dialogklasse.BEGIN_MESSAGE_MAP(CTestDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_WM_SERIAL(&CTestDlg::OnSerialMsg) END_MESSAGE_MAP()afx_msg LRESULT CTestDlg::OnSerialMsg(WPARAM wParam, LPARAM /*lParam*/) { const CSerialMFC::EEvent eEvent = CSerialMFC::EEvent(LOWORD(wParam)); const CSerialMFC::EError eError = CSerialMFC::EError(HIWORD(wParam)); switch (eEvent) { case CSerialMFC::EEventRecv: { // Create a clean buffer DWORD dwRead; char szData[BUFFERSIZE]; const int nBuflen = sizeof(szData); // Obtain the data from the serial port do { m_Serial.Read(szData,nBuflen,&dwRead); FormatFrame(szData,dwRead); } while (dwRead == nBuflen); break; } default: break; } // Return successful return 0; }geöffnet wird der serielle Port mit:
m_Serial.Open(_T("COM1"),this,WM_NULL)Hab ich irgendwas vergessen? Ich hab mir mal den ListenerThread angeschaut, dort wird das Event "EEventRecv" gesetzt. Also geh ich mal davon aus, das die Daten schon empfangen werden. Nur wird die Funktion OnSerialMsg nie aufgerufen.
-
m_Serial.Open(_T("COM1"),this,WM_NULL)Ist this auch wirklich der Dialog, in dem Du die nachrichten empfangen willst?
-
Also der ComPort wird durch einen ButtonClick geöffnet. Dieser Button befindet sich auf dem Dialog, welcher auch die Nachrichten empfangen soll.
Dann müsste das mit this doch stimmen oder?Vielen Dank im Voraus
-
Wenn this der Dialog ist sehe ich das auch so.
Dann setze doch mal einen Breakpoint im SerialWindows Code wo die Nachricht gesendet werden soll und prüfe Handle und Windows Nachricht. So schwierig ist das ja nicht zu debuggen.
-
Also ich hab hab mir jetzt mal eine Variable vom Typ "CWnd* pMainDlg" zu meinem Dialog hinzugefügt. Diese Variable hab ich in der OnInitDialog initialisiert.
pMainDlg = this;nun hab ich das bis in die
CSerialWnd::OnEvent(eEvent eEvent, EError eError)verfolgt. Dort wird ja die
::PostMessage(m_hwndDest,m_nComMsg,MAKEWPARAM(eEvent,eError),LPARAM(m_lParam));aufgerufen, wobei "m_hwndDest" den Wert meines Dialogs hat. Also müsste das so stimmen. Schade denn das wär ein logischer Fehler gewesen^^
Meine OnSerialMsg wird immernoch nicht aufgerufen. Muss dann doch mal wo anderst suchen.
-
Weiss ja net, aber warum übergibst du einen Zeiger in der MessageMap
statt:
ON_WM_SERIAL(&CTestDlg::OnSerialMsg)sollte das nicht:
ON_WM_SERIAL(OnSerialMsg)heissen. Ob das nun der Grund is weiss ich auch net.
Gruß Matthias
-
Hab normal schon
ON_WM_SERIAL(OnSerialMsg)drin. Hab das mit dem Zeiger mal probiert ob es so funktioniert. Hat aber keinen Unterschied gemacht.
Muss ich die Windowsnachricht sonst noch irgendwie anmelden? Oder genügt der Eintrag in der MessageMap?
-
Der Eintrag sollte genügen.
Hast Du ein DECLARE_MESSAGEMAP in CTestDlg?
-
Ok hab meinen Fehler gefunden. Ich wollte auf die Daten der seriellen Schnittstelle warten und ging deshalb in eine while-Schleife und wartete bis die Daten vorliegen. Dachte die while-Schleife wird unterbrochen wenn eine WindowsNachricht ansteht und erst fortgeführt wenn diese abgearbeitet wurde. Also ähnlich wie bei einem Interrupt.
Dann muss ich das mit dem Auf-Daten-warten doch anderst machen.