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

上传人:b****6 文档编号:9135711 上传时间:2023-02-03 格式:DOCX 页数:19 大小:185.02KB
下载 相关 举报
高级语言在测控中的应用.docx_第1页
第1页 / 共19页
高级语言在测控中的应用.docx_第2页
第2页 / 共19页
高级语言在测控中的应用.docx_第3页
第3页 / 共19页
高级语言在测控中的应用.docx_第4页
第4页 / 共19页
高级语言在测控中的应用.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

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

《高级语言在测控中的应用.docx》由会员分享,可在线阅读,更多相关《高级语言在测控中的应用.docx(19页珍藏版)》请在冰豆网上搜索。

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

高级语言在测控中的应用

1引言

1.1问题的提出

在Windows环境下,串口是系统资源的一部分。

应用程序要使用串口进行通信,必须在使用前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。

在Windows的系统函数中,均包含了支持通信中断的功能。

对串口通信而言,Windows为相应的串口设备开放了用户定义的输出缓冲区和输入缓冲区,应用程序只能对输入/输出缓冲区进行操作,数据进出歘口的操作均由系统后台完成。

以接收受为例,系统每接收到的字符送入输入缓冲区,此时应用程序就可以通过访问输入缓冲区得到接收到的字符信息。

Windows为用户提供了两种方式实现串口通信:

使用串口通信控件

使用Windows的API应用程序接口

使用串口通信控件进行串口程序开发极为方便,如果不需要对串口进行高级控制一般多选择使用MSComm控件进行开发。

针对串口通信,微软公司专门提供了MSComm控件,使用该控件进行串口通信设计是十分方便的,程序员不必花时间去了解较为复杂的API函数。

通过简单修改控件的属性和使用控件提供的方法,就可以实现对串口的配置、完成串口接收和发送数据。

MicronsoftCommunicationsControl(MSComm)是Micronsoft公司提供的简化Windows下串口通信编程的ActiveX控件,它为应用程序提供了通过串口收发数据的简便方法。

在串口编程中,使用MSComm控件非常方便,仅需通过简单修改控件属性和使用控件提供的方法,就可以实现对串口的配置,完成串口接收和发送数据等任务。

在mfc中进行串口通讯最简单的方法莫过于在对话框中使用MSCOMM控件了,MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem).还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工、事件驱动的、高效实用的通信程序。

1.2国内外研究的现状

串行通信在通讯领域被广泛应用,标准的RS232接口已成为计算机、外设、交换机和许多通讯设备的标准接口.虽然近年来随着USB口的日趋流行,RS232接口串口

1.3任务与分析

任务:

设计一个串口通讯程序,实现对数据的发送和接受。

要求:

(1)、有良好的用户界面

(2)、串口可选,其他设置默认值不变

(3)、在同一计算机上进行调试

(4)、可进行单个数据或成批数据传输   

个单选框对应六个串口。

2程序的主要功能

2.1串口选择、打开、关闭功能

通过单选框实现选择通信串口(COM1/COM2/COM3……),其他串口设置默认设置为:

波特

2.2发送数据功能

通过【发送】按钮对应函数OnButtonManualsend()来实现。

发送数据时,程序仅需要读出发送编辑框的内容,将其转化为发送程序需要的数据格式后,再使用C语言中的强制类型转换功能,将其转换为ColeVariant数据类型,由MSComm类的SetOutput()函数送入发送缓冲区即可。

2.3接收功能

当MSComm的接收缓冲区有字符时,程序会发送事件消息,OnOnCommMscomm1()函数响应该消息并进行处理,由于MSComm类GetInput()函数返回的数据变量类型为Variant型,而编辑框对应的显示字符串是Cstring型,因此接收数据时,需要先进行类型转换。

在VC中,转换过程如下:

将Variant类型转换为ColeSafeArray类型;

将ColeSafeArray类型转换为BYTE类型数组;

将BYTE类型数组转换为Cstring变量。

2.4发送、接收计数并显示功能

通过【发送:

】【接收:

】按钮(属性中样式选为:

浮动)实现显示发送接收计数显示。

2.5清除显示功能

分别通过【清空显示】【清空显示】【清空计数】按钮将发送区、接收区、计数显示清空。

2.6退出程序功能

通过【退出】按钮实现退出程序的功能。

3程序运行平台

VC++6.0、串口调试助手V2.1、VSPM虚拟串口

具体操作如下:

3.1创建基于对话框的MFC应用程序

打开vc++6.0文件---新建---工程(选择MFCAppWizard[exe])工程名:

tudanmscomm;选择文件保存位置---确定----选基本对话框---下一步---下一步(默认设置)-----下一步(默认设置)---选择CmyDlg---完成---确定。

