串口調(diào)試助手源程序_第1頁
串口調(diào)試助手源程序_第2頁
串口調(diào)試助手源程序_第3頁
串口調(diào)試助手源程序_第4頁
串口調(diào)試助手源程序_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、串口調(diào)試助手源程序及編程詳細過程作者:龔建偉  2001.6.20可以任意轉載,但必須注明作者和說明來自,不得作為商用目次:1.建立項目  2.在項目中插入MSComm控件 3.利用ClassWizard定義CMSComm類控制變量4.在對話框中添加控件  5.添加串口事件消息處理函數(shù)OnComm()6.打開和設置串口參數(shù)7.發(fā)送數(shù)據(jù)    在眾多網(wǎng)友的支持下,串口調(diào)試助手從2001年5月21日發(fā)布至今,短短一個月,在全國各地累計下載量近5000人次,在近200多個電子郵件中,20多人提供了使用測試意見,

2、更有50多位朋友提出要串口調(diào)試助手的源代碼,為了答謝謝朋友們的支持,公開推出我最初用VC控件MSComm編寫串口通信程序的源代碼,并寫出詳細的編程過程,姑且叫串口調(diào)試助手源程序V1.0或VC串口通訊源程序吧,我相信,如果你用VC編程,那么有了這個代碼,就可以輕而易舉地完成串口編程任務了。(也許本文過于詳細,高手就不用看)開始吧:1.建立項目:打開VC6.0,建立一個基于對話框的MFC應用程序SCommTest(與我源代碼一致,等會你會方便一點);2.在項目中插入MSComm控件   選擇Project菜單下Add To Project子菜單中的 Components and

3、 Controls選項,在彈出的對話框中雙擊Registered ActiveX Controls項(稍等一會,這個過程較慢),則所有注冊過的ActiveX控件出現(xiàn)在列表框中。 選擇Microsoft Communications Control, version 6.0,單擊Insert按鈕將它插入到我們的Project中來,接受缺省的選項。(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安裝VC6時沒有把ActiveX一項選上,重新安裝VC6,選上ActiveX就可以了),這時在ClassView視窗中就可以

4、看到CMSComm類了,(注意:此類在ClassWizard中看不到,重構clw文件也一樣),并且在控件工具欄Controls中出現(xiàn)了電話圖標(如圖1所示),現(xiàn)在要做的是用鼠標將此圖標拖到對話框中,程序運行后,這個圖標是看不到的。3.利用ClassWizard定義CMSComm類控制對象  打開ClassWizard>Member Viariables選項卡,選擇CSCommTestDlg類,為IDC_MSCOMM1添加控制變量:m_ctrlComm,這時你可以看一看,在對話框頭文件中自動加入了/AFX_INCLUDES()  #include "mscom

5、m.h"  /AFX_INCLUDES (這時運行程序,如果有錯,那就再從頭開始)。4.在對話框中添加控件  向主對話框中添加兩個編輯框,一個用于接收顯示數(shù)據(jù)ID為IDC_EDIT_RXDATA,另一個用于輸入發(fā)送數(shù)據(jù),ID為IDC_EDIT_TXDATA,再添加一個按鈕,功能是按一次就把發(fā)送編輯框中的內(nèi)容發(fā)送一次,將其ID設為IDC_BUTTON_MANUALSEND。別忘記了將接收編輯框的Properties>Styles中把Miltiline和Vertical Scroll屬性選上,發(fā)送編輯框若你想輸入多行文字,也可選上Miltiline。再打開Cla

6、ssWizard>Member Viariables選項卡,選擇CSCommTestDlg類, 為IDC_EDIT_RXDATA添加CString變量m_strRXData, 為IDC_EDIT_TXDATA添加CString變量m_strTXData。說明: m_strRXData和m_strTXData分別用來放入接收和發(fā)送的字符數(shù)據(jù)。      5.添加串口事件消息處理函數(shù)OnComm() 打開ClassWizard>Message Maps,選擇類CSCommTestDlg,選擇IDC_MSCOMM1,雙擊消息On

