以前曾看到一篇文章,说如果使用一般的视而不使用CFormView或者Dialog,就无法使用MSComm控件。但事实并不是这么回事。如同标准控件一样,对于ActiveX控件也可以使用Create函数,从而在运行时创建控件,并且实现所有功能。
下面介绍步骤:
1>使用resource symbols加入IDC_MSCOMM
2>在设置串口时加入CReate
void Init_Com()
{
m_Serial.Create("windowname",0,
CRect(0,0,0,0),this,IDC_MSCOMM);
// 指定串口号
m_Serial.SetCommPort(2);
// 关闭该串口
if(m_Serial.GetPortOpen())
m_Serial.SetPortOpen(FALSE);
// 通信参数设置
m_Serial.SetSettings("9600,N,8,1");
// 指定接收缓冲区大小
m_Serial.SetInBufferSize(1024);
// 清空接收缓冲区
m_Serial.SetInBufferCount(0);
// 设置数据获取方式
m_Serial.SetInputMode(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_Serial.SetRThreshold(1);
//设置当前接收区数据长度为0
m_Serial.SetInputLen(0);
if( !m_Serial.GetPortOpen())
m_Serial.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("cannot open serial port");
m_Serial.GetInput();//先预读缓冲区以清除残留数据
}
3>发送函数
void Send_Data()
{
m_Serial.SetOutput(COleVariant("got"));
}
4>加入对数据接收和错误消息的映射。须手工进行:
在头文件中加入
afx_msg void OnComm();
在实现文件中加入
BEGIN_EVENTSINK_MAP(CxxxView, CView)
//{{AFX_EVENTSINK_MAP(CTestCommView)
ON_EVENT(CxxxView, IDC_MSCOMM, 1 /* OnComm */, OnComm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CxxxView::OnComm()
{
// TODO: Add your control notification handler code here
AfxMessageBox("got");
}
大功告成!