高级语言在测控中的应用_第1页
高级语言在测控中的应用_第2页
高级语言在测控中的应用_第3页
高级语言在测控中的应用_第4页
高级语言在测控中的应用_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

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

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

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

4、的通信程序。 1.2 国内外研究的现状国内外研究的现状 串行通信在通讯领域被广泛应用,标准的 RS232 接口已成为计算机、外设、交换 机和许多通讯设备的标准接口虽然近年来随着 USB 口的日趋流行,RS232 接口串口 1.3 任务与分析任务与分析 任务:设计一个串口通讯程序,实现对数据的发送和接受。 要求: (1)、有良好的用户界面 (2)、串口可选,其他设置默认值不变 (3)、在同一计算机上进行调试 (4)、可进行单个数据或成批数据传输 个单选框对应六个串口。 2 程序的主要功能 2.12.1 串口选择串口选择、打开、关闭功能、打开、关闭功能 通过单选框实现选择通信串口(COM1/COM

5、2/COM3) ,其他串口设置默认设置为: 波特 2.22.2 发送数据功能发送数据功能 通过【发送】按钮对应函数OnButtonManualsend()来实现。发送数据时,程序仅需要 读出发送编辑框的内容,将其转化为发送程序需要的数据格式后,再使用 C 语言中的 强制类型转换功能,将其转换为 ColeVariant 数据类型,由 MSComm 类的 SetOutput() 函数送入发送缓冲区即可。 2.32.3 接收功能接收功能 当 MSComm 的接收缓冲区有字符时,程序会发送事件消息,OnOnCommMscomm1()函 数响应该消息并进行处理,由于 MSComm 类 GetInput(

6、)函数返回的数据变量类型为 Variant 型,而编辑框对应的显示字符串是 Cstring 型,因此接收数据时,需要先进 行类型转换。在 VC 中,转换过程如下: 将 Variant 类型转换为 ColeSafeArray 类型; 将 ColeSafeArray 类型转换为 BYTE 类型数组; 将 BYTE 类型数组转换为 Cstring 变量。 2.42.4 发送、接收计数并显示功能发送、接收计数并显示功能 通过【发送:】 【接收:】按钮(属性中样式选为:浮动)实现显示发送接收计数 显示。 2.52.5 清除显示功能清除显示功能 分别通过【清空显示】 【清空显示】 【清空计数】按钮将发送区

7、、接收区、计数显示 清空。 2.62.6 退出程序功能退出程序功能 通过【退出】按钮实现退出程序的功能。 3 程序运行平台 VC+6.0、串口调试助手 V2.1、VSPM 虚拟串口 具体操作如下: 3.13.1 创建基于对话框的创建基于对话框的 MFC 应用程序应用程序 打开 vc+6.0 文件-新建-工程(选择 MFC AppWizard exe)工程名: tudanmscomm ;选择文件保存位置-确定-选基本对话框-下一步-下一步(默 认设置)-下一步(默认设置)-选择 CmyDlg-完成-确定。 3.23.2 在当前的在当前的 Workspace 中插入中插入 MSComm 控件控件

8、在设置项目选项时必须选上 ActiveX Controls,其他的按照缺省设置。然后进 行 3.33.3 其他控件添加其他控件添加 根据自己的设计,将相应的控件添加到对话框中,并修改属性以及相应的添加变 量。设计好的对话框如下图所示: 3.43.4 程序编辑程序编辑 根据设计要求内容编辑程序,并通过反复的调试、编译、连接、执行,完成设计 要求,并运行成功,能够实现各个功能要求。 4 总体设计 图 4.1 系统总体框架图 5 5 程序类的说明程序类的说明 选 择 串 口 打 开 串 口 删 除 信 息 关 闭 串 口 清 空 信 息 发 送 数 据 修 改 信 息 主 函 数 接 收 数 据 显

9、 示 信 息 清 除 发 送 去 显 示 查 找 信 息 清 除 接 收 查 找 信 息 清 除 计 数 查 找 信 息 退 出 程 序 查 找 信 息 CMSCommDlg 类的声明类的声明 voclass CMSommDlg : public CDialog / Construction public: CMSCommDlg(CWnd* pParent = NULL);/ standard constructor / Dialog Data /AFX_DATA(CMSCommDlg) enum IDD = IDD_MSCOMM_DIALOG ; /各个控件对应控件 ID 的变量类型以及对应

