20160426 VC++(VS2013)串口编程图文教程(MSComm的使用)

1、新建MFC对话框工程如下

20160426 VC++(VS2013)串口编程图文教程(MSComm的使用)_第1张图片


2、给编辑框控件添加变量,其中Edit Box添加Value变量,Button添加Control变量,ID和变量分别为:

IDC_BTNOPEN()                                  CButton m_cBtnOpen;

IDC_BTNSEND()                                  CButton m_cBtnSend;

IDC_EDIT_RXDATA()                          CString m_sRXDATA;

IDC_EDIT_TXDATA()                           CString m_sTXDATA;


3、右击插入Active X控件:

20160426 VC++(VS2013)串口编程图文教程(MSComm的使用)_第2张图片

右击电话图标选择“Class Wirzard”,添加变量m_comm1,添加Function:

20160426 VC++(VS2013)串口编程图文教程(MSComm的使用)_第3张图片

20160426 VC++(VS2013)串口编程图文教程(MSComm的使用)_第4张图片

双击两个Button按钮;

代码中显示如下:

void CMSCommTestDlg::OnBnClickedBtnopen()
{
	// TODO: Add your control notification handler code here
}
void CMSCommTestDlg::OnBnClickedBtnsend()
{
	// TODO: Add your control notification handler code here
}
void CMSCommTestDlg::OnOncommMscomm1()
{
	// TODO: Add your message handler code here
}

5、将上面代码补全如下:

void CMSCommTestDlg::OnClickedBtnopen()
{
	// TODO: Add your control notification handler code here
	//如果端口已经开启,那么先关闭
	if (m_comm1.get_PortOpen())
	{
		m_comm1.put_PortOpen(FALSE);
	}
	m_comm1.put_CommPort(3);				//选择com3,可以根据具体情况更改
	m_comm1.put_InBufferSize(1024);			//设置输入缓冲区的大小,Bytes
	m_comm1.put_OutBufferSize(1024);		//设置输出缓冲区的大小,Bytes
	m_comm1.put_Settings(_T("9600,n,8,1")); //波特率9600,无校验,8个数据位,停止位1
	m_comm1.put_InputMode(1);				//1:表示以二进制方式检索数据
	m_comm1.put_RThreshold(1);				//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
	m_comm1.put_InputLen(0);				//设置当前接收区长度是0
	if (!m_comm1.get_PortOpen())
	{
		m_comm1.put_PortOpen(TRUE);
	}
	else
	{
		AfxMessageBox(_T("Can not open serial port!"));
	}
	m_comm1.get_Input();					//先预读缓冲区以清除残留数据
	UpdateData(FALSE);
}


void CMSCommTestDlg::OnClickedBtnsend()
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_comm1.put_Output(COleVariant(m_sTXDATA));//发送数据
}

void CMSCommTestDlg::OnOncommMscomm1()
{
	// TODO: Add your message handler code here
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	LONG len, k;
	BYTE rxdata[2048];
	CString strtemp;
	if (m_comm1.get_CommEvent() == 2)		//事件值为2表示缓冲区内有字符
	{
		variant_inp = m_comm1.get_Input();	//读缓冲区
		safearray_inp = variant_inp;		//VARIANT型变量转换为ColeSafeArray型变量
		len = safearray_inp.GetDim();		//得到有效数据长度
		for (k = 0; k < len; k++)
		{
			safearray_inp.GetElement(&k, rxdata + k);//转换为BYTE型数组
		}
		for (k = 0; k < len; k++)			//将数组转换为CString型变量
		{
			BYTE bt = *(char*)(rxdata + k); //字符型
			strtemp.Format(_T("%c"), bt);	//将字符送入临时变量strtemp存放
			m_sRXDATA += strtemp;			//接收到的数据放到编辑框对应的变量中
		}
	}
	SetDlgItemText(IDC_EDIT_RXDATA, m_sRXDATA);
}

备注:

如果Project是基于视图的,只需在对话框窗体中插入MSComm控件,再在视图类的ClassWizard中为该控件声明一个变量即可,如m_Comm1。


你可能感兴趣的:(VC++串口编程)