论文部分内容阅读
摘要为了便于观察干涉、衍射等光学实验现象,提高实验精度,验证实验原理,而设计光强探测系统。系统由光信号的接收与转换、电信号的传输与处理、数据的存储及输出三个部分组成。其中数据的存储及输出部分,基于VC设计实现,包括数据存储、探测绘图、曲线模拟。通过不断的修正和改进,以及新功能的添加,最终形成较满意的可行系统。
关键词光强探测 Visual C++ 数据存储
中图分类号:O43文献标识码:A
1 引言
设计实现光强探测系统,主要是用其观测光线在接收屏上的光强大小及分布,并将观测数据记录在计算机系统上,以光强曲线的方式快速直观地显示出来。可用于学生观察干涉、衍射等光学实验现象,并对所记录的数据进行分析,验证实验原理,提高实验精度。
2 系统结构及设计
光强探测系统分为光信号的接收与转换、电信号的传输与处理、数据的存储及输出三个部分,如图1所示。
图1
例如在单缝夫琅禾费衍射实验中,采用散射角极小的激光光束,通过一条很细的狭缝(0.1~0.3mm),就可在狭缝后大于1.5m的光屏上看到夫琅禾费衍射条纹。为了提高实验探测精度和速度,用光机电结合的方式,以图1的系统结构进行优化,组成所需的单缝夫琅禾费衍射实验系统。利用光电探测器和步进式电机记录各点的光强分布数据,以代替传统人工机械读取数据;利用计算机接口技术和软件技术,实现自动控制及数据存储输出,以代替人工计算检验数据。再配以专用实验平台,就可实现高精度的自动化实验系统。
对于光强探测系统中光信号的接受与转换、电信号的传输与处理可由设计成熟的光电探测系统独立完成,相关应用很多,在这里因篇幅所限,不再讨论。对于数据的存储及输出,是本文重点讨论的内容。采用Visual C++语言来实现光强探测系统,实现的功能包括:数据存储、探测绘图、曲线模拟。因VC属于可视化与面向对象的程序设计技术,与人类习惯的思维方法比较一致,对象能直接获得已有的特性,稳定、易于修改、扩充和维护。并且VC的执行速度,加之对Windows操作系统的支持,使得VC的在整个计算机的硬件和软件方面的访问和控制更加游刃有余。可以在很短时间内为用户建立一个稳固而安全的骨架,快速增加新的类、变量和处理函数,方便而迅速地将某个消息映射到某个处理函数上,方便地操作本地或异地的数据库。
3 基于VC的系统实现
系统设计的主界面上有3个图标,分别单击各个图标会进入不同的属性页,每一个属性页上有不同的按钮,分别负责处理不同的功能,框架图如图2所示。
图2系统设计框架
3.1 数据存储
3.1.1 仪器控制
首先打开串口。使用CreateFile()打开串口,然后关闭串口,设置缓冲区长度。改变端口设置使用如下的两个方法:BOOL GetCommState(hComm,&dcb);BOOL SetCommState(hComm,&dcb);改变普通设置:BuildCommDCB(szSettings,&DCB);最后将其设置成同步I/O读写数据。
3.1.2 数据保存
为了便于光强数据的记录、读写、保存与修改,设计直接生成“光强数据.txt”的数据保存文档,里面分行分列保存了步进式电机上的光电接收器件接收到的数据,包括采样点序号、坐标以及光强。
首先打开MFC ClassWizard,为对话框CPage3添加相关的消息,在Member Variables选项卡中为类CPage3的各个控件添加相应的成员变量。
然后进入ClassWizard菜单下,找到该按纽对应的ID(即IDC_SAVE),选择它的ID为它的单击事件(BN_CLICKED)添加功能,然后点击ADD FUNCTION其功能名为ON_IDC_SAVE,最后点击EDIT CODE编辑其代码。其代码原型如下所示:
void CPage3::OnSave()
{ CStdioFile sf;
sf.Open("光强数据.txt",CFile::modeCreate | CFile::modeWrite) }
文本文档创建好之后,就要将相应的数据写入这个文档。由于采用的是字符串输出的函数格式,所以要先将接收到的Float型的数值变量转换成CString型的变量,其语句为:
strOut1.Format("%s%d",strOut1,i);
这样就可以采用循环的方式,并在适当的位置加入换行输出符,将各个变量在文档的相应位置输出出来。
3.2 探测绘图
3.2.1 绘制曲线
第一步,添加一个图片静态控件,修改其属性,在其选项框中复选Client edge和Modal frame两项,创建好绘图区域。
第二步,为绘图按纽添加相应功能,只要点击该按纽软件就会在绘图区域里面绘制出相应的图形。通过ClassWizard选择IDC_BUTDRAW为对象,选择其单击事件添加命令,然后点击EDIT CODE编辑该命令。然后在MFC ClassWizard下,为对话框添加相关消息,如表1。
表1控件属性
第三步,就是在绘图区域里面绘制坐标轴,坐标轴的绘制实际上就是线段的绘制,使用绘制直线的函数:
CPoint CDC::MoveTo(int x,int y);
BOOL CDC::LineTo(int xEnd,int yEnd);
上述函数实现的功能分别是:调整画笔的起始坐标(即从哪个点开始画线)和指定所画线段的终点坐标(即在哪个点结束),函数里面两个变量分别对应点的横坐标与纵坐标。
然后利用TextOut函数在绘图区相应的位置输出坐标轴的名称以及原点的名称,分别为S,I(对应于坐标和光强)和O点。
绘图功能形成流程图,如图3所示:
图3绘图流程
3.2.2 清除区域
为了能够实现实验曲线的实时绘制,必须添加清除绘图区域的功能,以实现衍射曲线的重绘功能。添加OnButclear函数,在函数中输入如下代码:
void CPage1::OnButclear()
{
InvalidateRect(CRect(0,0,330,330));
}
3.3 曲线模拟
为了能够对比观察实验曲线和理想衍射曲线之间的异同,实现衍射曲线的自动模拟功能,采用GIF动画的自动播放功能,提供一个直观的画面。
首先还是要在该界面上创建一个图片控件(Picture Control)。在项目中插入文件:把PictureEx.h,PictureEx.cpp文件拷贝到项目文件夹下,在Add to Project的Files选项中选上PictureEx.h,PictureEx.cpp,Insert。从对话框控件中把Picture Control(图片控件)拖入主对话框中,修改其属性:ID:IDC_GIF,TYPE:Rectangle,其余接受缺省选项。再在ClassWiard中为IDF_GIF加入CSatic控制变量m_GifPic, 观察GifDemoDlg.h中是否加上了#include "PictureEx.h"(由ClassWizard加入)。然后将CSatic m_GifPic更改成CPictureEx m_GifPic;
加载动画文件:先将要加载的动画文件放到 res 资源文件夹下,再将其Import进项目中,由于MFC只支持256BMP文件的图片,因此要新建一个图片类型:“GIF”,将已经做好了的GIF文件放进去 ,并将其ID修改成:IDR_GIF1。
import(导入)GIF动画的详细过程:在ResourceView窗口中,单击鼠标右键,在出现的环境菜单中选择“import”命令,会出现“import resource”选择文件对话框,文件类型选择“所有文件”,open as 选项为"auto",再选择动画文件所在目录,选上要载入的动画文件“模拟曲线.gif”,再单击 import,由于gif动画类型不是VC默认的文件类型,这时会出现"custom resource type"对话框,键入“GIF”,再单击ok,然后修改其ID。
在CPage2::OnInitDialog()函数中加入如下代码:
{…………………
// TODO: Add extra initialization here
if (m_GifPic.Load(MAKEINTRESOURCE(IDR_GIF1),_T("Gif")))
m_GifPic.Draw();
}
此时就可以在这个属性页上顺利地添加GIF动画了,其效果图如图4(以单缝夫琅禾费衍射曲线为例)所示。
图4模拟曲线
参考文献
[1]史大椿著.光学测量与应用光学实验.机械工业出版社,1992.
[2]杨枝灵,王开著.Visual C++ 数字图像获取处理及实践应用.人民邮电出版社,2003.
[3]刘静华,王永生著.最新VC++绘图程序设计技巧与实例教程.科学出版社,2001.
[4]Bjarne Stroustrup著.The C++ Programming Language.裘宗燕,译.机械工业出版社,2002.
[5]Chris H.Pappas William H.Maurray 著.Visual C++ 6参考大全.希望图书创作室,2004.
[6]David J.Kruglinski著.Programming Visual C++ .潘爱民,王国印,译.清华大学出版社,2001.
关键词光强探测 Visual C++ 数据存储
中图分类号:O43文献标识码:A
1 引言
设计实现光强探测系统,主要是用其观测光线在接收屏上的光强大小及分布,并将观测数据记录在计算机系统上,以光强曲线的方式快速直观地显示出来。可用于学生观察干涉、衍射等光学实验现象,并对所记录的数据进行分析,验证实验原理,提高实验精度。
2 系统结构及设计
光强探测系统分为光信号的接收与转换、电信号的传输与处理、数据的存储及输出三个部分,如图1所示。
图1
例如在单缝夫琅禾费衍射实验中,采用散射角极小的激光光束,通过一条很细的狭缝(0.1~0.3mm),就可在狭缝后大于1.5m的光屏上看到夫琅禾费衍射条纹。为了提高实验探测精度和速度,用光机电结合的方式,以图1的系统结构进行优化,组成所需的单缝夫琅禾费衍射实验系统。利用光电探测器和步进式电机记录各点的光强分布数据,以代替传统人工机械读取数据;利用计算机接口技术和软件技术,实现自动控制及数据存储输出,以代替人工计算检验数据。再配以专用实验平台,就可实现高精度的自动化实验系统。
对于光强探测系统中光信号的接受与转换、电信号的传输与处理可由设计成熟的光电探测系统独立完成,相关应用很多,在这里因篇幅所限,不再讨论。对于数据的存储及输出,是本文重点讨论的内容。采用Visual C++语言来实现光强探测系统,实现的功能包括:数据存储、探测绘图、曲线模拟。因VC属于可视化与面向对象的程序设计技术,与人类习惯的思维方法比较一致,对象能直接获得已有的特性,稳定、易于修改、扩充和维护。并且VC的执行速度,加之对Windows操作系统的支持,使得VC的在整个计算机的硬件和软件方面的访问和控制更加游刃有余。可以在很短时间内为用户建立一个稳固而安全的骨架,快速增加新的类、变量和处理函数,方便而迅速地将某个消息映射到某个处理函数上,方便地操作本地或异地的数据库。
3 基于VC的系统实现
系统设计的主界面上有3个图标,分别单击各个图标会进入不同的属性页,每一个属性页上有不同的按钮,分别负责处理不同的功能,框架图如图2所示。
图2系统设计框架
3.1 数据存储
3.1.1 仪器控制
首先打开串口。使用CreateFile()打开串口,然后关闭串口,设置缓冲区长度。改变端口设置使用如下的两个方法:BOOL GetCommState(hComm,&dcb);BOOL SetCommState(hComm,&dcb);改变普通设置:BuildCommDCB(szSettings,&DCB);最后将其设置成同步I/O读写数据。
3.1.2 数据保存
为了便于光强数据的记录、读写、保存与修改,设计直接生成“光强数据.txt”的数据保存文档,里面分行分列保存了步进式电机上的光电接收器件接收到的数据,包括采样点序号、坐标以及光强。
首先打开MFC ClassWizard,为对话框CPage3添加相关的消息,在Member Variables选项卡中为类CPage3的各个控件添加相应的成员变量。
然后进入ClassWizard菜单下,找到该按纽对应的ID(即IDC_SAVE),选择它的ID为它的单击事件(BN_CLICKED)添加功能,然后点击ADD FUNCTION其功能名为ON_IDC_SAVE,最后点击EDIT CODE编辑其代码。其代码原型如下所示:
void CPage3::OnSave()
{ CStdioFile sf;
sf.Open("光强数据.txt",CFile::modeCreate | CFile::modeWrite) }
文本文档创建好之后,就要将相应的数据写入这个文档。由于采用的是字符串输出的函数格式,所以要先将接收到的Float型的数值变量转换成CString型的变量,其语句为:
strOut1.Format("%s%d",strOut1,i);
这样就可以采用循环的方式,并在适当的位置加入换行输出符,将各个变量在文档的相应位置输出出来。
3.2 探测绘图
3.2.1 绘制曲线
第一步,添加一个图片静态控件,修改其属性,在其选项框中复选Client edge和Modal frame两项,创建好绘图区域。
第二步,为绘图按纽添加相应功能,只要点击该按纽软件就会在绘图区域里面绘制出相应的图形。通过ClassWizard选择IDC_BUTDRAW为对象,选择其单击事件添加命令,然后点击EDIT CODE编辑该命令。然后在MFC ClassWizard下,为对话框添加相关消息,如表1。
表1控件属性
第三步,就是在绘图区域里面绘制坐标轴,坐标轴的绘制实际上就是线段的绘制,使用绘制直线的函数:
CPoint CDC::MoveTo(int x,int y);
BOOL CDC::LineTo(int xEnd,int yEnd);
上述函数实现的功能分别是:调整画笔的起始坐标(即从哪个点开始画线)和指定所画线段的终点坐标(即在哪个点结束),函数里面两个变量分别对应点的横坐标与纵坐标。
然后利用TextOut函数在绘图区相应的位置输出坐标轴的名称以及原点的名称,分别为S,I(对应于坐标和光强)和O点。
绘图功能形成流程图,如图3所示:
图3绘图流程
3.2.2 清除区域
为了能够实现实验曲线的实时绘制,必须添加清除绘图区域的功能,以实现衍射曲线的重绘功能。添加OnButclear函数,在函数中输入如下代码:
void CPage1::OnButclear()
{
InvalidateRect(CRect(0,0,330,330));
}
3.3 曲线模拟
为了能够对比观察实验曲线和理想衍射曲线之间的异同,实现衍射曲线的自动模拟功能,采用GIF动画的自动播放功能,提供一个直观的画面。
首先还是要在该界面上创建一个图片控件(Picture Control)。在项目中插入文件:把PictureEx.h,PictureEx.cpp文件拷贝到项目文件夹下,在Add to Project的Files选项中选上PictureEx.h,PictureEx.cpp,Insert。从对话框控件中把Picture Control(图片控件)拖入主对话框中,修改其属性:ID:IDC_GIF,TYPE:Rectangle,其余接受缺省选项。再在ClassWiard中为IDF_GIF加入CSatic控制变量m_GifPic, 观察GifDemoDlg.h中是否加上了#include "PictureEx.h"(由ClassWizard加入)。然后将CSatic m_GifPic更改成CPictureEx m_GifPic;
加载动画文件:先将要加载的动画文件放到 res 资源文件夹下,再将其Import进项目中,由于MFC只支持256BMP文件的图片,因此要新建一个图片类型:“GIF”,将已经做好了的GIF文件放进去 ,并将其ID修改成:IDR_GIF1。
import(导入)GIF动画的详细过程:在ResourceView窗口中,单击鼠标右键,在出现的环境菜单中选择“import”命令,会出现“import resource”选择文件对话框,文件类型选择“所有文件”,open as 选项为"auto",再选择动画文件所在目录,选上要载入的动画文件“模拟曲线.gif”,再单击 import,由于gif动画类型不是VC默认的文件类型,这时会出现"custom resource type"对话框,键入“GIF”,再单击ok,然后修改其ID。
在CPage2::OnInitDialog()函数中加入如下代码:
{…………………
// TODO: Add extra initialization here
if (m_GifPic.Load(MAKEINTRESOURCE(IDR_GIF1),_T("Gif")))
m_GifPic.Draw();
}
此时就可以在这个属性页上顺利地添加GIF动画了,其效果图如图4(以单缝夫琅禾费衍射曲线为例)所示。
图4模拟曲线
参考文献
[1]史大椿著.光学测量与应用光学实验.机械工业出版社,1992.
[2]杨枝灵,王开著.Visual C++ 数字图像获取处理及实践应用.人民邮电出版社,2003.
[3]刘静华,王永生著.最新VC++绘图程序设计技巧与实例教程.科学出版社,2001.
[4]Bjarne Stroustrup著.The C++ Programming Language.裘宗燕,译.机械工业出版社,2002.
[5]Chris H.Pappas William H.Maurray 著.Visual C++ 6参考大全.希望图书创作室,2004.
[6]David J.Kruglinski著.Programming Visual C++ .潘爱民,王国印,译.清华大学出版社,2001.