我用VC6.0建了一个MFC 的动态库,使用了CSerialPort串口类,在此动态库中用串口进行通信,经测试能正常打开串口,关闭串口,也能发送串口数据,现在关键的是不能得到串口响应接收数据事件。响应函数全部建好了,以前在对话框中使用过一切都好,但放此动态库中就不能响应此消息,不知为什么,怎么样能让此类在动态库中也响应EV_RXFLAG | EV_RXCHAR;此事件呢。请大家帮忙看看,谢谢
afx_msg LRESULT OnCommunication(WPARAM ch,LPARAM port);
ON_MESSAGE(WM_COMM_RXCHAR,OnCommunication)
已放合适位置,。
//打开串口的程序
         CWnd* pWnd = AfxGetApp()->GetMainWnd();
if (m_SerialPort.InitPort(pWnd, m_nCom,m_nBaud,m_cParity,m_nDatabits,m_nStopbits,m_dwCommEvents,512))
{   
              m_SerialPort.StartMonitoring();
     m_bOpenPort = true;
     return 1;
}

解决方案 »

  1.   

    CSerialPort串口类应该已经有WaitCommEvent 了吧,自己再加一个??
      

  2.   

    怎么知道发消息窗口句柄是否有效呢?我是这样发的 m_SerialPort.WriteToPort(data, j);通过串口调试助手可以看到数据的确发出来了。
      

  3.   

    不是发送数据,是发送WM_COMM_RXCHAR消息的窗口句柄。
      

  4.   

    我跟踪了一下,::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM) RXBuff, (LPARAM) port->m_nPortNr);这句的确执行了,估计是发错地方了,但这个参数传来传去,不知到底这些参数应该怎么给!谢谢啊
      

  5.   

    SendMessage第一个参数是这样获取的  
    //CWnd* pWnd = AfxGetApp()->GetMainWnd();  或
    //  CWnd* pWnd = theApp.GetMainWnd(); 
    在初始化时给定的,
    if (m_SerialPort.InitPort(pWnd,...);不知道有什么不对?
      

  6.   

    直接if (m_SerialPort.InitPort(m_hWnd,...);
      

  7.   

    用 m_hWnd 不行的。我在想新创建 一个对话框 类试试
      

  8.   

    估计是窗口句柄不对,不用AfxGetApp()->GetMainWnd(),直接用AfxGetApp()->m_pMainWnd试一试。CWnd* pWnd = AfxGetApp()->m_pMainWnd;
    if (m_SerialPort.InitPort(pWnd, m_nCom,m_nBaud,m_cParity,m_nDatabits,m_nStopbits,m_dwCommEvents,512))另外你可以自己定义一个消息在dll里向主窗口发送,看看消息是否走通了。
      

  9.   

    直接用AfxGetApp()->m_pMainWnd试了,不行打开串口时出错,我再看看发送信息是否能行得通,谢谢啊。。
      

  10.   

    问题解决了,新建了一个从CWnd类继承的类CPortMana,在动态库中初始时 void CPortMana::MyCreate()
    {
    CreateEx(WS_EX_TOPMOST,AfxRegisterWndClass(CS_SAVEBITS),
    "PortMana",WS_POPUP,10,10,11,11,NULL,NULL);

    }
    加入此关键代码 ,就有了消息响应去了就没 有了。谢谢大家  zxdlms  rebort_Q的关注!