1. 在Resource.h文件中定义消息
#define WM_OpenComm_event WM_USER + 101
#define WM_CommTx_event WM_USER + 102
注意,当新增加控件后,这些在Resouce.h中添加的语句会被清除,需重新再添加一次。
2. 在父窗口的.h文件,类定义中添加对应的消息处理函数,作为类的成员函数:
afx_msg LRESULT OnOpenComm(WPARAM wParam, LPARAM iParam);
afx_msg LRESULT OnCommTx(WPARAM wP, LPARAM iP);
3. 在父窗体的.cpp文件中,增加各消息的消息映射
ON_MESSAGE(WM_OpenComm_event, OnOpenComm)
ON_MESSAGE(WM_CommTx_event, OnCommTx)
4. 完成消息对应处理函数的内容:
LRESULT CPCR_ChipDlg::OnCommTx(WPARAM wP, LPARAM iP)
{
// SendCom(dataNum);
AfxMessageBox("Receive Message");
return 0;
}
LRESULT CPCR_ChipDlg::OnOpenComm(WPARAM wParam, LPARAM iParam)
{
//open com
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetCommPort(ComNum); // 打开串口
if(!m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE);
else
AfxMessageBox("can not open serial port");
m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据
// m_ctrlComm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.SetRThreshold(ComByteNum); //本案一个包有35个有效字节
//定接收33个字符时引发OnComm事件
// m_ctrlComm.SetInputLen(1); //设置当前接收区数据长度为0
m_ctrlComm.SetInputLen(ComByteNum); //本案中设置接收buffer数据长度为33
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
AfxMessageBox("Open Comm successfully");
return 0;
}
注意,函数最后要加 return 0;
5. 在子对话框需要发送消息的地方,执行发送消息语句:
<span style="color:#000000;">WPARAM a=8;
LPARAM b=9;
HWND hwnd = AfxGetApp()->GetMainWnd()->GetSafeHwnd();
::SendMessage(hwnd,WM_CommTx_event,a,b);
</span>
重要:
WPARAM a=8;LPARAM b=9;
HWND hwnd = AfxGetApp()->GetMainWnd()->GetSafeHwnd();
::SendMessage(hwnd,WM_CommTx_event,a,b);
参考文章:
http://blog.csdn.net/phenixyf/article/details/9300425
http://blog.csdn.net/phenixyf/article/details/41808117