3.2在当前的Workspace中插入MSComm控件

在设置项目选项时必须选上ActiveXControls,其他的按照缺省设置。

然后进行

3.3其他控件添加

根据自己的设计,将相应的控件添加到对话框中,并修改属性以及相应的添加变量。

设计好的对话框如下图所示:

3.4程序编辑

根据设计要求内容编辑程序,并通过反复的调试、编译、连接、执行,完成设计要求,并运行成功,能够实现各个功能要求。

4总体设计

 

图4.1系统总体框架图

 

5程序类的说明

∙CMSCommDlg类的声明

voclassCMSommDlg:

publicCDialog

{

//Construction

public:

CMSCommDlg(CWnd*pParent=NULL);//standardconstructor

//DialogData

//{{AFX_DATA(CMSCommDlg)

enum{IDD=IDD_MSCOMM_DIALOG};

//各个控件对应控件ID的变量类型以及对应的变量名

CButtonm_recvcount;

CButtonm_sendcount;

CButtonm_comclose;

CButtonm_comopen;

CMSCommm_mscomm;

CStringm_str_send;

CStringm_str_recv;

//}}AFX_DATA

//ClassWizardgeneratedvirtualfunctionoverrides

//{{AFX_VIRTUAL(CMSCommDlg)

protected:

virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport

//}}AFX_VIRTUAL

//Implementation

protected:

HICONm_hIcon;

//Generatedmessagemapfunctions

//{{AFX_MSG(CTudanmscommDlg)

virtualBOOLOnInitDialog();

afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);

afx_msgvoidOnPaint();

afx_msgHCURSOROnQueryDragIcon();

afx_msgvoidOnCleandata1();//清除接收区显示

afx_msgvoidOnCleancounter();//清除发送、接收计数

afx_msgvoidOnQuit();//退出程序

afx_msgvoidOnClosecom();//关闭串口

afx_msgvoidOnOnCommMscomm1();//接收缓冲区响应函数

afx_msgvoidOnSenddata();//数据发送

afx_msgvoidOnCleandata2();//清除发送区显示

afx_msgvoidOnOpencom();//打开串口

afx_msgvoidOnRadio1();//串口选择COM1

afx_msgvoidOnRadio2();//串口选择COM2

afx_msgvoidOnRadio3();//串口选择COM3

afx_msgvoidOnRadio4();//串口选择COM4

DECLARE_EVENTSINK_MAP()

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

6模块分析

6.1初始化模块

m_mscomm.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表示每当串口接收缓冲区中有多于或等于一个字符时将引发一个接收数据oncomm事件

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

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

m_comopen.EnableWindow(false);//打开串口按钮无效

m_comclose.EnableWindow(true);//关闭串口按钮有效

6.2串口选择模块

单选按钮实现串口选择:

voidCMSCommDlg:

:

OnRadio1()

{

radionumber=1;

if(m_mscomm.GetPortOpen())

{

m_mscomm.SetPortOpen(false);//关闭串口

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);//关闭串口按钮失效

}

voidCMSCommDlg:

:

OnRadio2()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

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_comclose.EnableWindow(true);//关闭串口按钮失效

}

voidCMSCommDlg:

:

OnRadio3()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

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);//打开串口按钮有效

m_comclose.EnableWindow(true);//关闭串口按钮失效

}

voidCMSCommDlg:

:

OnRadio4()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

radionumber=4;

if(m_mscomm.GetPortOpen())

{

m_mscomm.SetPortOpen(false);//关闭串口

m_comopen.EnableWindow(true);//打开串口按钮有效

m_comclose.EnableWindow(false);//关闭串口按钮失效

}

m_mscomm.SetCommPort(radionumber);//选择相应的COM4

m_mscomm.SetPortOpen(true);//关闭串口

m_comopen.EnableWindow(false);//打开串口按钮有效

m_comclose.EnableWindow(true);//关闭串口按钮失效

}……

6.3发送数据、发送计数显示模块

通过触发【发送按钮】实现发送数据:

voidCTudanmscommDlg:

:

OnButtonManualsend()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

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

m_ctrlComm.SetOutput(COleVariant(m_strEditTXData));//发送数据

TX_count+=m_strEditTXData.GetLength();//发送计数

CStringstrTemp;

strTemp.Format("发送:

%d",TX_count);

m_ctrlTXCount.SetWindowText(strTemp);//显示计数

}

6.4数据接收、接收计数显示模块

voidCTudanmscommDlg:

:

OnOnCommMscomm1()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

VARIANTvariant_inp;

COleSafeArraysafearray_inp;

LONGlen,k;

BYTErxdata[2048];//设置BYTE数组

CStringstrtemp;

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

