动态库,CSerialPort串口类 响应事件

LZNJ06 2010-07-19 10:41:07
我用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;
}
...全文
200 点赞 收藏 16
写回复
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
LZNJ06 2010-07-20
用 m_hWnd 不行的。。。。我在想新创建 一个对话框 类试试。。。
回复
精锐掷矛手 2010-07-20
直接if (m_SerialPort.InitPort(m_hWnd,...);
回复
LZNJ06 2010-07-20
问题解决了,新建了一个从CWnd类继承的类CPortMana,在动态库中初始时

void CPortMana::MyCreate()
{
CreateEx(WS_EX_TOPMOST,AfxRegisterWndClass(CS_SAVEBITS),
"PortMana",WS_POPUP,10,10,11,11,NULL,NULL);

}
加入此关键代码 ,就有了消息响应去了就没 有了。谢谢大家 zxdlms rebort_Q的关注!
回复
LZNJ06 2010-07-20
SendMessage第一个参数是这样获取的
//CWnd* pWnd = AfxGetApp()->GetMainWnd(); 或
// CWnd* pWnd = theApp.GetMainWnd();
在初始化时给定的,
if (m_SerialPort.InitPort(pWnd,...);不知道有什么不对?
回复
LZNJ06 2010-07-20
我跟踪了一下,::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM) RXBuff, (LPARAM) port->m_nPortNr);这句的确执行了,估计是发错地方了,但这个参数传来传去,不知到底这些参数应该怎么给!谢谢啊
回复
精锐掷矛手 2010-07-20
[Quote=引用 6 楼 lznj06 的回复:]
怎么知道发消息窗口句柄是否有效呢?我是这样发的 m_SerialPort.WriteToPort(data, j);通过串口调试助手可以看到数据的确发出来了。
[/Quote]
不是发送数据,是发送WM_COMM_RXCHAR消息的窗口句柄。
回复
zxdlms 2010-07-20
调试的时候到串口类的收数据函数里,看看数据发到哪去了。
回复
LZNJ06 2010-07-20
怎么知道发消息窗口句柄是否有效呢?我是这样发的 m_SerialPort.WriteToPort(data, j);通过串口调试助手可以看到数据的确发出来了。
回复
精锐掷矛手 2010-07-20
你发送消息时,窗口句柄是否有效?
回复
LZNJ06 2010-07-20
CSerialPort串口类应该已经有WaitCommEvent 了吧,自己再加一个??
回复
libggbil 2010-07-20
消息是用于窗口的消息循环,肯定响应不了事件了,但你可以用回调函数来或者是发消息给窗口来实现吧
回复
精锐掷矛手 2010-07-20
WaitCommEvent
回复
LZNJ06 2010-07-20
我想知道一下为什么不产生这个串口事件,怎么来产生这个串口事件,谢谢,自己顶了。。
回复
LZNJ06 2010-07-20
直接用AfxGetApp()->m_pMainWnd试了,不行打开串口时出错,我再看看发送信息是否能行得通,谢谢啊。。
回复
zxdlms 2010-07-20
估计是窗口句柄不对,不用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里向主窗口发送,看看消息是否走通了。
回复
LZNJ06 2010-07-20
我想这样的问题应该有人知道才对的。。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告