高級語言在測控中的應(yīng)用_第1頁
高級語言在測控中的應(yīng)用_第2頁
高級語言在測控中的應(yīng)用_第3頁
高級語言在測控中的應(yīng)用_第4頁
高級語言在測控中的應(yīng)用_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、1 引引 言言 1.1 問題的提出問題的提出 在 Windows 環(huán)境下,串口是系統(tǒng)資源的一部分。應(yīng)用程序要使用串口進(jìn)行通信, 必須在使用前向操作系統(tǒng)提出資源申請要求(打開串口),通信完成后必須釋放資源 (關(guān)閉串口)。在 Windows 的系統(tǒng)函數(shù)中,均包含了支持通信中斷的功能。對串口通 信而言,Windows 為相應(yīng)的串口設(shè)備開放了用戶定義的輸出緩沖區(qū)和輸入緩沖區(qū),應(yīng)用 程序只能對輸入/輸出緩沖區(qū)進(jìn)行操作,數(shù)據(jù)進(jìn)出歘口的操作均由系統(tǒng)后臺完成。以接 收受為例,系統(tǒng)每接收到的字符送入輸入緩沖區(qū),此時應(yīng)用程序就可以通過訪問輸入 緩沖區(qū)得到接收到的字符信息。 Windows 為用戶提供了兩種方式實現(xiàn)

2、串口通信: 使用串口通信控件使用串口通信控件 使用使用 WindowsWindows 的的 APIAPI 應(yīng)用程序接口應(yīng)用程序接口 使用串口通信控件進(jìn)行串口程序開發(fā)極為方便,如果不需要對串口進(jìn)行高級控制 一般多選擇使用 MSComm 控件進(jìn)行開發(fā)。 針對串口通信,微軟公司專門提供了 MSComm 控件,使用該控件進(jìn)行串口通信設(shè)計 是十分方便的,程序員不必花時間去了解較為復(fù)雜的 API 函數(shù)。通過簡單修改控件的 屬性和使用控件提供的方法,就可以實現(xiàn)對串口的配置、完成串口接收和發(fā)送數(shù)據(jù)。 Micronsoft Communications Control(MSComm)是 Micronsoft 公

3、司提供的簡化 Windows 下串口通信編程的 ActiveX 控件,它為應(yīng)用程序提供了通過串口收發(fā)數(shù)據(jù)的簡 便方法。在串口編程中,使用 MSComm 控件非常方便,僅需通過簡單修改控件屬性和使 用控件提供的方法,就可以實現(xiàn)對串口的配置,完成串口接收和發(fā)送數(shù)據(jù)等任務(wù)。 在 mfc 中進(jìn)行串口通訊最簡單的方法莫過于在對話框中使用 MSCOMM 控件了, MSComm 通信控件提供了一系列標(biāo)準(zhǔn)通信命令的接口,它允許建立串口連接,可以連接 到其他通信設(shè)備(如 Modem)還可以發(fā)送命令、進(jìn)行數(shù)據(jù)交換以及監(jiān)視和響應(yīng)在通信 過程中可能發(fā)生的各種錯誤和事件,從而可以用它創(chuàng)建全雙工 、事件驅(qū)動的、高效實 用