7、Comm,將彈出的對話框中將函數(shù)名改為OnComm,(好記而已)OK。 這個函數(shù)是用來處理串口消息事件的,如每當串口接收到數(shù)據(jù),就會產(chǎn)生一個串口接收數(shù)據(jù)緩沖區(qū)中有字符的消息事件,我們剛才添加的函數(shù)就會執(zhí)行,我們在OnComm()函數(shù)加入相應的處理代碼就能實現(xiàn)自已想要的功能了。請你在函數(shù)中加入如下代碼:void CSCommTestDlg:OnComm()     / TODO: Add your control notification handler code here    VARIANT variant_in

8、p;    COleSafeArray safearray_inp;    LONG len,k;    BYTE rxdata2048; /設置BYTE數(shù)組 An 8-bit integerthat is not signed.    CString strtemp;    if(m_ctrlComm.GetCommEvent()=2) /事件值為2表示接收緩沖區(qū)內(nèi)有字符       

9、          /以下你可以根據(jù)自己的通信協(xié)議加入處理代碼        variant_inp=m_ctrlComm.GetInput(); /讀緩沖區(qū)        safearray_inp=variant_inp; /VARIANT型變量轉換為ColeSafeArray型變量       

10、; len=safearray_inp.GetOneDimSize(); /得到有效數(shù)據(jù)長度        for(k=0;k<len;k+)            safearray_inp.GetElement(&k,rxdata+k);/轉換為BYTE型數(shù)組        for(k=0;k<len;k+) /將數(shù)組轉換為

11、Cstring型變量                    BYTE bt=*(char*)(rxdata+k); /字符型            strtemp.Format("%c",bt); /將字符送入臨時變量strtemp存放    

12、60;       m_strRXData+=strtemp; /加入接收編輯框?qū)址?#160;                UpdateData(FALSE); /更新編輯框內(nèi)容到目前為止還不能在接收編輯框中看到數(shù)據(jù),因為我們還沒有打開串口,但運行程序不應該有任何錯誤,不然,你肯定哪兒沒看仔細,因為我是打開VC6對照著做一步寫一行的,運行試試。沒錯吧?那么做下一步:6.打開串口和設置串口參數(shù)

