ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:185.02KB ,
资源ID:9135711      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9135711.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(高级语言在测控中的应用.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

高级语言在测控中的应用.docx

1、高级语言在测控中的应用1 引 言 1.1 问题的提出 在Windows环境下,串口是系统资源的一部分。应用程序要使用串口进行通信,必须在使用前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。在Windows的系统函数中,均包含了支持通信中断的功能。对串口通信而言,Windows为相应的串口设备开放了用户定义的输出缓冲区和输入缓冲区,应用程序只能对输入/输出缓冲区进行操作,数据进出歘口的操作均由系统后台完成。以接收受为例,系统每接收到的字符送入输入缓冲区,此时应用程序就可以通过访问输入缓冲区得到接收到的字符信息。Windows为用户提供了两种方式实现串口通信: 使用串

2、口通信控件 使用Windows的API应用程序接口使用串口通信控件进行串口程序开发极为方便,如果不需要对串口进行高级控制一般多选择使用MSComm控件进行开发。针对串口通信,微软公司专门提供了MSComm控件,使用该控件进行串口通信设计是十分方便的,程序员不必花时间去了解较为复杂的API函数。通过简单修改控件的属性和使用控件提供的方法,就可以实现对串口的配置、完成串口接收和发送数据。Micronsoft Communications Control(MSComm)是Micronsoft公司提供的简化Windows下串口通信编程的ActiveX控件,它为应用程序提供了通过串口收发数据的简便方法。

3、在串口编程中,使用MSComm控件非常方便,仅需通过简单修改控件属性和使用控件提供的方法,就可以实现对串口的配置,完成串口接收和发送数据等任务。在mfc中进行串口通讯最简单的方法莫过于在对话框中使用MSCOMM控件了,MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem)还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工 、事件驱动的、高效实用的通信程序。1.2国内外研究的现状 串行通信在通讯领域被广泛应用,标准的 RS232 接口已成为计算机、外设、交换机和许多通讯设备的标准接口虽然近

4、年来随着 USB 口的日趋流行,RS232 接口串口1.3任务与分析 任务:设计一个串口通讯程序,实现对数据的发送和接受。要求: (1)、有良好的用户界面(2)、串口可选,其他设置默认值不变 (3)、在同一计算机上进行调试 (4)、可进行单个数据或成批数据传输 个单选框对应六个串口。2 程序的主要功能2.1串口选择、打开、关闭功能通过单选框实现选择通信串口(COM1/COM2/COM3),其他串口设置默认设置为:波特2.2发送数据功能 通过【发送】按钮对应函数OnButtonManualsend()来实现。发送数据时,程序仅需要读出发送编辑框的内容,将其转化为发送程序需要的数据格式后,再使用C

5、语言中的强制类型转换功能,将其转换为ColeVariant数据类型,由MSComm类的SetOutput()函数送入发送缓冲区即可。2.3 接收功能当MSComm的接收缓冲区有字符时,程序会发送事件消息,OnOnCommMscomm1()函数响应该消息并进行处理,由于MSComm类GetInput()函数返回的数据变量类型为Variant型,而编辑框对应的显示字符串是Cstring型,因此接收数据时,需要先进行类型转换。在VC中,转换过程如下:将Variant类型转换为ColeSafeArray类型;将ColeSafeArray类型转换为BYTE类型数组;将BYTE类型数组转换为Cstring

6、变量。2.4发送、接收计数并显示功能通过【发送:】【接收:】按钮(属性中样式选为:浮动)实现显示发送接收计数显示。2.5清除显示功能 分别通过【清空显示】【清空显示】【清空计数】按钮将发送区、接收区、计数显示清空。2.6退出程序功能通过【退出】按钮实现退出程序的功能。3 程序运行平台VC+6.0、串口调试助手V2.1、VSPM虚拟串口具体操作如下:3.1创建基于对话框的MFC应用程序打开vc+6.0文件-新建-工程(选择MFC AppWizard exe)工程名:tudanmscomm ;选择文件保存位置-确定-选基本对话框-下一步-下一步(默认设置)-下一步(默认设置)-选择CmyDlg-完

