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

下載本文檔

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

文檔簡介

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

2、m編寫串口通信程序的源代碼,并寫出詳細(xì)的編程過程,姑且叫串口調(diào)試助手源程序 V1.0或VC串口通訊源程序 吧,我相信,如果你用VC編程,那么有了這個代碼,就可以輕而易舉地完成串口編程任務(wù)了。(也許本文過于詳細(xì),高手就不用看)開始吧:1. 建立項目:打開VC+ + 6.0,建立一個基于對話框的MFC應(yīng)用程序SCommTest(與我源代碼一致,等會你會方便一點);2. 在項目中插入 MSComi控件 選擇Project 菜單下 Add To Project 子菜單中的 Components and Controls ,選項,在彈出的對話框中雙擊 Registered ActiveX Control

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

4、) 并且在控件工具欄 Controls中出現(xiàn)了電話圖標(biāo)(如圖 1所示),現(xiàn)在要做的是用鼠標(biāo)將此圖標(biāo)拖到對話框中,程序 運行后,這個圖標(biāo)是看不到的。Cntrolw 日AfiabloH09ainn0&=H蔬bFA簾中3. 利用 ClassWizard 定義 CMSCon類控制對象打開 ClassWizard >MemberViariables 選項卡,選擇 CSCommTestDlg類,為IDC_MSCOM添加控制變量:m_ctrlComm,這時你可以看一看,在對話框頭文件中自動加入了AFX_INCLUDES() #include "mscomm.h" AFX_I

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

6、iables 選項卡,選擇 CSCommTestDlg類, 為 IDC_EDIT_RXDATA添加I CString 變 量 m_strRXData, 為 IDC_EDIT_TXDATA添力口 CString 變量 m_strTXData。說明: m_strRXData 和 m_strTXData 分別 用來放入接收和發(fā)送的字符數(shù)據(jù)。休息一會吧?我們天天與電腦打交道,要注意保重,我現(xiàn)在在單杠上做引體向上可以來 40次,可我都32 了,佩服嗎?好了,再接著來,下面是關(guān)鍵了:5. 添加串口事件消息處理函數(shù) OnComm()打開ClassWizard >Message Maps,選擇類 CSC

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

8、y_inp;LONG len,k;BYTE rxdata2048; / 設(shè)置 BYTE數(shù)組 An 8-bit integerthat is not signed.事件值為2表示接收緩沖區(qū)內(nèi)有字符讀緩沖區(qū)型變量轉(zhuǎn)換為 ColeSafeArray 型變量得到有效數(shù)據(jù)長度轉(zhuǎn)換為BYTE型數(shù)組Cstring型變量字符型將字符送入臨時變量 strtemp存放加入接收編輯框?qū)?yīng)字符串CString strtemp; if(m_ctrlComm.GetCommEvent()=2) /以下你可以根據(jù)自己的通信協(xié)議加入處理代碼 /variant_inp=m_ctrlComm.GetInput(); / safe

9、array_inp=variant_inp; /VARIANT len=safearray_inp.GetOneDimSize(); / for(k=0;k<len;k+) safearray_inp.GetElement (&k,rxdata+k);/for(k=0;k<len;k+) /將數(shù)組轉(zhuǎn)換為BYTE bt=*(char*)(rxdata+k); / strtemp.Format("%c",bt); / m_strRXData+=strtemp; /UpdateData(FALSE); /更新編輯框內(nèi)容到目前為止還不能在接收編輯框中看到數(shù)據(jù),因