10、的变量名 CButtonm_recvcount; CButtonm_sendcount; CButtonm_comclose; CButtonm_comopen; CMSCommm_mscomm; CStringm_str_send; CStringm_str_recv; /AFX_DATA / ClassWizard generated virtual function overrides /AFX_VIRTUAL(CMSCommDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support

11、 /AFX_VIRTUAL / Implementation protected: HICON m_hIcon; / Generated message map functions /AFX_MSG(CTudanmscommDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnCleandata1 ();/清除接收区显示 afx_m

12、sg void OnCleancounter ();/清除发送、接收计数 afx_msg void OnQuit (); /退出程序 afx_msg void OnClosecom (); /关闭串口 afx_msg void OnOnCommMscomm1();/接收缓冲区响应函数 afx_msg void OnSenddata ();/数据发送 afx_msg void OnCleandata2 ();/清除发送区显示 afx_msg void OnOpencom ();/打开串口 afx_msg void OnRadio1();/串口选择 COM1 afx_msg void OnRadi

13、o2();/串口选择 COM2 afx_msg void OnRadio3();/串口选择 COM3 afx_msg void OnRadio4();/串口选择 COM4 DECLARE_EVENTSINK_MAP() /AFX_MSG DECLARE_MESSAGE_MAP() ; 6 模块分析 6.16.1 初始化模块初始化模块 m_mscomm.SetCommPort(1);/选择 COM1 /波特率 9600,无校验,8 个数据位,1 个停止位 m_mscomm.SetInputMode(1);/输入方式为二进制方式 m_mscomm.SetInBufferSize(1024);/设置

14、输入缓冲区大小 m_mscomm.SetOutBufferSize(512);/设置输 chu 缓冲区大小 /设置波特率 9600,无校验,8 个数据位,1 个停止位 m_mscomm.SetSettings(9600,N,8,1); if(!m_mscomm.GetPortOpen() m_mscomm.SetRThreshold(1);/参数 1 表示每当串口接收缓冲区中有多于或等 于一个字符时将引发一个接收数据 oncomm 事件 m_mscomm.SetInputLen(0);/设置当前接受区数据长度为 0 m_mscomm.GetInput();/先预读缓冲区以清除残余数据 m_co

15、mopen.EnableWindow(false);/打开串口按钮无效 m_comclose.EnableWindow(true);/关闭串口按钮有效 6.26.2 串口选择串口选择模块模块 单选按钮实现串口选择: void CMSCommDlg:OnRadio1() radionumber=1; if(m_mscomm.GetPortOpen() m_mscomm.SetPortOpen(false);/关闭串口 m_comopen.EnableWindow(true);/打开串口按钮有效 m_comclose.EnableWindow(false);/关闭串口按钮失效 m_mscomm.S

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

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

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

19、有效 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.EnableWindow(true);/打开串口按钮有效 m_comclose.EnableWindow(false);/关闭串口按钮失效 m_mscomm.SetCommPor

20、t(radionumber);/选择相应的 COM4 m_mscomm.SetPortOpen(true);/关闭串口 m_comopen.EnableWindow(false);/打开串口按钮有效 m_comclose.EnableWindow(true);/关闭串口按钮失效 6.36.3 发送数据、发送发送数据、发送计数显示模块计数显示模块 通过触发【发送按钮】实现发送数据: void CTudanmscommDlg:OnButtonManualsend() / TODO: Add your control notification handler code here UpdateData

21、(TRUE); /读取编辑框内容 m_ctrlComm.SetOutput(COleVariant(m_strEditTXData); /发送数据 TX_count+=m_strEditTXData.GetLength(); /发送计数 CString strTemp; strTemp.Format(发送:%d,TX_count); m_ctrlTXCount.SetWindowText(strTemp); /显示计数 6.46.4 数据接收数据接收、接收计数显示模块、接收计数显示模块 void CTudanmscommDlg:OnOnCommMscomm1() / TODO: Add you

22、r 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_inp=variant_inp; /VARIANT 型变量转换为 ColeSafeArray 型

23、变量 len=safearray_inp.GetOneDimSize(); /得到有效数据长度 for(k=0;klen;k+) safearray_inp.GetElement( /转换为 BYTE 型数组 for(k=0;klen;k+) /将数组转换为 Cstring 型变量 BYTE bt=*(char*)(rxdata+k); /字符型 strtemp.Format(%c,bt); /将字符送入临时变量 strtemp 存放 m_strEditRXData+=strtemp; /加入接受编辑框对应字符串 rxdatacount+=len; /m_ctrlRXCount.SetWind

24、owText(接受:+rxdatacount); CString temp; temp.Format(%ld,rxdatacount); temp=接受:+temp; m_ctrlRXCount.SetWindowText(temp); /显示接受计数 UpdateData(false);/修改为空 6.56.5 清空模块清空模块 /接收区显示清空 void CMSCommDlg:OnCleandata1() / TODO: Add your control notification handler code here m_str_recv.Empty(); UpdateData(false)

25、;/修改为空 /退出程序 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 CMSCommDlg:OnCleancounter() / TODO: A

26、dd your control notification handler code here recvcount=0; sendcount=0; m_sendcount.SetWindowText(发送:0); m_recvcount.SetWindowText(接收:0); 6.66.6 打开串口、关闭串口、退出程序模块打开串口、关闭串口、退出程序模块 /打开串口 void CMSCommDlg:OnOpencom() if(!m_mscomm.GetPortOpen() m_mscomm.SetPortOpen(true); m_comopen.EnableWindow(false);/打

27、开串口按钮失效 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 CMSCommDlg:OnQu

28、it() / TODO: Add your control notification handler code here CDialog: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、并选择虚拟串口

29、 COM3:(图 7-2) 图 7-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 函数。这种方法具有很强的实用性,可以广泛地用于工业数据采集等领域。 课程设计头几天因为考试,耽误了时间。之后明

温馨提示

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

评论

0/150

提交评论