7、成-确定。3.2在当前的Workspace中插入MSComm控件在设置项目选项时必须选上ActiveX Controls,其他的按照缺省设置。然后进行3.3其他控件添加根据自己的设计,将相应的控件添加到对话框中,并修改属性以及相应的添加变量。设计好的对话框如下图所示:3.4程序编辑根据设计要求内容编辑程序,并通过反复的调试、编译、连接、执行,完成设计要求,并运行成功,能够实现各个功能要求。4 总体设计 图4.1 系统总体框架图5 程序类的说明 CMSCommDlg 类的声明voclass CMSommDlg : public CDialog/ Constructionpublic: CMSCo

8、mmDlg(CWnd* pParent = NULL); / standard constructor/ Dialog Data /AFX_DATA(CMSCommDlg) enum IDD = IDD_MSCOMM_DIALOG ; /各个控件对应控件ID的变量类型以及对应的变量名CButton m_recvcount; CButton m_sendcount; CButton m_comclose; CButton m_comopen; CMSComm m_mscomm; CString m_str_send; CString m_str_recv; /AFX_DATA / ClassWi

9、zard generated virtual function overrides /AFX_VIRTUAL(CMSCommDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support /AFX_VIRTUAL/ Implementationprotected: HICON m_hIcon; / Generated message map functions /AFX_MSG(CTudanmscommDlg) virtual BOOL OnInitDialog(); afx_msg void

10、 OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnCleandata1 ();/清除接收区显示 afx_msg void OnCleancounter ();/清除发送、接收计数 afx_msg void OnQuit (); /退出程序 afx_msg void OnClosecom (); /关闭串口 afx_msg void OnOnCommMscomm1();/接收缓冲区响应函数 afx_msg void On

11、Senddata ();/数据发送 afx_msg void OnCleandata2 ();/清除发送区显示 afx_msg void OnOpencom ();/打开串口 afx_msg void OnRadio1();/串口选择COM1 afx_msg void OnRadio2();/串口选择COM2 afx_msg void OnRadio3();/串口选择COM3 afx_msg void OnRadio4();/串口选择COM4 DECLARE_EVENTSINK_MAP() /AFX_MSG DECLARE_MESSAGE_MAP();6 模块分析6.1 初始化模块 m_msc

12、omm.SetCommPort(1);/选择COM1/波特率9600,无校验,8个数据位,1个停止位m_mscomm.SetInputMode(1);/输入方式为二进制方式m_mscomm.SetInBufferSize(1024);/设置输入缓冲区大小m_mscomm.SetOutBufferSize(512);/设置输chu缓冲区大小/设置波特率9600,无校验,8个数据位,1个停止位m_mscomm.SetSettings(9600,N,8,1);if(!m_mscomm.GetPortOpen()m_mscomm.SetRThreshold(1);/参数1表示每当串口接收缓冲区中有多于

13、或等于一个字符时将引发一个接收数据oncomm事件 m_mscomm.SetInputLen(0);/设置当前接受区数据长度为0 m_mscomm.GetInput();/先预读缓冲区以清除残余数据m_comopen.EnableWindow(false);/打开串口按钮无效 m_comclose.EnableWindow(true);/关闭串口按钮有效6.2 串口选择模块 单选按钮实现串口选择:void CMSCommDlg:OnRadio1() radionumber=1; if(m_mscomm.GetPortOpen() m_mscomm.SetPortOpen(false);/关闭串

14、口 m_comopen.EnableWindow(true);/打开串口按钮有效 m_comclose.EnableWindow(false);/关闭串口按钮失效 m_mscomm.SetCommPort(radionumber);/选择相应的COM1 m_mscomm.SetPortOpen(true);/关闭串口 m_comopen.EnableWindow(false);/打开串口按钮有效 m_comclose.EnableWindow(true);/关闭串口按钮失效void CMSCommDlg:OnRadio2() / TODO: Add your control notificat

15、ion handler code here radionumber=2; if(m_mscomm.GetPortOpen() m_mscomm.SetPortOpen(false);/关闭串口 m_comopen.EnableWindow(true);/打开串口按钮有效 m_comclose.EnableWindow(false);/关闭串口按钮失效 m_mscomm.SetCommPort(radionumber);/选择相应的COM2 m_mscomm.SetPortOpen(true);/关闭串口 m_comopen.EnableWindow(false);/打开串口按钮有效 m_com

16、close.EnableWindow(true);/关闭串口按钮失效void CMSCommDlg:OnRadio3() / TODO: Add your control notification handler code here radionumber=3; if(m_mscomm.GetPortOpen() m_mscomm.SetPortOpen(false);/关闭串口 m_comopen.EnableWindow(true);/打开串口按钮有效 m_comclose.EnableWindow(false);/关闭串口按钮失效 m_mscomm.SetCommPort(radionu

17、mber);/选择相应的COM3 m_mscomm.SetPortOpen(true);/关闭串口 m_comopen.EnableWindow(false);/打开串口按钮有效 m_comclose.EnableWindow(true);/关闭串口按钮失效 void CMSCommDlg:OnRadio4() / TODO: Add your control notification handler code here radionumber=4; if(m_mscomm.GetPortOpen() m_mscomm.SetPortOpen(false);/关闭串口 m_comopen.En

18、ableWindow(true);/打开串口按钮有效 m_comclose.EnableWindow(false);/关闭串口按钮失效 m_mscomm.SetCommPort(radionumber);/选择相应的COM4 m_mscomm.SetPortOpen(true);/关闭串口 m_comopen.EnableWindow(false);/打开串口按钮有效 m_comclose.EnableWindow(true);/关闭串口按钮失效 6.3 发送数据、发送计数显示模块 通过触发【发送按钮】实现发送数据:void CTudanmscommDlg:OnButtonManualsend

19、() / TODO: Add your control notification handler code here UpdateData(TRUE); /读取编辑框内容 m_ctrlComm.SetOutput(COleVariant(m_strEditTXData); /发送数据 TX_count+=m_strEditTXData.GetLength(); /发送计数 CString strTemp; strTemp.Format(发送:%d,TX_count); m_ctrlTXCount.SetWindowText(strTemp); /显示计数 6.4 数据接收、接收计数显示模块vo

20、id CTudanmscommDlg:OnOnCommMscomm1() / TODO: Add your control notification handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata2048; /设置BYTE数组 CString strtemp; if(m_ctrlComm.GetCommEvent()=2) /事件值为2表示接受缓冲区内有字符 variant_inp=m_ctrlComm.GetInput(); /读缓冲区 safearray_

21、inp=variant_inp; /VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); /得到有效数据长度 for(k=0;klen;k+) safearray_inp.GetElement(&k,rxdata+k); /转换为BYTE型数组 for(k=0;klen;k+) /将数组转换为Cstring型变量 BYTE bt=*(char*)(rxdata+k); /字符型 strtemp.Format(%c,bt); /将字符送入临时变量strtemp存放 m_strEditRXData+=strtemp; /加

22、入接受编辑框对应字符串 rxdatacount+=len; /m_ctrlRXCount.SetWindowText(接受:+rxdatacount); CString temp; temp.Format(%ld,rxdatacount); temp=接受:+temp; m_ctrlRXCount.SetWindowText(temp); /显示接受计数 UpdateData(false);/修改为空 6.5清空模块/接收区显示清空void CMSCommDlg:OnCleandata1() / TODO: Add your control notification handler code

23、here m_str_recv.Empty(); UpdateData(false);/修改为空/退出程序void CMSCommDlg:OnQuit() / TODO: Add your control notification handler code here CDialog:OnOK();/发送区显示清空void CMSCommDlg:OnCleandata2() / TODO: Add your control notification handler code here m_str_send.Empty(); UpdateData(false);/修改为空/计数显示清空void C

24、MSCommDlg:OnCleancounter() / TODO: Add your control notification handler code here recvcount=0; sendcount=0; m_sendcount.SetWindowText(发送:0); m_recvcount.SetWindowText(接收:0); 6.6 打开串口、关闭串口、退出程序模块/打开串口void CMSCommDlg:OnOpencom() if(!m_mscomm.GetPortOpen() m_mscomm.SetPortOpen(true); m_comopen.EnableW

25、indow(false);/打开串口按钮失效 m_comclose.EnableWindow(true);/关闭串口按钮有效 /关闭串口void CMSCommDlg:OnClosecom() / TODO: Add your control notification handler code here if(m_mscomm.GetPortOpen() m_mscomm.SetPortOpen(false); m_comopen.EnableWindow(true);/打开串口按钮有效 m_comclose.EnableWindow(false);/打开串口按钮失效 /退出程序void CM

26、SCommDlg:OnQuit() / TODO: Add your control notification handler code hereCDialog:OnOK();7 系统测试首先进入VC+6.0,打开工程MSComm.dsw,然后进入源程序,接着选择Build下的Execute MSComm.exe即可,也可以不打开工程,直接双击MSComm文件夹下的debug或release子文件夹下的MSComm.exe文件即可运行程序。调试如下:(1)、 打开VSPM虚拟串口并新增虚拟串口:(图7-1) 图7-1(2)、打开串口调试助手V2.1、并选择虚拟串口COM3:(图7-2) 图7-

27、2(3)、打开vc+6.0,运行自己设计的程序、并选择串口COM4(图7-3) (图7-3)(4)、分别在串口调试助手V2.1和自己的程序发送区输入内容,再点【发送】按钮,观察各个文本框的内容是否正确:(图7-4) (图7-5)(5)、点击【清除显示】、【清除显示】、【清除计数】分别将文本框、发送和计数显示清除:(图7-5) (图7-5)(6)、测试成功程序能够完成串口通讯功能。点击【退出】按钮退出程序。8 结论本次课程设计是利用VC+下的MSComm控件编程方法,通过MSComm控件可以十分便捷地写出灵活性高,移植性强的串口通信程序,避免了去了解一些复杂的windowsAPI函数。这种方法具

28、有很强的实用性,可以广泛地用于工业数据采集等领域。课程设计头几天因为考试,耽误了时间。之后明显感觉到时间的不够,之初需要熟悉题目,明确mscomm控件下主要函数所实现的功能属性。熟悉vc+环境下对话框编辑以及各个控件的添加,变量的设置。本次设计用的主要是类的使用类的继承。在编辑过程中出现很多错误,在不断的调试、编译、链接过程中也闹出了喝多笑话。在本次设计中是在VC+下用MSComm控件实现简单的串口通讯。本次设计不足之处在于串口的设置中:波特率、检验位、数据位、停止位都可选择,而是系统初始化中实现。还有就是在串口选择中通过单选按钮实现代码过于繁多。在发送数据时不能发送汉字。通过本次课程设计,初

29、步的了解VC+和mscomm控件的编写思想,在程序的编写过程中,了解了以前没有学到的一些东西,加深了对类,全局变量,局部变量的理解。对于在vc+环境下开发程序的过程步骤有了初步了解。就单本次课程设计而言,其设计的C+内容并不是很多,其编程的某些思想与我与VB有类似之处。就本次设计所设计到的内容只能说是C+的冰山一角。如果以后要想运用的熟练,还需要更多的学习和练习。参考文献1 王华,岳丽全,岳志高. MSComm 控件在VC + + 6. 0串口通信中的应用. 长春工程学院学报:自然科学版,2009 ,10 (1)2 郑丽,董渊,张瑞丰 编著.C+语言程序设计(第三版)北京:清华大学出版社,20043 郑丽,董渊,张瑞丰 编著.Visual C+ 6.0 MFC类库参考手册.北京:人民邮电出版社,2002目 录1 引 言 11.1 问题的提出 11.2国内外研究的现状 21.3任务与分析 22 程序的主要功能 22.1串口选择、打开、关闭功能 22.2发送数据功能 22.3 接收功能 22.4发送、接收计数并显示功能 32.5清除显示功能 32.6退出程序功能 33 程序运行平台 34 总体设计 46 模块分析 66.1 初始化模块 66.2 串口选择模块 76.3 发送数据、发送计数显示模块 106.4 数据接收、接收计数显示模块 106.5清

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1