13、60; 你可以在你需要的時候打開串口,例如在程序中做一個開始按鈕,在該按鈕的處理函數(shù)中打開串口。現(xiàn)在我們在主對話框的CSCommTestDlg:OnInitDialog()打開串口,加入如下代碼:/ TODO: Add extra initialization hereif(m_ctrlComm.GetPortOpen()m_ctrlComm.SetPortOpen(FALSE);m_ctrlComm.SetCommPort(1); /選擇com1if( !m_ctrlComm.GetPortOpen()m_ctrlComm.SetPortOpen(TRUE);/打開串口elseAfxMess

14、ageBox("cannot open serial port");m_ctrlComm.SetSettings("9600,n,8,1"); /波特率9600,無校驗,8個數(shù)據(jù)位,1個停止位 m_ctrlComm.SetInputModel(1); /1:表示以二進制方式檢取數(shù)據(jù)m_ctrlComm.SetRThreshold(1); /參數(shù)1表示每當串口接收緩沖區(qū)中有多于或等于1個字符時將引發(fā)一個接收數(shù)據(jù)的OnComm事件m_ctrlComm.SetInputLen(0); /設置當前接收區(qū)數(shù)據(jù)長度為0m_ctrlComm.GetInput

15、();/先預讀緩沖區(qū)以清除殘留數(shù)據(jù)現(xiàn)在你可以試試程序了,將串口線接好后(不會接?去看看我寫的串口接線基本方法),打開串口調(diào)試助手,并將串口設在com2,選上自動發(fā)送,也可以等會手動發(fā)送。再執(zhí)行你編寫的程序,接收框里應該有數(shù)據(jù)顯示了。7.發(fā)送數(shù)據(jù)  先為發(fā)送按鈕添加一個單擊消息即BN_CLICKED處理函數(shù),打開ClassWizard>Message Maps,選擇類CSCommTestDlg,選擇IDC_BUTTON_MANUALSEND,雙擊BN_CLICKED添加OnButtonManualsend()函數(shù),并在函數(shù)中添加如下代碼:void CSCommTestDlg:On

16、ButtonManualsend() / TODO: Add your control notification handler code hereUpdateData(TRUE); /讀取編輯框內(nèi)容m_ctrlComm.SetOutput(COleVariant(m_strTXData);/發(fā)送數(shù)據(jù)運行程序,在發(fā)送編輯框中隨意輸入點什么,單擊發(fā)送按鈕,??!看看,在另一端的串口調(diào)試助手(或別的調(diào)試工具)接收框里出現(xiàn)了什么。如果你真是初次涉獵串口編程,又一次成功,那該說聲謝謝我了,因為我第一次做串口程序時可費勁了,那時網(wǎng)上的資料也不好找。開開玩笑,謝謝你的支持,有什么好東西別忘了給我寄

17、一份。最后說明一下,由于用到VC控件,在沒有安裝VC的計算機上運行時要從VC中把mscomm32.ocx、msvcrt.dll、mfc42.dll拷到Windows目錄下的System子目錄中(win2000為System32)并再進行注冊設置,請參考如何手工注冊MSComm控件。8.發(fā)送十六進制字符    在主對話框中加入一個復選接鈕,ID為IDC_CHECK_HEXSEND Caption: 十六進制發(fā)送,再利用ClassWizard為其添加控制變量:m_ctrlHexSend;    在ClassView中為SCommTestD

18、lg類添加以下兩個PUBLIC成員函數(shù),并輸入相應代碼;/由于這個轉換函數(shù)的格式限制,在發(fā)送框中的十六制字符應該每兩個字符之間插入一個空隔/如:A1 23 45 0B 00 29/CByteArray是一個動態(tài)字節(jié)數(shù)組,可參看MSDN幫助int CSCommTestDlg:String2Hex(CString str, CByteArray &senddata)int hexdata,lowhexdata;int hexdatalen=0;int len=str.GetLength();senddata.SetSize(len/2);for(int i=0;i<len;)char

19、 lstr,hstr=stri;if(hstr=' ')i+;continue;i+;if(i>=len)break;lstr=stri;hexdata=ConvertHexChar(hstr);lowhexdata=ConvertHexChar(lstr);if(hexdata=16)|(lowhexdata=16)break;else hexdata=hexdata*16+lowhexdata;i+;senddatahexdatalen=(char)hexdata;hexdatalen+;senddata.SetSize(hexdatalen);return

20、 hexdatalen;/這是一個將字符轉換為相應的十六進制值的函數(shù)/好多C語言書上都可以找到/功能:若是在0-F之間的字符,則轉換為相應的十六進制字符,否則返回-1char CSCommTestDlg:ConvertHexChar(char ch) if(ch>='0')&&(ch<='9')return ch-0x30;else if(ch>='A')&&(ch<='F')return ch-'A'+10;else if(ch>='

21、a')&&(ch<='f')return ch-'a'+10;else return (-1);  再將CSCommTestDlg:OnButtonManualsend()修改成以下形式:void CSCommTestDlg:OnButtonManualsend() / TODO: Add your control notification handler code hereUpdateData(TRUE); /讀取編輯框內(nèi)容if(m_ctrlHexSend.GetCheck()CByteArray hexdat

22、a;int len=String2Hex(m_strTXData,hexdata); /此處返回的len可以用于計算發(fā)送了多少個十六進制數(shù)m_ctrlComm.SetOutput(COleVariant(hexdata); /發(fā)送十六進制數(shù)據(jù)else m_ctrlComm.SetOutput(COleVariant(m_strTXData);/發(fā)送ASCII字符數(shù)據(jù)現(xiàn)在,你先將串口線接好并打開串口調(diào)試助手V2.1,選上以十六制顯示,設置好相應串口,然后運行我們這個程序,在發(fā)送框中輸入00 01 02 03 A1 CC等十六進制字符,并選上以十六進制發(fā)送,單擊手動發(fā)送,在串口調(diào)試助手的

23、接收框中應該可以看到00 01 02 03 A1 CC了。9.在接收框中以十六進制顯示    這就容易多了:  在主對話框中加入一個復選接鈕,IDC_CHECK_HEXDISPLAY Caption: 十六進制顯示,再利用ClassWizard為其添加控制變量:m_ctrlHexDiaplay。 然后修改CSCommTestDlg:OnComm()函數(shù):void CSCommTestDlg:OnComm() / TODO: Add your control notification handler code hereVARIANT v

24、ariant_inp;COleSafeArray safearray_inp;LONG len,k;BYTE rxdata2048; /設置BYTE數(shù)組 An 8-bit integerthat is not signed.CString strtemp;if(m_ctrlComm.GetCommEvent()=2) /事件值為2表示接收緩沖區(qū)內(nèi)有字符variant_inp=m_ctrlComm.GetInput(); /讀緩沖區(qū)safearray_inp=variant_inp; /VARIANT型變量轉換為ColeSafeArray型變量len=safearray_inp.GetOneDi

25、mSize(); /得到有效數(shù)據(jù)長度for(k=0;k<len;k+)safearray_inp.GetElement(&k,rxdata+k);/轉換為BYTE型數(shù)組for(k=0;k<len;k+) /將數(shù)組轉換為Cstring型變量BYTE bt=*(char*)(rxdata+k); /字符型if(m_ctrlHexDisplay.GetCheck()strtemp.Format("%02X ",bt); /將字符以十六進制方式送入臨時變量strtemp存放,注意這里加入一個空隔else strtemp.Format("%c&

26、quot;,bt); /將字符送入臨時變量strtemp存放m_strRXData+=strtemp; /加入接收編輯框?qū)址?#160;UpdateData(FALSE); /更新編輯框內(nèi)容測試:在串口調(diào)試助手發(fā)送框中輸入00 01 02 03 A1 CC等十六進制字符,并選上以十六進制發(fā)送,單擊手動發(fā)送,在本程序運行后選上以十六進制顯示,在串口調(diào)試助手中單擊手動發(fā)送或自動發(fā)送,則在本程序的接收框中應該可以看到00 01 02 03 A1 CC了。10.如何設置自動發(fā)送     最簡單的設定自動發(fā)送周期是用SetTimer()函數(shù),這在數(shù)據(jù)采集中很

27、有用,在控制中指令的傳送也可能用到定時發(fā)送。    方法是:在ClassWizard中選上MessageMap卡,然后在Objects IDs選中CSCommTestDlg類,再在Messages框中選上WM_TIMER消息,單擊ADD_FUNCTION加入void CSCommTestDlg:OnTimer(UINT nIDEvent) 函數(shù),這個函數(shù)是放入“時間到”后要處理的代碼:void CSCommTestDlg:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here a

28、nd/or call defaultOnButtonManualsend();CDialog:OnTimer(nIDEvent);再在在主對話框中加入一個復選接鈕,ID為IDC_CHECK_AUTOSEND Caption: 自動發(fā)送(周期1秒),再利用ClassWizard為其添加BN_CLICK消息處理函數(shù)void CSCommTestDlg:OnCheckAutosend():void CSCommTestDlg:OnCheckAutosend() / TODO: Add your control notification handler code herem_bAutoSend=!m_bAutoSend;if(m_bAutoSend)SetTimer(1,1000,NULL);/時間為1000毫秒elseKillTimer(1);  /取消定時其中:m_bAutoSend為BOOL型變量,在CLASSVIEW中為CSCommTestDlg類加入,并在構造函數(shù)中初始化:  &

溫馨提示

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

評論

0/150

提交評論