VC++高级程序设计_第1页
VC++高级程序设计_第2页
VC++高级程序设计_第3页
VC++高级程序设计_第4页
VC++高级程序设计_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目 录1 实验要求.12 软硬件平台简介.13 总体设计思想.14 具体设计界面图(含详细操作步骤).24.1建立应用工程. 24.2添加界面控件. 24.3映射控件通用消息.34.4为对应控件添加代码.34.5生成可执行的EXE文件.7五软件流程图.8六. 测试结果截图.9七. 总结.10一、实验要求把一台计算机和单片机(12C5A60S2)的串口通过串口线连在一起,通过串口实现通讯。利用VC+高级语言、C语言编程实现,要求程序界面友好,有发送和接收功能,其接收和发送内容可在屏幕上显示。2、 软硬件平台简介 CPU:P4 2G及以上兼容于80x86 架构的中央处理器 内存:1G 及以上 硬盘

2、:80G及以上 网卡:100M及以上 操作系统:Windows XP 及以上 软件:Visual C+ 6.0 Keil uVision3-4 STC_ISP_V488 硬件:51开发板搭载STC12C5A60S2单片机1602液晶显示屏三、总体设计思想串口通讯把数据的字节分解成单个的二进制比特流依次传输,其结构简单,连接线少,应用非常广泛。实现串口通信的方法很多。如:利用标准通信函数实现串口通信、利用API实现串口通信和利用ActiveX控件实现。本文主要采用ActiveX控件Microsoft Communications Control(MSComm)编程,Windows平台先进的Act

3、iveX技术使得对串口编程不再需要处理烦琐的细节。利用已有的AxtiveX控件,只需要编写少量的代码,就可以轻松高效地完成任务。以下对ActiveX控件属性进行简单介绍,在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_comm),通过该对象便可以对串口属性进行设置,MSComm控件共有27个属性,这里只介绍其中几个常用属性:CommPort:设置并回通讯端口号,缺省为COM4。Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。PortOpen:设置并返回通讯端口的状态,也可以打开和关闭端口。Input:从接收缓冲区返回和删除字符。Outp

4、ut:向发送缓冲区写一个字符串。InputLen:设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内容。InBufferCount:返回接收缓冲区中已接收到的字符数,将其置0可以清除接收缓冲区。InputMode:定义Input属性获取数据的方式(为0:文本方式;为1:二进制方式)。RThreshold和SThreshold:表示在OnComm事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。四、具体设计截面图1、建立应用工程启动VC+60,创建一个基于对话框的MFC应用程序项目,选择Project菜单下Add to Project子菜单中的Components

5、and Controls选项,在弹出的对话框中双击Registered ActiveX Controls项,则所有注册过的ActiveX控件出现在列表框中。选择Microsoft Communications Control version 60,单击insert按钮即可将通信控件插入该工程。添加该控件到对话框中,设置控件ID号为IDC _MSCOMM.2、添加界面控件将对话框中的按钮“取消”删除,将“确定”按钮改为“退出”。在对话框中添加适当的界面控件。本实验中需添加的标注用的静态控件、用于选择串口和设置波特率的组合框分别设置控件ID号为IDC_COMBO_SELECT和IDC _COMBO

6、_BTL SET、添加控制开始发送/接收按钮控件并设置控件ID号为IDC_BUTTON_START,添加用于输入发送数据和输出接收数据的编辑框并设置控件ID号为IDC_EDIT_SEND和IDC_EDIT_RECEVE,同时为其设置各种属性。添加完后如下图3、映射控件通用消息 (1)打开MFC ClassWizard对话框,单击Member Valuable为相应控件添加变量。添加变量名和类型如下表:控件ID号变量名变量类似IDC_EDIT_RECEVECStringm_strReceiveIDC_EDIT_SENDCStringm_strSendIDC_MSCOMMCMSCommm_MSco

