串口調(diào)試助手C開發(fā)概要_第1頁
串口調(diào)試助手C開發(fā)概要_第2頁
串口調(diào)試助手C開發(fā)概要_第3頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1建立項(xiàng)目:打開VC+6.0,建立一個(gè)基于對(duì)話框的MFC應(yīng)用程序 SCommTest (與我源代碼一致,等會(huì)你會(huì)方便一點(diǎn));2在項(xiàng)目中插入MSComm控件選擇Project菜單下Add To Project子菜單中的 Components and Controls選項(xiàng),在彈出的對(duì)話框中雙擊Registered ActiveX Controls項(xiàng)(稍等一會(huì),這個(gè)過程較慢),則所有注冊(cè)過的 ActiveX控件出現(xiàn)在列表框中。 選擇Microsoft Communications Control, version 6. 0,單擊Insert按鈕將它插入到我們的Project 中來,接受缺省的選項(xiàng)。(

2、如果你在控件列表中看不到Microsoft Communications Control, version 6. 0,那可能是你在安裝 VC6 時(shí)沒有 把ActiveX項(xiàng)選上,重新安裝VC6,選上ActiveX就可以了),這時(shí)在ClassView視窗中就可以看到CMSComm類了,(注 意:此類在ClassWizard中看不到,重構(gòu)clw文件也一樣),并且在控件 工具欄Controls中出現(xiàn)了電話圖標(biāo)(如圖1所示),現(xiàn)在要做的是用鼠 標(biāo)將此圖標(biāo)拖到對(duì)話框中,程序運(yùn)行后,這個(gè)圖標(biāo)是看不到的。3利用ClassWizard定義CMSComm類控制對(duì)象打開 ClassWizard >Member