4、的通信程序。 1.2 國內(nèi)外研究的現(xiàn)狀國內(nèi)外研究的現(xiàn)狀 串行通信在通訊領(lǐng)域被廣泛應(yīng)用,標(biāo)準(zhǔn)的 RS232 接口已成為計算機、外設(shè)、交換 機和許多通訊設(shè)備的標(biāo)準(zhǔn)接口雖然近年來隨著 USB 口的日趨流行,RS232 接口串口 1.3 任務(wù)與分析任務(wù)與分析 任務(wù):設(shè)計一個串口通訊程序,實現(xiàn)對數(shù)據(jù)的發(fā)送和接受。 要求: (1)、有良好的用戶界面 (2)、串口可選,其他設(shè)置默認(rèn)值不變 (3)、在同一計算機上進(jìn)行調(diào)試 (4)、可進(jìn)行單個數(shù)據(jù)或成批數(shù)據(jù)傳輸 個單選框?qū)?yīng)六個串口。 2 程序的主要功能 2.12.1 串口選擇串口選擇、打開、關(guān)閉功能、打開、關(guān)閉功能 通過單選框?qū)崿F(xiàn)選擇通信串口(COM1/COM

5、2/COM3) ,其他串口設(shè)置默認(rèn)設(shè)置為: 波特 2.22.2 發(fā)送數(shù)據(jù)功能發(fā)送數(shù)據(jù)功能 通過【發(fā)送】按鈕對應(yīng)函數(shù)OnButtonManualsend()來實現(xiàn)。發(fā)送數(shù)據(jù)時,程序僅需要 讀出發(fā)送編輯框的內(nèi)容,將其轉(zhuǎn)化為發(fā)送程序需要的數(shù)據(jù)格式后,再使用 C 語言中的 強制類型轉(zhuǎn)換功能,將其轉(zhuǎn)換為 ColeVariant 數(shù)據(jù)類型,由 MSComm 類的 SetOutput() 函數(shù)送入發(fā)送緩沖區(qū)即可。 2.32.3 接收功能接收功能 當(dāng) MSComm 的接收緩沖區(qū)有字符時,程序會發(fā)送事件消息,OnOnCommMscomm1()函 數(shù)響應(yīng)該消息并進(jìn)行處理,由于 MSComm 類 GetInput(

6、)函數(shù)返回的數(shù)據(jù)變量類型為 Variant 型,而編輯框?qū)?yīng)的顯示字符串是 Cstring 型,因此接收數(shù)據(jù)時,需要先進(jìn) 行類型轉(zhuǎn)換。在 VC 中,轉(zhuǎn)換過程如下: 將 Variant 類型轉(zhuǎn)換為 ColeSafeArray 類型; 將 ColeSafeArray 類型轉(zhuǎn)換為 BYTE 類型數(shù)組; 將 BYTE 類型數(shù)組轉(zhuǎn)換為 Cstring 變量。 2.42.4 發(fā)送、接收計數(shù)并顯示功能發(fā)送、接收計數(shù)并顯示功能 通過【發(fā)送:】 【接收:】按鈕(屬性中樣式選為:浮動)實現(xiàn)顯示發(fā)送接收計數(shù) 顯示。 2.52.5 清除顯示功能清除顯示功能 分別通過【清空顯示】 【清空顯示】 【清空計數(shù)】按鈕將發(fā)送區(qū)

7、、接收區(qū)、計數(shù)顯示 清空。 2.62.6 退出程序功能退出程序功能 通過【退出】按鈕實現(xiàn)退出程序的功能。 3 程序運行平臺 VC+6.0、串口調(diào)試助手 V2.1、VSPM 虛擬串口 具體操作如下: 3.13.1 創(chuàng)建基于對話框的創(chuàng)建基于對話框的 MFC 應(yīng)用程序應(yīng)用程序 打開 vc+6.0 文件-新建-工程(選擇 MFC AppWizard exe)工程名: tudanmscomm ;選擇文件保存位置-確定-選基本對話框-下一步-下一步(默 認(rèn)設(shè)置)-下一步(默認(rèn)設(shè)置)-選擇 CmyDlg-完成-確定。 3.23.2 在當(dāng)前的在當(dāng)前的 Workspace 中插入中插入 MSComm 控件控件

8、在設(shè)置項目選項時必須選上 ActiveX Controls,其他的按照缺省設(shè)置。然后進(jìn) 行 3.33.3 其他控件添加其他控件添加 根據(jù)自己的設(shè)計,將相應(yīng)的控件添加到對話框中,并修改屬性以及相應(yīng)的添加變 量。設(shè)計好的對話框如下圖所示: 3.43.4 程序編輯程序編輯 根據(jù)設(shè)計要求內(nèi)容編輯程序,并通過反復(fù)的調(diào)試、編譯、連接、執(zhí)行,完成設(shè)計 要求,并運行成功,能夠?qū)崿F(xiàn)各個功能要求。 4 總體設(shè)計 圖 4.1 系統(tǒng)總體框架圖 5 5 程序類的說明程序類的說明 選 擇 串 口 打 開 串 口 刪 除 信 息 關(guān) 閉 串 口 清 空 信 息 發(fā) 送 數(shù) 據(jù) 修 改 信 息 主 函 數(shù) 接 收 數(shù) 據(jù) 顯

9、 示 信 息 清 除 發(fā) 送 去 顯 示 查 找 信 息 清 除 接 收 查 找 信 息 清 除 計 數(shù) 查 找 信 息 退 出 程 序 查 找 信 息 CMSCommDlg 類的聲明類的聲明 voclass CMSommDlg : public CDialog / Construction public: CMSCommDlg(CWnd* pParent = NULL);/ standard constructor / Dialog Data /AFX_DATA(CMSCommDlg) enum IDD = IDD_MSCOMM_DIALOG ; /各個控件對應(yīng)控件 ID 的變量類型以及對應(yīng)

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 ();/清除接收區(qū)顯示 afx_m

