1、选择菜单项Project/Add to Project/Components and Controls……,将弹出一个对话框以选择系统中已有的组件(Components)和控件(Controls)。选择Registered ActiveX Controls文件夹下的Microsoft Communications Control项并按下Insert按钮,将MSComm控件支持加入到本项目中。这时将生成一个名为CMSComm的C++类,并且在对话框编辑器里的工具栏将出现MSComm控件图标。CMSComm类是由MSComm控件导出的一系列接口函数构成的,利用它将可以访问MSComm控件的属性(Property)和方法(Method)。
2、选取 controls 上 mscomm 控件在对话框上画出,双击mscomm控件,系统会自动生成:
1>
dialog.h 文件中生成
afx_msg void OnOnCommMscomm1();
DECLARE_EVENTSINK_MAP()
2>
dialog.cpp 文件中生成
BEGIN_EVENTSINK_MAP(CMy1Dlg, CDialog)
//{{AFX_EVENTSINK_MAP(CMy1Dlg)
ON_EVENT(CMy1Dlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnCommMscomm1, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
3>
dialog.cpp 文件中生成
void CMy1Dlg::OnOnCommMscomm1()
{
}
3、需手动添加的有:
1>
dialog.h 文件中
#include ""mscomm.h""
public:
CMSComm m_Comm;
2>
dialog.cpp 文件中,OnInitDialog()函数内部:
DWORD style=WS_VISIBLE|WS_CHILD;
if (!m_Comm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))
{
TRACE0("Failed to create OLE Communications Control");
return -1; // fail to create
}
m_Comm.SetCommPort(2);
m_Comm. SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
if (!m_Comm.GetPortOpen())
{
m_Comm.SetSettings("9600,N,8,1");
m_Comm.SetPortOpen(true);
m_Comm.SetInBufferCount(0);
m_Comm.SetRThreshold(1); //为1表示有一个字符引发一个事件
m_Comm.SetInputLen(0);
}
3>
dialog.cpp 文件中, OnOnCommMscomm1() 函数内部:
VARIANT vResponse;
int k;
CString str,befstr;
if(m_Comm.GetCommEvent()==2)
{
k = m_Comm.GetInBufferCount(); //接收到的字符数目
if(k>0)
{
vResponse = m_Comm.GetInput();
str = V_BSTR(&vResponse);
GetDlgItemText(IDC_EDIT1,befstr);
//befstr = befstr + _T("/r/n");
befstr = befstr + str;
SetDlgItemText(IDC_EDIT1,befstr);
}
}
*********************************另一个实例****************************
dialog.cpp 文件中,OnInitDialog()函数内部:
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetCommPort(3); //选择com1
if( !m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("cannot open serial port");
m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
m_ctrlComm.SetRThreshold(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
void CSCommTestDlg::OnComm()
{
VARIANT m_input1;
COleSafeArray m_input2;
long length,i;
BYTE data[1024];
CString str;
if(m_ctrlComm.GetCommEvent()==2)//接收缓冲区内有字符
{
m_input1=m_ctrlComm.GetInput();//读取缓冲区内的数据
m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量
length=m_input2.GetOneDimSize();//确定数据长度
for(i=0;i<length;i++)
m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组
for(i=0;i<length;i++)//将数组转换为Cstring型变量
{
BYTE a=* (char *)(data+i);
str.Format("%c",a);
m_strRXData+=str;
}
}
UpdateData(FALSE);//更新编辑框内容
}
// m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据