3、 Viariables 選項(xiàng)卡,選擇 CSCommTestDlg 類,為 IDC_MSCOMM1 添加控制變量:m_ctrlComm,這時(shí) 你可以看一看,石對(duì)話框頭文件中自動(dòng)加入了 /AFX_INCLUDES( ttinclude "mscornm. h / AFX_INCLUDES (這時(shí)運(yùn) 行程序,如果有錯(cuò),那就再從頭開始)。4 在對(duì)話框中添加控件向主對(duì)話框中添加兩個(gè)編輯框,一個(gè)用于接收顯示數(shù)據(jù)ID 為IDC_EDIT_RXDATA ,另一個(gè)用于輸入發(fā)送數(shù)據(jù),ID為 IDC_EDIT_TXDATA,再添加一個(gè)按鈕,功能是按一次就把發(fā)送編輯框 中的內(nèi)容發(fā)送一次,將其ID設(shè)為IDC_

4、BUTTON_!ANUALSENDo別忘記了將 接收編輯框的 Properties->Styles 中牠 Miltiline 和 Vertical Scroll 屬性 選上,發(fā)送編輯框若你想輸入多行文字,也可選上Miltilineo再打開 ClassWizard>Member Viariables 選項(xiàng)卡,選擇 CSCommTestDlg 類, 為 IDC_EDIT_RXDATA 添力口 CString 變量 m_strRXData, 為 IDC_EDIT_TXDATA 添加 CString 變量 m_strTXData。說明:m_strRXData 和m_strTXData分別用

5、來放入接收和發(fā)送的字符數(shù)據(jù)。5添加串口事件消息處理函數(shù)OnComm(打開 ClassWizard >Message Maps ,選擇類 CSCommTestDlg,選擇IDC_MSCOMM1,雙擊消息OnComm,將彈出的對(duì)話框 中將函數(shù)名改為OnComm,(好記而已)0K。這個(gè)函數(shù)是用來處理串口消息事件的,如每當(dāng)串口接收 到數(shù)據(jù),就會(huì)產(chǎn)生一個(gè)串口接收數(shù)據(jù)緩沖區(qū)中有字符的消息事件,我們剛 才添加的函數(shù)就會(huì)執(zhí)行,我們?cè)贠nComm(函數(shù)加入相應(yīng)的處理代碼就能實(shí) 現(xiàn)自已想要的功能了。請(qǐng)你在函數(shù)中加入如下代碼:(注意編程規(guī)范)voidCSCommTestDlg::OnComm(/ TODO:

6、Add your control notification handler code hereVARIANTvariant_inp;COleSafeArraysafearray_inp;LONGlen,k;BYTE rxdata2048; /設(shè)置 BYTE 數(shù)組 An 8bit integerthat isnotsigned if (m_ctrlComm. GetCommEvent (二二 2 /事件值為 2 表示接收緩 沖區(qū)內(nèi)有字符/以下你可以根據(jù)自己的通信協(xié)議加入處理代碼緩variant_inp 二 m_ctrlCommGetInput(; 沖讀區(qū)safearray_inp=variant

7、_inp;/VARIANT型 變 量轉(zhuǎn)換 為ColeSafeArray型變量len二 safearray.inp GetOneDimSize(;/得到有效s據(jù)長(zhǎng)度for (k二0;k<len;k+safearray_inp GetElement(&k, rxdata+k;/轉(zhuǎn)換為BYTE型數(shù)組for(k = 0;k < len;k+ /將數(shù)組轉(zhuǎn)換為 Cstring 型變 量BYTE bt 二 *(char* (rxdata+k;/字型strtemp. Formatbt;/將字符送入臨時(shí)變量 strtemp 存放strtemp;m_strRXData/加入接收編輯框?qū)?yīng)字符串

8、UpdateData(FALSE; 更新編輯框內(nèi)容(主要是接收編輯框中 的)到目前為止還不能在接收編輯框中看到數(shù)據(jù),因?yàn)槲覀冞€ 沒有打開串口,但運(yùn)行程序不應(yīng)該有任何錯(cuò)誤,不然,你肯定哪兒沒看仔 細(xì),因?yàn)槲沂谴蜷_VC6對(duì)照著做一步 -行的,運(yùn)行試試。沒錯(cuò)吧?那么 做下一步:6打開串口和設(shè)置串口參數(shù)你可以在你需要的時(shí)候打開串口,例如在程序中做一個(gè)開 始按鈕,在該按鈕的處理函數(shù)中打開串口?,F(xiàn)在我們?cè)谥鲗?duì)話框的 CSCommTestDlg: :OnInitDialog(開串 I I,加入如卜-代碼:/ TODO: Add extra initialization hereif(m_ctrlComm.

9、GetPortOpen(m_ctrlComm. SetPortOpen(FALSE;m_ctrlComm. SetCommPort (4; /選擇 com4 我用的是筆記本 用 了個(gè) USB 環(huán) 串 口 的, 所 以 是 端 口 4if!m_ctrlComm. GetPortOpen(m_ctrlComm. SetPortOpen(TRUE;/ 打 開 串 口elseAfxMessageBox("cannotopen serialPort"m_ctrlComm SetSettings(“9600, n, 8, 1" 8個(gè)數(shù)據(jù)位,1個(gè)停止位m_ctrlComm Se

10、tlnputMode(1;衣 示 以 二 進(jìn) 制 方/波特率9600,無校驗(yàn),/I:式 檢 取 數(shù) 據(jù)參數(shù)1表示每當(dāng)串口接收緩沖區(qū)中有多于或等于1個(gè)字符時(shí)將引發(fā)一個(gè) 接 收 數(shù) 據(jù) 的OnComm事 件m_ctrlComm SetRThreshold(l;m_ctrlComm. SetInputLen(O; /設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長(zhǎng)度為0m_ctrlComm. Get Input (;/先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)7 發(fā)送數(shù)據(jù)先為發(fā)送按鈕添加一個(gè)單擊消息即BN_CLICKED處理函數(shù), 打 JF ClassWizard >Message Maps ,選擇類 CSCommTestDlg ,選擇

11、IDC_BUTTON_MANUALSEND,雙擊 BN_CLICKED 添加 OnButton血nualsend(函 數(shù),并在函藪中添加如下代碼:/此函數(shù)實(shí)現(xiàn)的就是串口的發(fā)送數(shù)據(jù)voidCSCommTestDlg:OnButtonManualsend(/ TODO: Add your control notification handler code hereUpdateData(TRUE;讀 取 編 輯 框 內(nèi) 容m_ctrlComm. SetOutput (COleVariant (m_strTXData; /發(fā)送 數(shù)_據(jù)運(yùn)行程序,在發(fā)送編輯框中隨意輸入點(diǎn)什么,單擊發(fā)送按 鈕,啊!看看,在

12、和本機(jī)電腦用串口相連的另一電腦的串口調(diào)試助手接 收框里就出現(xiàn)了所發(fā)送的數(shù)據(jù)。當(dāng)然也可以接收另外一臺(tái)電腦發(fā)送過來的 數(shù)據(jù)。這是在前面的CSCommTestDlg: :0nComm(函數(shù)里頭實(shí)現(xiàn)的。8.發(fā)送十六進(jìn)制字符在主對(duì)話框中加入一個(gè)復(fù)選接鈕,ID為IDC_CHECK_HEXSEND Caption:十六進(jìn)制發(fā)送,再利用ClassWizard為其添加控制變量: m_ctrlHexSend;在ClassView中為SCommTestDlg類添加以下兩個(gè)PUBLIC成員函 數(shù),并輸入相應(yīng)代碼;由于這個(gè)轉(zhuǎn)換函數(shù)的格式限制,在發(fā)送框中的十六制字符應(yīng)該每?jī)蓚€(gè)字 符 之 間 插 入 一 個(gè) 空 隔/ 如

13、:A12345 0B 0029CByteArray是一個(gè)動(dòng)態(tài)字節(jié)數(shù)組MSDNinthexdata, lowhexdata;inthexdatalenintlen=senddata. SetSize (len二0;str GetLength(;/2;for(inti0;i<len;char lstr, hstrif (hstrstrEi;continue;由于這個(gè)轉(zhuǎn)換函數(shù)的格式限制,在發(fā)送框中的十六制字符應(yīng)該每?jī)蓚€(gè)字符之間插入一個(gè)空隔/如:A123450B0029/CByteArray 是一個(gè)動(dòng)態(tài):字節(jié)數(shù)組,可參看MSDNint CSCommTestDlg::String2Hex(CStr

14、ing str,CByteArray &senddataif (i二len break;lstrstrtil;hexdataConvertHexChar(hstr;lowhexdataConvertHexChar(lstr;if (hexdata = 16(lowhexdata = 16break;elsehexdata=hexdata*16+lowhexdata; i+; senddatahexdatalen二(charhexdata; hexdatalen+; senddata SetSize (hexdatalen; returnhexdatalen;/這是一個(gè)將字符轉(zhuǎn)換為相應(yīng)的

15、十六進(jìn)制值的函數(shù)好多 c 語言書上都可以找到/功能:若是在0-F之間的字符,則轉(zhuǎn)換為相應(yīng)的十六進(jìn)制字符,否則返 回-1charCSCommTestDlg:ConvertHexChar (charchif(ch>= 0'&&(chV9returnch0x30;elseif(ch>= A'&&(chV FreturnchN *10;else(ch>a &&(ch二'freturnch_,a *10;elsereturn(-1;再將 CSCommTestDlg: :OnButtonManualsend(修改成以

16、下形式:voidCSCommTestDlg::OnButtonManualsend(/ TODO: Add your control notification handler code hereUpdateData(TRUE; /讀取編輯框內(nèi)容if(m_ctrlHexSend. GetCheck(CByteArrayhexdata;int len=String2Hex(m_strTXData, hexdata; / 此 處返回 的 len可以用于計(jì)算腹送了多少個(gè)十六進(jìn)制數(shù)m_ctrlComm. SetOutput (COleVariant (hexdata; /發(fā)送十六 進(jìn)一制數(shù)據(jù)elsem_

17、ctrlComm. SetOutput (COleVariant (m_strTXData;/發(fā)送 ASCII 字 一符數(shù)據(jù)現(xiàn)在,你先將串口線接好并打開串口調(diào)試助手V2.1,選上以 十六制顯示,設(shè)置好相應(yīng)串口,然后運(yùn)行我們這個(gè)程序,在發(fā)送框中輸入00 01 02 03 Al CC等十六進(jìn)制字符,并選上以十六進(jìn)制發(fā)送,單擊手動(dòng) 發(fā)送,在串口調(diào)試助手的接收框中應(yīng)該可以看到00 01 02 03 Al CC To9在接收框中以十六進(jìn)制顯示這就容易多了:在主對(duì)話字中加入一個(gè)復(fù)選接鈕,IDC_CHECK_HEXDISPLAY Caption:十六進(jìn)制顯示,再利用 ClassWizard 為 其添加控制變

18、量:m_ctrlHexDiaplay 一, 然后修改 CSCommTestDlg::OnComm(函數(shù):BYTE bt=* (char*(rxdata+k; /字符型在OnComm (函數(shù)這條語句的后血加入如下代碼:if(m_ctrlHexDisplay. GetCheck(strtemp. Format ("%02X ", bt; /將分:符以I六進(jìn)制方式送入臨時(shí)變I strtemp 存放,';I-這里加I入一個(gè)空隔elsestrtemp. Format (,%c,z, bt; /將字符送入臨吋變暈 strtemp 存放測(cè)試:合串口調(diào)試助發(fā)送柜中輸入00 01 0

19、2 03 Al CC 等十六進(jìn)制字符,并選上以十六進(jìn)制發(fā)送,單擊手動(dòng)發(fā)送,在木程序運(yùn)行 后選上以十六進(jìn)制顯示,在串口調(diào)試助手中單擊手動(dòng)發(fā)送或自動(dòng)發(fā)送,則 在木程序的接收框中應(yīng)該可以看到00 01 02 03 Al CC10 如何設(shè)置自動(dòng)發(fā)送最簡(jiǎn)單的設(shè)定門動(dòng)發(fā)送周期是用SetTimer(PK|數(shù),這在數(shù)據(jù)釆 集中很有用,在控制中指令的傳送也可能用到定時(shí)發(fā)送。方法是:fl: ClassWizard 1|'選上 MessageMap k,然hi在 Objects IDs 選'11 CSCommTestDlg 類,仲在 Messages i 中選WM_TIMER 消息,單 ADD_FU

20、NCTION 加入 void CSCommTestDlg:OnTimer (UINT nIDEvent 函 數(shù),這個(gè)函數(shù)是放入“時(shí)間到”后要處理的代碼:voidCSCommTestDlg::OnTimer(UINTnIDEvent/ TODO: Add your message handler code here and/or call defaultOnBu11 onManua1s end(CDialog::OnT imer(nIDEvent;再在在主對(duì)話框中加入一個(gè)復(fù)選接鈕,ID為IDC_CHECK_AUTOSEND Caption:自動(dòng)發(fā)送(周期1秒),再利用ClassWizard為其添

21、加 BN_CLICK 消息處理函數(shù) void CSCommTestDlg: :OnCheckAutosend(:voidCSCommTestDlg:OnCheckAutosend(/ TODO: Add your control notification handler code herem_bAutoSend=!m_bAutoSend;if(m_bAutoSendSetTimer(l, 1000, NULL;/ 時(shí) 間 為 1000 毫 秒elseKillTimerd;/取消其中:m_bAutoSend 為 BOOL 型變量,在 CLASSVIEW 中為 CSCommTestDlg 類加入,并在構(gòu)造函數(shù)中初始化:m_bAutoSen=FALSE;現(xiàn)在可以運(yùn)行程序測(cè)試了。11.什么是VARIANT數(shù)據(jù)類型?如何使用VARIANT數(shù)據(jù)類型?不知如何使用VARIANT數(shù)據(jù)類型,有不少朋友對(duì)VARIANT這個(gè) 新的數(shù)據(jù)類型大感頭疼。SetOutput (函數(shù)中需要

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論