1、新建MFC对话框工程如下
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控件:
右击电话图标选择“Class Wirzard”,添加变量m_comm1,添加Function:
双击两个Button按钮;
代码中显示如下:
[cpp] view plain copy print?
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、将上面代码补全如下:
[cpp] view plain copy print?
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);
}