摘要為了便于觀察干涉、衍射等光學實驗現(xiàn)象,提高實驗精度,驗證實驗原理,而設計光強探測系統(tǒng)。系統(tǒng)由光信號的接收與轉換、電信號的傳輸與處理、數(shù)據(jù)的存儲及輸出三個部分組成。其中數(shù)據(jù)的存儲及輸出部分,基于VC設計實現(xiàn),包括數(shù)據(jù)存儲、探測繪圖、曲線模擬。通過不斷的修正和改進,以及新功能的添加,最終形成較滿意的可行系統(tǒng)。
關鍵詞光強探測 Visual C++ 數(shù)據(jù)存儲
中圖分類號:O43文獻標識碼:A
1 引言
設計實現(xiàn)光強探測系統(tǒng),主要是用其觀測光線在接收屏上的光強大小及分布,并將觀測數(shù)據(jù)記錄在計算機系統(tǒng)上,以光強曲線的方式快速直觀地顯示出來。可用于學生觀察干涉、衍射等光學實驗現(xiàn)象,并對所記錄的數(shù)據(jù)進行分析,驗證實驗原理,提高實驗精度。
2 系統(tǒng)結構及設計
光強探測系統(tǒng)分為光信號的接收與轉換、電信號的傳輸與處理、數(shù)據(jù)的存儲及輸出三個部分,如圖1所示。
圖1
例如在單縫夫瑯禾費衍射實驗中,采用散射角極小的激光光束,通過一條很細的狹縫(0.1~0.3mm),就可在狹縫后大于1.5m的光屏上看到夫瑯禾費衍射條紋。為了提高實驗探測精度和速度,用光機電結合的方式,以圖1的系統(tǒng)結構進行優(yōu)化,組成所需的單縫夫瑯禾費衍射實驗系統(tǒng)。利用光電探測器和步進式電機記錄各點的光強分布數(shù)據(jù),以代替?zhèn)鹘y(tǒng)人工機械讀取數(shù)據(jù);利用計算機接口技術和軟件技術,實現(xiàn)自動控制及數(shù)據(jù)存儲輸出,以代替人工計算檢驗數(shù)據(jù)。再配以專用實驗平臺,就可實現(xiàn)高精度的自動化實驗系統(tǒng)。
對于光強探測系統(tǒng)中光信號的接受與轉換、電信號的傳輸與處理可由設計成熟的光電探測系統(tǒng)獨立完成,相關應用很多,在這里因篇幅所限,不再討論。對于數(shù)據(jù)的存儲及輸出,是本文重點討論的內容。采用Visual C++語言來實現(xiàn)光強探測系統(tǒng),實現(xiàn)的功能包括:數(shù)據(jù)存儲、探測繪圖、曲線模擬。因VC屬于可視化與面向對象的程序設計技術,與人類習慣的思維方法比較一致,對象能直接獲得已有的特性,穩(wěn)定、易于修改、擴充和維護。并且VC的執(zhí)行速度,加之對Windows操作系統(tǒng)的支持,使得VC的在整個計算機的硬件和軟件方面的訪問和控制更加游刃有余。可以在很短時間內為用戶建立一個穩(wěn)固而安全的骨架,快速增加新的類、變量和處理函數(shù),方便而迅速地將某個消息映射到某個處理函數(shù)上,方便地操作本地或異地的數(shù)據(jù)庫。
3 基于VC的系統(tǒng)實現(xiàn)
系統(tǒng)設計的主界面上有3個圖標,分別單擊各個圖標會進入不同的屬性頁,每一個屬性頁上有不同的按鈕,分別負責處理不同的功能,框架圖如圖2所示。
圖2系統(tǒng)設計框架
3.1 數(shù)據(jù)存儲
3.1.1 儀器控制
首先打開串口。使用CreateFile()打開串口,然后關閉串口,設置緩沖區(qū)長度。改變端口設置使用如下的兩個方法:BOOL GetCommState(hComm,dcb);BOOL SetCommState(hComm,dcb);改變普通設置:BuildCommDCB(szSettings,DCB);最后將其設置成同步I/O讀寫數(shù)據(jù)。
3.1.2 數(shù)據(jù)保存
為了便于光強數(shù)據(jù)的記錄、讀寫、保存與修改,設計直接生成“光強數(shù)據(jù).txt”的數(shù)據(jù)保存文檔,里面分行分列保存了步進式電機上的光電接收器件接收到的數(shù)據(jù),包括采樣點序號、坐標以及光強。
首先打開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(\"光強數(shù)據(jù).txt\",CFile::modeCreate | CFile::modeWrite) }
文本文檔創(chuàng)建好之后,就要將相應的數(shù)據(jù)寫入這個文檔。由于采用的是字符串輸出的函數(shù)格式,所以要先將接收到的Float型的數(shù)值變量轉換成CString型的變量,其語句為:
strOut1.Format(\"%s%d\",strOut1,i);
這樣就可以采用循環(huán)的方式,并在適當?shù)奈恢眉尤霌Q行輸出符,將各個變量在文檔的相應位置輸出出來。
3.2 探測繪圖
3.2.1 繪制曲線
第一步,添加一個圖片靜態(tài)控件,修改其屬性,在其選項框中復選Client edge和Modal frame兩項,創(chuàng)建好繪圖區(qū)域。
第二步,為繪圖按紐添加相應功能,只要點擊該按紐軟件就會在繪圖區(qū)域里面繪制出相應的圖形。通過ClassWizard選擇IDC_BUTDRAW為對象,選擇其單擊事件添加命令,然后點擊EDIT CODE編輯該命令。然后在MFC ClassWizard下,為對話框添加相關消息,如表1。
表1控件屬性
第三步,就是在繪圖區(qū)域里面繪制坐標軸,坐標軸的繪制實際上就是線段的繪制,使用繪制直線的函數(shù):
CPoint CDC::MoveTo(int x,int y);
BOOL CDC::LineTo(int xEnd,int yEnd);
上述函數(shù)實現(xiàn)的功能分別是:調整畫筆的起始坐標(即從哪個點開始畫線)和指定所畫線段的終點坐標(即在哪個點結束),函數(shù)里面兩個變量分別對應點的橫坐標與縱坐標。
然后利用TextOut函數(shù)在繪圖區(qū)相應的位置輸出坐標軸的名稱以及原點的名稱,分別為S,I(對應于坐標和光強)和O點。
繪圖功能形成流程圖,如圖3所示:
圖3繪圖流程
3.2.2 清除區(qū)域
為了能夠實現(xiàn)實驗曲線的實時繪制,必須添加清除繪圖區(qū)域的功能,以實現(xiàn)衍射曲線的重繪功能。添加OnButclear函數(shù),在函數(shù)中輸入如下代碼:
void CPage1::OnButclear()
{
InvalidateRect(CRect(0,0,330,330));
}
3.3 曲線模擬
為了能夠對比觀察實驗曲線和理想衍射曲線之間的異同,實現(xiàn)衍射曲線的自動模擬功能,采用GIF動畫的自動播放功能,提供一個直觀的畫面。
首先還是要在該界面上創(chuàng)建一個圖片控件(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”,將已經(jīng)做好了的GIF文件放進去 ,并將其ID修改成:IDR_GIF1。
import(導入)GIF動畫的詳細過程:在ResourceView窗口中,單擊鼠標右鍵,在出現(xiàn)的環(huán)境菜單中選擇“import”命令,會出現(xiàn)“import resource”選擇文件對話框,文件類型選擇“所有文件”,open as 選項為\"auto\",再選擇動畫文件所在目錄,選上要載入的動畫文件“模擬曲線.gif”,再單擊 import,由于gif動畫類型不是VC默認的文件類型,這時會出現(xiàn)\"custom resource type\"對話框,鍵入“GIF”,再單擊ok,然后修改其ID。
在CPage2::OnInitDialog()函數(shù)中加入如下代碼:
{…………………
// TODO: Add extra initialization here
if (m_GifPic.Load(MAKEINTRESOURCE(IDR_GIF1),_T(\"Gif\")))
m_GifPic.Draw();
}
此時就可以在這個屬性頁上順利地添加GIF動畫了,其效果圖如圖4(以單縫夫瑯禾費衍射曲線為例)所示。
圖4模擬曲線
參考文獻
[1]史大椿著.光學測量與應用光學實驗.機械工業(yè)出版社,1992.
[2]楊枝靈,王開著.Visual C++ 數(shù)字圖像獲取處理及實踐應用.人民郵電出版社,2003.
[3]劉靜華,王永生著.最新VC++繪圖程序設計技巧與實例教程.科學出版社,2001.
[4]Bjarne Stroustrup著.The C++ Programming Language.裘宗燕,譯.機械工業(yè)出版社,2002.
[5]Chris H.Pappas William H.Maurray 著.Visual C++ 6參考大全.希望圖書創(chuàng)作室,2004.
[6]David J.Kruglinski著.Programming Visual C++ .潘愛民,王國印,譯.清華大學出版社,2001.