MFC编程.docx

上传人:b****1 文档编号:10685848 上传时间:2023-05-27 格式:DOCX 页数:15 大小:842.27KB
下载 相关 举报
MFC编程.docx_第1页
第1页 / 共15页
MFC编程.docx_第2页
第2页 / 共15页
MFC编程.docx_第3页
第3页 / 共15页
MFC编程.docx_第4页
第4页 / 共15页
MFC编程.docx_第5页
第5页 / 共15页
MFC编程.docx_第6页
第6页 / 共15页
MFC编程.docx_第7页
第7页 / 共15页
MFC编程.docx_第8页
第8页 / 共15页
MFC编程.docx_第9页
第9页 / 共15页
MFC编程.docx_第10页
第10页 / 共15页
MFC编程.docx_第11页
第11页 / 共15页
MFC编程.docx_第12页
第12页 / 共15页
MFC编程.docx_第13页
第13页 / 共15页
MFC编程.docx_第14页
第14页 / 共15页
MFC编程.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

MFC编程.docx

《MFC编程.docx》由会员分享,可在线阅读,更多相关《MFC编程.docx(15页珍藏版)》请在冰点文库上搜索。

MFC编程.docx

MFC编程

本人之前从未接触MFC编程,由于项目需要,所以上网查阅了相关资料,并实现了上位机串口通信。

由于网上的资料还不够详细,本人决定写一个图文并茂的详细教程。

因为本人只是初学,如有错误,欢迎指点。

开发环境是:

VC6.0

串口编程方法:

32位控件

参考资料:

第一步:

建工程

运行VC6.0,文件-〉新建,选择MFCAppWizard(exe),工程名称:

CommTest。

确定

进入MFC应用程序向导-步骤1

选择基本对话框,其他的都默认,所以可以直接点击完成。

这样工程就建立完毕。

第二步:

控件布局与设置

工程建立后,出现如下对话框:

删除上面的一个静态文本和两个按钮。

从控件工具栏拖入两个静态文本,两个编辑框,两个按钮和一个组框。

如果没有控件工具栏,可以鼠标右键点击菜单栏空白处,选择控件。

布局后的效果:

  

接下来开始设置显示的文字和ID号。

选中按钮1,右键-〉属性。

ID号设为IDC_BtnOpen,标题为打开。

用于打开串口

选中按钮2,右键-〉属性。

ID号设为IDC_BtnSend,标题为发送。

用于发送数据。

选择第一个编辑框,右键-〉属性,更改ID为IDC_EditRxData,用于显示接收的数据。

同理选择第二个编辑框,更改ID为IDC_EditTxData。

用于输入待发送的数据。

分别选中静态文本和组框,更改标题,不需要更改ID号。

最终效果如下:

现在先编译运行一次,避免出现错误而影响到后面的操作。

接下来这一步是关键的一步:

在对话框中鼠标右键-〉选中插入ActiveX控件。

选择MicrosoftCommunicationControl,ver......(后面的字母没看到)。

确定

这时出现了一个电话的控件,右键该控件-〉选择类向导……,出现如下对话框:

先设置每个控件的变量,选择MemberVariables,选择IDC_BtnOpen,然后AddVariable。

设置变量名为m_BtnOpen,名称与ID号相似只是为了方便记忆,可随便定义。

其他默认。

同理添加其他控件的变量,在添加MSCOMM1的变量时,会出现提示,选择“是”。

添加完毕后:

变量添加完毕后选回MessageMaps,选择IDC_BtnOpen->BN_CLICKED->AddFunction,默认函数名就好了,OK。

同理分别添加IDC_BtnSend->BN_CLICKED函数和IDC_MSCOMM1->OnComm函数。

确定。

编译运行,避免有错误。

如果出错,详细检查有没有误操作。

一般不会出错的。

第三步:

添加代码

选择左边信息栏的FileView,双击打开CommTestDlg.cpp,在文件尾部可以看到刚刚添加的三个函数。

在OnBtnOpen()函数添加代码:

voidCCommTestDlg:

:

OnBtnOpen() 

{

//TODO:

Addyourcontrolnotificationhandlercodehere

if(m_Comm1.GetPortOpen())

m_Comm1.SetPortOpen(FALSE);

m_Comm1.SetCommPort

(1);//选择com1,可根据具体情况更改

m_Comm1.SetInBufferSize(1024);//设置输入缓冲区的大小,Bytes

m_Comm1.SetOutBufferSize(1024);//设置输入缓冲区的大小,Bytes//

m_Comm1.SetSettings("9600,n,8,1");//波特率9600,无校验,8个数据位,1个停止位

m_Comm1.SetInputMode

(1);//1:

表示以二进制方式检取数据

m_Comm1.SetRThreshold

(1); 

//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

m_Comm1.SetInputLen(0);//设置当前接收区数据长度为0

if(!

m_Comm1.GetPortOpen())

m_Comm1.SetPortOpen(TRUE);//打开串口

else

AfxMessageBox("cannotopenserialport");

m_Comm1.GetInput();//先预读缓冲区以清除残留数据

UpdateData(false);

}

编译运行。

在OnOnCommMscomm1()函数添加代码:

voidCCommTestDlg:

:

OnOnCommMscomm1() 

{

//TODO:

Addyourcontrolnotificationhandlercodehere

VARIANTvariant_inp;

  COleSafeArraysafearray_inp;

  LONGlen,k;

  BYTErxdata[2048];//设置BYTE数组An8-bitintegerthatisnotsigned.

  CStringstrtemp;

  if(m_Comm1.GetCommEvent()==2)//事件值为2表示接收缓冲区内有字符

  {      ////////以下你可以根据自己的通信协议加入处理代码

    variant_inp=m_Comm1.GetInput();//读缓冲区

    safearray_inp=variant_inp;//VARIANT型变量转换为ColeSafeArray型变量

    len=safearray_inp.GetOneDimSize();//得到有效数据长度

    for(k=0;k

      safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组

    for(k=0;k

    {

      BYTEbt=*(char*)(rxdata+k);//字符型

      strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放

      m_EditRxData+=strtemp;//加入接收编辑框对应字符串 

    }

  }

  //UpdateData(FALSE);//更新编辑框内容

SetDlgItemText(IDC_EditRxData,m_EditRxData);//不使用UpdateData(FALSE);的原因是该函数会

//刷新整个对话框的数据,而SetDlgItemText()

//只更新接收编辑框的数据。

}

现在可以接上串口做测试了。

我是用单片机做串口发送,上位机做串口接收。

单片机持续发送字符'D'.上位机正常接收:

接着添加发送功能,

voidCCommTestDlg:

:

OnBtnSend() 

{

//TODO:

Addyourcontrolnotificationhandlercodehere

UpdateData(TRUE);//读取编辑框内容

m_Comm1.SetOutput(COleVariant(m_EditTxData));//发送数据

}

发送大写字母N,在单片机用LED显示。

‘N’对应的ASCII码的二进制是01001110。

实物结果如图:

由于晚上灯光不足,拍出来效果不明显。

懂单片机的童鞋应该能看明白。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 书信模板

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2