10、為我們還沒有打開串口,但運行程序不應(yīng)該有任何錯誤,不然,你 肯定哪兒沒看仔細(xì),因為我是打開VC6對照著做一步寫一行的,運行試試。沒錯吧?那么做下一步:6. 打開串口和設(shè)置串口參數(shù)你可以在你需要的時候打開串口,例如在程序中做一個開始按鈕,在該按鈕的處理函數(shù)中打開串口?,F(xiàn)在我們在主對話框的CSCommTestDlg:OnInitDialog()打開串口,加入如下代碼:/ TODO: Add extra initialization here if(m_ctrlComm.GetPortOpen() m_ctrlComm.SetPortOpen(FALSE);m_ctrlComm.SetCommPor

11、t(1); / 選擇 com1 if( !m_ctrlComm.GetPortOpen() m_ctrlComm.SetPortOpe n( TRUE);/ 打開串口 elseAfxMessageBox("cannot open serial port");m_ctrlComm.SetSettings("9600,n,8,1"); /波特率 9600,無校驗,8 個數(shù)據(jù)位,1 個停止位m_ctrlComm.SetlnputMode(1); /1:表示以二進(jìn)制方式檢取數(shù)據(jù)m_ctrlComm.SetRThreshold(1);/參數(shù)1表示每當(dāng)串口接收緩沖區(qū)

12、中有多于或等于1個字符時將引發(fā)一個接收數(shù)據(jù)的OnCom事件m_ctrlComm.SetlnputLen(0); /設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長度為 0m_ctrlComm.Getlnput();先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)現(xiàn)在你可以試試程序了,將串口線接好后(不會接?去看看我寫的 串口接線基本方法),打開串口調(diào)試助手,并將串口設(shè)在com2,選上自動發(fā)送,也可以等會手動發(fā)送。再執(zhí)行你編寫的程序,接收框里應(yīng)該有數(shù)據(jù)顯示了。7.發(fā)送數(shù)據(jù)先為發(fā)送按鈕添加一個單擊消息即BN_CLICKEDi理函數(shù),打開 ClassWizard - >MessageMaps,選擇類CSCommTestDIg 選擇 IDC_B

13、UTTON_MANUALSEND擊 BN_CLICKED力口 OnButtonManualsend()函數(shù),并在函數(shù)中添 加如下代碼:void CSCommTestDlg:OnButtonManualsend()/ TODO: Add your control notification handler code hereUpdateData (TRUE); / 讀取編輯框內(nèi)容m_ctrlComm.SetOutput(COIeVariant(m_strTXData);發(fā)送數(shù)據(jù)運行程序,在發(fā)送編輯框中隨意輸入點什么,單擊發(fā)送按鈕,啊!看看,在另一端的串口調(diào)試助手(或別的調(diào)試工具)接收框里出現(xiàn)了什么

14、。如果你真是初次涉獵串口編程,又一次成功,那該說聲謝謝我了,因為我第一次做串口程序時可費勁了,那時網(wǎng)上的資料也不好找。開開玩笑,謝謝你的支持,有什么好東西別忘了給我寄一份。最后說明一下,由于用到VC控件,在沒有安裝VC的計算機(jī)上運行時要從 VC中把mscomm32.ocxmsvcrt.dll 、mfc42.dll 拷到 Windows目錄下的System子目錄中(win2000為System32)并再進(jìn)行注冊設(shè)置,請參考如何手工注冊MSCom控件。龔建偉2001.6.20什么是VARIANT數(shù)據(jù)類型?如何使用 VARIANT數(shù)據(jù)類型? 怎么以十六進(jìn)制或二進(jìn)制發(fā)送和接收?如果還想再深入了解,請看

15、:串口調(diào)試助手源程序新書:串口通信編程實踐可以任意轉(zhuǎn)載,但必須注明作者和說明來自及編程詳細(xì)過程(二)作者:龔建偉 2001 825,不得作為商用目次:1. 建立項目2. 在項目中插入 MSCom控件3. 利用ClassWizard 定義CMSCom類控制變量4. 在對話框中添加控件5. 添加串口事件消息處理函數(shù) OnComm()6. 打開和設(shè)置串口參數(shù)7. 發(fā)送數(shù)據(jù)8. 發(fā)送十六進(jìn)制字符9. 在接收框中以十六進(jìn)制顯示10. 如何設(shè)置自動發(fā)送11. 什么是VARIANT數(shù)據(jù)類型?如何使用 VARIANT數(shù)據(jù)類型?這是串口調(diào)試助手源程序及編程詳細(xì)過程(一)的續(xù)篇,首先謝謝朋友們的支持與鼓勵。其添加

16、控制變量:m_ctrlHexSend ;在ClassView中為SCommTestDIg類添加以下兩個 PUBLIC成員函數(shù),并輸入相應(yīng)代碼/由于這個轉(zhuǎn)換函數(shù)的格式限制,在發(fā)送框中的十六制字符應(yīng)該每兩個字符之間插入一個空隔/ 女口: A1 23 45 0B 00 29/CByteArray 是一個動態(tài)字節(jié)數(shù)組,可參看MSD幫助int CSCommTestDlg:String2Hex(CString str, CByteArray &senddata)int hexdata,lowhexdata;int hexdatalen=0;int len=str.GetLength();sendd

17、ata.SetSize(len/2);for(int i=0;i<len;)char 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;elsehexdata=hexdata*16+lowhexdata;i+;senddatahexdatalen=(char)hexdata;hexdatale

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

19、9;A'+10;else if(ch>='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.GetC

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

21、進(jìn)制發(fā)送,單擊手動發(fā)送,在串口調(diào)試助手的 接收框中應(yīng)該可以看到 00 01 02 03 A1 CC 了。9.在接收框中以十六進(jìn)制顯示這就容易多了:在主對話框中加入一個復(fù)選接鈕,IDC_CHECK_HEXDISPLAY Caption:十六進(jìn)制顯示,再利用ClassWizard 為其添加控制變量: m_ctrlHexDiaplay 。然后修改 CSCommTestDlg:OnComm(函數(shù):void CSCommTestDlg:OnComm()/ TODO: Add your control notification handler code hereVARIANT variant_inp;CO

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

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

24、; /將字符送入臨時變量strtemp存放m_strRXData+=strtemp; /加入接收編輯框?qū)?yīng)字符串UpdateData(FALSE); / 更新編輯框內(nèi)容測試:在串口調(diào)試助手發(fā)送框中輸入00 01 02 03 A1 CC 等十六進(jìn)制字符,并選上以十六進(jìn)制發(fā)送,單擊手動發(fā)送,在本程序運行后選上以十六進(jìn)制顯示,在串口調(diào)試助手中單擊手動發(fā)送或自動發(fā)送,則在本程序的接收框中應(yīng)該可以看至U 00 01 02 03 A1 CC 了。最簡單的設(shè)定自動發(fā)送周期是用SetTimer()函數(shù),這在數(shù)據(jù)采集中很有用,在控制中指令的傳送也可能用到定時發(fā)送。方法是:在 ClassWizard 中選上 Me

25、ssageMap卡,然后在 Objects IDs 選中 CSCommTestDIg類,再在 Messages 框中選上 WM_TIME消息,單擊 ADD_FUNCTIO加入 void CSCommTestDlg:OnTimer(UINT nIDEvent)函數(shù),這個函數(shù) 是放入“時間到”后要處理的代碼:void CSCommTestDlg:OnTimer(UINT nIDEvent)/ TODO: Add your message handler code here and/or call defaultOnButtonManualsend();CDialog:OnTimer(nIDEven

26、t);再在在主對話框中加入一個復(fù)選接鈕,ID為IDC_CHECK_AUTOSENfiption:自動發(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型變量,在 CLASSVIEV中為CSCommTestDIg類加入

溫馨提示

  • 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

提交評論