{

variant_inp=m_ctrlComm.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_strEditRXData+=strtemp;//加入接受编辑框对应字符串

}

rxdatacount+=len;

//m_ctrlRXCount.SetWindowText("接受:

"+rxdatacount);

CStringtemp;

temp.Format("%ld",rxdatacount);

temp="接受:

"+temp;

m_ctrlRXCount.SetWindowText(temp);//显示接受计数

}

UpdateData(false);//修改为空

}

6.5清空模块

//接收区显示清空

voidCMSCommDlg:

:

OnCleandata1()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

m_str_recv.Empty();

UpdateData(false);//修改为空

}

//退出程序

voidCMSCommDlg:

:

OnQuit()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

CDialog:

:

OnOK();

}

//发送区显示清空

voidCMSCommDlg:

:

OnCleandata2()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

m_str_send.Empty();

UpdateData(false);//修改为空

}

//计数显示清空

voidCMSCommDlg:

:

OnCleancounter()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

recvcount=0;

sendcount=0;

m_sendcount.SetWindowText("发送:

0");

m_recvcount.SetWindowText("接收:

0");

}

6.6打开串口、关闭串口、退出程序模块

//打开串口

voidCMSCommDlg:

:

OnOpencom()

{

if(!

m_mscomm.GetPortOpen())

{

m_mscomm.SetPortOpen(true);

m_comopen.EnableWindow(false);//打开串口按钮失效

m_comclose.EnableWindow(true);//关闭串口按钮有效

}

}//关闭串口

voidCMSCommDlg:

:

OnClosecom()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

if(m_mscomm.GetPortOpen())

{

m_mscomm.SetPortOpen(false);

m_comopen.EnableWindow(true);//打开串口按钮有效

m_comclose.EnableWindow(false);//打开串口按钮失效

}

}

//退出程序

voidCMSCommDlg:

:

OnQuit()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

CDialog:

:

OnOK();

}

7系统测试

首先进入VC++6.0,打开工程MSComm.dsw,然后进入源程序,接着选择Build下的ExecuteMSComm.exe即可,也可以不打开工程,直接双击MSComm文件夹下的debug或release子文件夹下的MSComm.exe文件即可运行程序。

调试如下:

(1)、打开VSPM虚拟串口并新增虚拟串口:

(图7-1)

图7-1

(2)、打开串口调试助手V2.1、并选择虚拟串口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函数。

这种方法具有很强的实用性,可以广泛地用于工业数据采集等领域。

课程设计头几天因为考试,耽误了时间。

之后明显感觉到时间的不够,之初需要熟悉题目,明确mscomm控件下主要函数所实现的功能属性。

熟悉vc++环境下对话框编辑以及各个控件的添加,变量的设置。

本次设计用的主要是类的使用类的继承。

在编辑过程中出现很多错误,在不断的调试、编译、链接过程中也闹出了喝多笑话。

在本次设计中是在VC++下用MSComm控件实现简单的串口通讯。

本次设计不足之处在于串口的设置中:

波特率、检验位、数据位、停止位都可选择,而是系统初始化中实现。

还有就是在串口选择中通过单选按钮实现代码过于繁多。

在发送数据时不能发送汉字。

通过本次课程设计,初步的了解VC++和mscomm控件的编写思想,在程序的编写过程中,了解了以前没有学到的一些东西,加深了对类,全局变量,局部变量的理解。

对于在vc++环境下开发程序的过程步骤有了初步了解。

就单本次课程设计而言,其设计的C++内容并不是很多,其编程的某些思想与我与VB有类似之处。

就本次设计所设计到的内容只能说是C++的冰山一角。

如果以后要想运用的熟练,还需要更多的学习和练习。

参考文献

[1]王华,岳丽全,岳志高.MSComm控件在VC++6.0串口通信中的应用.

长春工程学院学报:

自然科学版,2009,10

(1)

[2]郑丽,董渊,张瑞丰编著.C++语言程序设计(第三版)北京:

清华大学出版社,2004

[3]郑丽,董渊,张瑞丰编著.VisualC++6.0MFC类库参考手册.北京:

人民邮电出版社,2002

 

目录

1引言1

1.1问题的提出1

1.2国内外研究的现状2

1.3任务与分析2

2程序的主要功能2

2.1串口选择、打开、关闭功能2

2.2发送数据功能2

2.3接收功能2

2.4发送、接收计数并显示功能3

2.5清除显示功能3

2.6退出程序功能3

3程序运行平台3

4总体设计4

6模块分析6

6.1初始化模块6

6.2串口选择模块7

6.3发送数据、发送计数显示模块10

6.4数据接收、接收计数显示模块10

6.5清

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

当前位置:首页 > 高等教育 > 医学

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

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