CMSComm und Messagehandling
-
Guten Morgen euch,
ich hab mal wieder ein kleineres Problem, vielleicht kann mir ja wer weiterhelfen.
Ich habe eine serielle Kommunikation realisiert unter Benutzung der mitgelieferten ActiveX Controls von Visual 6.0. Im folgenden Link ist dies beschrieben gewesen.
http://www.geocities.com/arazone/mfc.html?200527?200529
So, und nun beginnen meine Probleme
Also, ich bekomme hin zu senden. Ich habe über ein Nullmodemkabel meinen COM1 und COM2 verbunden. Sprich ch sende mit meinem Programm einen String und sehe mir unter dem Hyperterminal an, was ankommt. Und es passt.
Da ich also senden kann und die serielle Schnittstelle nutze, wieso habe ich kein Event von ausgehender oder eingehender Kommunikation. Da ich das ganze in ein Projekt einbasteln muss, habe ich das ganze etwas abgewandelt, was beim Link steht und es mag ned.
//Add this code in view.h below DECLARE_MESSAGE_MAP()
DECLARE_EVENTSINK_MAP()//Add this function declaration in view.h file
afx_msg void OnCommEvent();So mag er es im Link haben, ich habe es also bei meiner Headerdatei eingebunden:
protected: // Generated message map functions //{{AFX_MSG(CCommDlg) virtual BOOL OnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP() DECLARE_EVENTSINK_MAP() afx_msg void OnCommEvent();
In der .cpp muss ich dann folgendes implementieren nach ihm:
//Add this code in view.cpp after BEGIN_MESSAGE_MAP() and END_MESSAGE_MAP()
BEGIN_EVENTSINK_MAP(CMyView, CView)
ON_EVENT(CMyView, ID_COMMCTRL, 1 /* OnComm */, OnCommEvent, VTS_NONE)
END_EVENTSINK_MAP()//Add this function definition in view.cpp
void CMyView::OnCommEvent()
{
CString str;
int i = m_mscomm.GetCommEvent();
switch(i)
{
case 1: //vbMSCommEvSend
TRACE0("\nOnComm Event for Send");
break;case 2: //vbMSCommEvReceive
TRACE0("\nOnComm Event for Receive");
//Add reception code here
break;
}
}Also habe ich folgendes fabriziert:
BEGIN_EVENTSINK_MAP(CCommDlg, CDialog) ON_EVENT(CCommDlg, IDD_TRANSMIT, 1 /* OnComm */, OnCommEvent, VTS_NONE) ON_EVENT(CCommDlg, IDD_TRANSMIT, 2 /* OnComm */, OnCommEvent, VTS_NONE) END_EVENTSINK_MAP()
Wofür steht 1 und 2? Ich vermmute mal den Port von dem ich sende bzw empfange. Zu guter letzt noch das Eventhandling:
void CCommDlg::OnCommEvent() { CString str; CProgressCtrl* Balken=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1); int i = m_mscomm.GetCommEvent(); switch(i) { case 1: //vbMSCommEvSend TRACE0("\nOnComm Event for Send"); Balken->SetPos(50); break; case 2: //vbMSCommEvReceive TRACE0("\nOnComm Event for Receive"); Balken->SetPos(100); CDialog::OnOK(); break; } }
Wie ihr seht, sollte sich bei einem Sendeevent der Statusbalken auf 50% bewegen und bei einem Empfangsevent auf 100%. Aber selbst, wenn ich nur in das Event was mache, passiert dies nicht. Mein Event wird nicht aufgerufen, obwohl ein Sendevorgang deutlich geschieht. Was passt beim Messagemapping hier nicht? Weil nur da eigentlich was schiefgelaufen sein kann.
Thx im Voraus.