12、sg void OnCleancounter ();/清除發(fā)送、接收計數(shù) afx_msg void OnQuit (); /退出程序 afx_msg void OnClosecom (); /關(guān)閉串口 afx_msg void OnOnCommMscomm1();/接收緩沖區(qū)響應(yīng)函數(shù) afx_msg void OnSenddata ();/數(shù)據(jù)發(fā)送 afx_msg void OnCleandata2 ();/清除發(fā)送區(qū)顯示 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 個數(shù)據(jù)位,1 個停止位 m_mscomm.SetInputMode(1);/輸入方式為二進(jìn)制方式 m_mscomm.SetInBufferSize(1024);/設(shè)置

14、輸入緩沖區(qū)大小 m_mscomm.SetOutBufferSize(512);/設(shè)置輸 chu 緩沖區(qū)大小 /設(shè)置波特率 9600,無校驗,8 個數(shù)據(jù)位,1 個停止位 m_mscomm.SetSettings(9600,N,8,1); if(!m_mscomm.GetPortOpen() m_mscomm.SetRThreshold(1);/參數(shù) 1 表示每當(dāng)串口接收緩沖區(qū)中有多于或等 于一個字符時將引發(fā)一個接收數(shù)據(jù) oncomm 事件 m_mscomm.SetInputLen(0);/設(shè)置當(dāng)前接受區(qū)數(shù)據(jù)長度為 0 m_mscomm.GetInput();/先預(yù)讀緩沖區(qū)以清除殘余數(shù)據(jù) m_co

15、mopen.EnableWindow(false);/打開串口按鈕無效 m_comclose.EnableWindow(true);/關(guān)閉串口按鈕有效 6.26.2 串口選擇串口選擇模塊模塊 單選按鈕實現(xiàn)串口選擇: void CMSCommDlg:OnRadio1() radionumber=1; if(m_mscomm.GetPortOpen() m_mscomm.SetPortOpen(false);/關(guān)閉串口 m_comopen.EnableWindow(true);/打開串口按鈕有效 m_comclose.EnableWindow(false);/關(guān)閉串口按鈕失效 m_mscomm.S

16、etCommPort(radionumber);/選擇相應(yīng)的 COM1 m_mscomm.SetPortOpen(true);/關(guān)閉串口 m_comopen.EnableWindow(false);/打開串口按鈕有效 m_comclose.EnableWindow(true);/關(guān)閉串口按鈕失效 void CMSCommDlg:OnRadio2() / TODO: Add your control notification handler code here radionumber=2; if(m_mscomm.GetPortOpen() m_mscomm.SetPortOpen(false)

17、;/關(guān)閉串口 m_comopen.EnableWindow(true);/打開串口按鈕有效 m_comclose.EnableWindow(false);/關(guān)閉串口按鈕失效 m_mscomm.SetCommPort(radionumber);/選擇相應(yīng)的 COM2 m_mscomm.SetPortOpen(true);/關(guān)閉串口 m_comopen.EnableWindow(false);/打開串口按鈕有效 m_comclose.EnableWindow(true);/關(guān)閉串口按鈕失效 void CMSCommDlg:OnRadio3() / TODO: Add your control no

18、tification handler code here radionumber=3; if(m_mscomm.GetPortOpen() m_mscomm.SetPortOpen(false);/關(guān)閉串口 m_comopen.EnableWindow(true);/打開串口按鈕有效 m_comclose.EnableWindow(false);/關(guān)閉串口按鈕失效 m_mscomm.SetCommPort(radionumber);/選擇相應(yīng)的 COM3 m_mscomm.SetPortOpen(true);/關(guān)閉串口 m_comopen.EnableWindow(false);/打開串口按鈕

19、有效 m_comclose.EnableWindow(true);/關(guān)閉串口按鈕失效 void CMSCommDlg:OnRadio4() / TODO: Add your control notification handler code here radionumber=4; if(m_mscomm.GetPortOpen() m_mscomm.SetPortOpen(false);/關(guān)閉串口 m_comopen.EnableWindow(true);/打開串口按鈕有效 m_comclose.EnableWindow(false);/關(guān)閉串口按鈕失效 m_mscomm.SetCommPor

20、t(radionumber);/選擇相應(yīng)的 COM4 m_mscomm.SetPortOpen(true);/關(guān)閉串口 m_comopen.EnableWindow(false);/打開串口按鈕有效 m_comclose.EnableWindow(true);/關(guān)閉串口按鈕失效 6.36.3 發(fā)送數(shù)據(jù)、發(fā)送發(fā)送數(shù)據(jù)、發(fā)送計數(shù)顯示模塊計數(shù)顯示模塊 通過觸發(fā)【發(fā)送按鈕】實現(xiàn)發(fā)送數(shù)據(jù): void CTudanmscommDlg:OnButtonManualsend() / TODO: Add your control notification handler code here UpdateData

21、(TRUE); /讀取編輯框內(nèi)容 m_ctrlComm.SetOutput(COleVariant(m_strEditTXData); /發(fā)送數(shù)據(jù) TX_count+=m_strEditTXData.GetLength(); /發(fā)送計數(shù) CString strTemp; strTemp.Format(發(fā)送:%d,TX_count); m_ctrlTXCount.SetWindowText(strTemp); /顯示計數(shù) 6.46.4 數(shù)據(jù)接收數(shù)據(jù)接收、接收計數(shù)顯示模塊、接收計數(shù)顯示模塊 void CTudanmscommDlg:OnOnCommMscomm1() / TODO: Add you

22、r control notification handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata2048; /設(shè)置 BYTE 數(shù)組 CString strtemp; if(m_ctrlComm.GetCommEvent()=2) /事件值為 2 表示接受緩沖區(qū)內(nèi)有字符 variant_inp=m_ctrlComm.GetInput(); /讀緩沖區(qū) safearray_inp=variant_inp; /VARIANT 型變量轉(zhuǎn)換為 ColeSafeArray 型

23、變量 len=safearray_inp.GetOneDimSize(); /得到有效數(shù)據(jù)長度 for(k=0;klen;k+) safearray_inp.GetElement( /轉(zhuǎn)換為 BYTE 型數(shù)組 for(k=0;klen;k+) /將數(shù)組轉(zhuǎn)換為 Cstring 型變量 BYTE bt=*(char*)(rxdata+k); /字符型 strtemp.Format(%c,bt); /將字符送入臨時變量 strtemp 存放 m_strEditRXData+=strtemp; /加入接受編輯框?qū)?yīng)字符串 rxdatacount+=len; /m_ctrlRXCount.SetWind

24、owText(接受:+rxdatacount); CString temp; temp.Format(%ld,rxdatacount); temp=接受:+temp; m_ctrlRXCount.SetWindowText(temp); /顯示接受計數(shù) UpdateData(false);/修改為空 6.56.5 清空模塊清空模塊 /接收區(qū)顯示清空 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(); /發(fā)送區(qū)顯示清空 void CMSCommDlg:OnCleandata2() / TODO: Add your control notification handler code here m_str_send.Empty(); UpdateData(false);/修改為空 /計數(shù)顯示清空 void CMSCommDlg:OnCleancounter() / TODO: A

26、dd your control notification handler code here recvcount=0; sendcount=0; m_sendcount.SetWindowText(發(fā)送:0); m_recvcount.SetWindowText(接收:0); 6.66.6 打開串口、關(guān)閉串口、退出程序模塊打開串口、關(guān)閉串口、退出程序模塊 /打開串口 void CMSCommDlg:OnOpencom() if(!m_mscomm.GetPortOpen() m_mscomm.SetPortOpen(true); m_comopen.EnableWindow(false);/打

27、開串口按鈕失效 m_comclose.EnableWindow(true);/關(guān)閉串口按鈕有效 /關(guān)閉串口 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 系統(tǒng)測試 首先進(jìn)入 VC+6.0,打開工程 MSComm.dsw,然后進(jìn)入源程序,接著選擇 Build 下 的 Execute MSComm.exe 即可,也可以不打開工程,直接雙擊 MSComm 文件夾下的 debug 或 release 子文件夾下的 MSComm.exe 文件即可運行程序。 調(diào)試如下: (1) 、 打開 VSPM 虛擬串口并新增虛擬串口:(圖 7-1) 圖 7-1 (2) 、打開串口調(diào)試助手 V2.1、并選擇虛擬串口

29、 COM3:(圖 7-2) 圖 7-2 (3) 、打開 vc+6.0,運行自己設(shè)計的程序、并選擇串口 COM4(圖 7-3) (圖 7-3) (4) 、分別在串口調(diào)試助手 V2.1 和自己的程序發(fā)送區(qū)輸入內(nèi)容,再點【發(fā)送】按鈕, 觀察各個文本框的內(nèi)容是否正確:(圖 7-4) (圖 7-5) (5) 、點擊【清除顯示】 、 【清除顯示】 、 【清除計數(shù)】分別將文本框、發(fā)送和計數(shù)顯示 清除:(圖 7-5) (圖 7-5) (6) 、測試成功程序能夠完成串口通訊功能。點擊【退出】按鈕退出程序。 8 結(jié)論 本次課程設(shè)計是利用 VC+下的 MSComm 控件編程方法,通過 MSComm 控件可以十分 便捷地寫出靈活性高,移植性強的串口通信程序,避免了去了解一些復(fù)雜的 windowsAPI 函數(shù)。這種方法具有很強的實用性,可以廣泛地用于工業(yè)數(shù)據(jù)采集等領(lǐng)域。 課程設(shè)計頭幾天因為考試,耽誤了時間。之后明

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論