7、mmIDC_PORTintm_nPort如下图:4、为对应控件添加代码(1)为按钮IDC_BUTTON_OPEN添加单击响应函数void CMyDlg:OnButtonOpen();函数代码如下: void CMyDlg:OnButtonOpen() / TODO: Add your control notification handler code hereif(m_MSComm.GetPortOpen() AfxMessageBox(_T(亲,请先关闭串口!); return; UpdateData(TRUE); if(m_nPort=-1) AfxMessageBox(_T(亲,请选择串

8、口!); return; m_MSComm.SetCommPort(m_nPort);/选择com m_MSComm.SetInBufferSize(1024);/设置输入缓冲区的大小 m_MSComm.SetOutBufferSize(1024);/设置输出缓冲区的大小 m_MSComm.SetInputLen(0);/设置当前接收区数据长度为0 m_MSComm.SetInputMode(1);/1:表示以二进制方式检取数据 m_MSComm.SetRThreshold(1); /* 接收缓冲区有1个及1个以上字符时,将引发接收数据的Oncomm事件*/ m_MSComm.SetPortO

9、pen(TRUE);/打开串口 if(m_MSComm.GetPortOpen() GetDlgItem(IDC_BUTTON_OPEN)-EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_CLOSE)-EnableWindow(TRUE); else m_MSComm.SetOutBufferCount(0); CString strInfo=_T(); strInfo.Format(_T(啊哦!打开串口COM%d失败!),m_nPort); AfxMessageBox(strInfo); GetDlgItem(IDC_BUTTON_OPEN)-Enabl

10、eWindow(TRUE); GetDlgItem(IDC_BUTTON_CLOSE)-EnableWindow(FALSE); (2)为按钮IDC_BUTTON_SEND添加单击响应函数void CMyDlg:OnButtonSend();函数代码如下: void CMyDlg:OnButtonSend() / TODO: Add your control notification handler code here if(!m_MSComm.GetPortOpen() AfxMessageBox(_T(亲,请先打开串口!); return; UpdateData(TRUE); /读取编辑框

11、内容 int nSendLength=m_strSend.GetLength();/要发送的字符串送字符数组 CByteArray ByteArray; ByteArray.RemoveAll(); ByteArray.SetSize(nSendLength); for(int i=0;iEnableWindow(TRUE); GetDlgItem(IDC_BUTTON_CLOSE)-EnableWindow(FALSE);(4)为组合框添加初始化函数void CMyDlg:OnSelchangeBps() ;编辑加入代码如下:void CMyDlg:OnSelchangeBps() / TO

12、DO: Add your control notification handler code here UpdateData(true); int nlndex=m_bps.GetCurSel();a=nlndex; switch(nlndex) case 0: m_MSComm.SetSettings(19200,n,8,1); break; case 1: m_MSComm.SetSettings(14400,n,8,1); break; case 2: m_MSComm.SetSettings(9600,n,8,1); break; case 3: m_MSComm.SetSetting

13、s(4800,n,8,1); break; default: break; /*参数1表示每当串口接收缓冲区中有多于或等于 1个字符时将引发一个接收数据的OnComm事件*/ UpdateData(false); (5)为IDC _MSCOMM添加消息映射函数void CMyDlg:OnOnCommMscomm()以便当接收缓冲区有数据时做相应处理。添加代码如下:void CMyDlg:OnOnCommMscomm() / TODO: Add your control notification handler code hereVARIANT varinant_Input;COleSafeAr

14、ray safearray_Input;BYTE RcvData2048; /设置BYTE数组 An 8-bit integerthat is not signed.CString strTmp=_T();if(m_MSComm.GetCommEvent()=2)/事件值为2表示接收缓冲区内有字符 varinant_Input=m_MSComm.GetInput(); /读缓冲区 safearray_Input=varinant_Input; /*-VARIANT型变量转换为ColeSafeArray型变量-*/ int Length=safearray_Input.GetOneDimSize

15、();/得到有效数据长度 for(long i=0;iLength;i+) safearray_Input.GetElement(&i,RcvData+i);/转换为BYTE型数组 BYTE bt=*(char*)(RcvData+i);/字符型 if(b=1)strTmp.Format(%c,bt);/将字符送入临时变量strtemp存放 else strTmp.Format(%d,bt); m_strReceive+=strTmp;/加入接收编辑框对应字符串 UpdateData(FALSE);/更新编辑框内容,显示接收到的数据 (6)为数据接收形式添加函数void CMyDlg:OnRa

16、dio添加代码如下:void CMyDlg:OnRadio1() / TODO: Add your control notification handler code hereb=true;void CMyDlg:OnRadio2() / TODO: Add your control notification handler code hereb=false; 5.生成可执行的EXE文件编译、链接、运行会相应工程目录下的debug目录下生成可执行的EXE文件。连接好串口线后运行该文件可进行串口通信。运行如下:五、软件流程图符号设定 流程开始符号: 流程结束符号: 判定符号: 路由符号: 文档输

17、出: 开始MCU.串口.液晶屏初始化下载hex文件,选择端口,波特率N 有键按下并成功连接YLCD显示提示语 VC+初始化 发送信息单片机接收信息并返还到VC+终端 结束在概念设计中,我采用单向策略.用自顶向下设计一个全局概念结构的框架,以它为骨架集成由自底向上策略中设计的各局部概念结构.六、测试结果截图笔记本电脑运行如下:(分整数和字符两种显示格式)A.整数显示B.字符显示单片机运行如下:七、实验总结 通过本次串口通信实验,让我对串口通信原理有了更近一步的理解。同时通过应用VC+ 6.0带的MFC进行串口通信API应用和用户界面制作,使我对VC+的使用更加熟练,同时也掌握了ActiveX控件的使用方法及原理。 在调试单片机时,关于在于1602显示屏显示VC发送信息的问题纠结了很久,后来知道文字无法的显示的原因是12864显示屏可以支持文字,而我用的则是1602的,所以无法显示文字,之前走了很多弯路。而在VC界面上,波特率为应选4800, 总之,在本次实验中我收获很多,不仅在通信方面的知识有所提升、VC+软件的使用更加熟练,而且也

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论