MFC und COM-Schnittstelle

lokko

Grünschnabel
Hallo,
ich muss von einer 3D-Maus Daten bekommen welche mit der COM-Schnittstelle verbunden ist. Dies ist auch kein Problem, wenn man selbst den Zeitpunkt zum empfangen, also wann die Tasten gedrückt werden dürfen, festlegt. Dies geschiet durch einen Button.
So, jetzt habe ich mithilfe http://www.codeproject.com/system/serial.asp(ganz unten) das Programm geändert.
Mein Code zum Ansprechen sieht momentan so aus:
afx_msg LRESULT CTest1Dlg::OnSerialMsg (WPARAM wParam, LPARAM lParam)
{
const CSerialMFC::EEvent eEvent = CSerialMFC::EEvent(LOWORD(wParam));
const CSerialMFC::EError eError = CSerialMFC::EError(HIWORD(wParam));

if (eEvent & CSerial::EEventRecv)
{
// TODO: Read data from the port

daten.Init(1); //Com-Schnittstelle wird ausgewählt
daten.isOpen();//Überprüfung ob offen
daten.Receive(buffer2, 8); /Empfangen
strText1.Format("%s",buffer2);
SetDlgItemText(IDC_STATIC, strText1); //Ausgabe


}

// Return successful
return 0;
}

So, an für sich kann es ja nicht klappen, weil das Programm ja eingentlich nicht weiß, von wo die Message kommt... aber das ist genau mein Prob :( was muss ich tun, damit es geht?
Problem: Dass ich die Daten dann bekomme, wenn jemand eine Taste drückt, also etwas über die COM-Schnittstelle geschickt wird.
Würde mich freuen, wenn mir jemand helfen würde :P
saludo
lokko
 
lokko hat gesagt.:
So, an für sich kann es ja nicht klappen, weil das Programm ja eingentlich nicht weiß, von wo die Message kommt...
Hast du nicht nur die OnSerialMsg()-Methode implementiert, sondern auch den Eintrag in der Message-Map?
Außerdem benötigt die Open()-Methode der CSerial-Klasse einen Hwnd-Parameter für das Fenster, das die Message empfangen soll, also in deinem Fall CTest1Dlg. Dadurch weiß die Serialport-Klasse, dass sie bei empfangenen Daten OnSerialMsg() aufrufen soll.
Ist doch eigentlich in dem Artikel vom Codeproject ganz gut beschrieben.

Gruß
MCoder
 
Hallo,
es kann schon daran liegen :)
Habe jetzt mal ein Objekt von CSerial angelegt.
Danach rufe ich die Openfunktion auf:
m_serial2.Open (lpszDevice,
hwndDest,
nComMsg = WM_NULL,
lParam = 0,
dwInQueue = 0,
dwOutQueue = 0
);

So, wieder ein wenig weiter gekommen, jetzt muss ich nur noch die richtigen Daten übergeben, da sie ja nicht initialisiert sind. Auf jeden Fall piepst die maus :)

hm, ich schau mal wie ich das lösen kann, wäre aber für jeden rat dankbar :)

MfG
lokko
 
Zuletzt bearbeitet:
Hallo, vielleicht bei InitDialog() einfügen:
Code:
m_serial2.Open(_T("COM1"), GetSafeHwnd());

Gruß
MCoder
 
Hallo,
es kommt eine Fehlermeldung wenn ich es so wie du beschrieben hast mache:
E:\projecto\maus\test1\test1Dlg.cpp(73) : error C2664: 'Open' : Konvertierung des Parameters 2 von 'struct HWND__ *' in 'unsigned long' nicht moeglich
Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
 
Hallo,
vielen Dank, jetzt wirds wenigstens erstellt.
Aber ich bekomme keine Daten.
In den OnInitDialog habe ich jetzt folgende Zeilen:
Code:
m_serial2.Open(_T("COM1"), GetSafeHwnd());
serial.Setup(CSerial::EBaud9600,CSerial::EData8,CSerial::EParNone,CSerial::EStop2);
//Baud 9600 , 8 Databits und zwei Stobits
Die Funktion dann so:

Code:
afx_msg LRESULT CTest1Dlg::OnSerialMsg (WPARAM wParam, LPARAM lParam)
{
const CSerialMFC::EEvent eEvent = CSerialMFC::EEvent(LOWORD(wParam));
const CSerialMFC::EError eError = CSerialMFC::EError(HIWORD(wParam));


if (eEvent & CSerial::EEventRecv)
	{
		// Create a clean buffer
		DWORD dwRead;
		char szData[8];
		const int nBuflen = sizeof(szData)-1;

		// Obtain the data from the serial port
		do
		{
			m_serial.Read(szData,nBuflen,&dwRead);
			//szData[dwRead] = '0'; hiermit überprüfe ich ob er in die Funktion reingeht
			
			
			SetDlgItemText(IDC_STATIC, szData);
		} while (dwRead == nBuflen);
	}
return 0
}
Jetzt bekommt er zwar einen Anstoss, also verändert das Textfeld, aber nicht mit den empfangenen Werten!
Hoffe einer kann mir helfen!
saludo
lokko
 
Zuletzt bearbeitet:
Zurück