版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、VC+串口上位機(jī)簡單例程(源碼及詳細(xì)步驟)串口通信,MCU跟PC通信經(jīng)常用到的一種通信方式,做界面、寫上位機(jī)程序的編程語言、編譯環(huán)境等不少,VB、C#、LABVIEW 等等,我會(huì)的語言很少,C語言用得比較多,但是還沒有找到如何用 C語言來寫串口通信上位機(jī)程序的資料,在圖書管理找到了用 VC+編寫串口上位機(jī)的資料,參考書籍,用自己相當(dāng)蹩腳的C+寫出了一個(gè)簡單的串口上位機(jī)程序,分享一下,體驗(yàn)一下單片機(jī)和PC通信的樂趣。編譯環(huán)境:VC+6.0操作系統(tǒng):VMWare虛擬出來的Windows XP程序?qū)崿F(xiàn)功能:1、PC初始化COM1 口,使用n81方式,波特率57600與單片機(jī)通信。PC的COM 口編號(hào)
2、可 以通過如下方式修改:-片W zw *9 嫗rnqtinni -JLf-回凸di if固 JrJrS-* tji IH ATVP44T:g 爲(wèi)-5 «714口APJ打印甌口 MTl i J ZB call JCW* itlfl-* LaaiE 冠-當(dāng)然也可以通過上位機(jī)軟件編寫,通過按鈕來選擇COM端口號(hào),但是此次僅僅是簡單的例程,就沒有弄那么復(fù)雜了。COM1 口可用的話,會(huì)提示串口初始化完畢。否則會(huì)提示串口已經(jīng)打開Port already open,表示串口已經(jīng)打開,被占用了。2、點(diǎn)擊開始轉(zhuǎn)換,串口會(huì)向單片機(jī)發(fā)送0xaa,單片機(jī)串口中斷接收到 0xaa后啟動(dòng)ADC轉(zhuǎn)換一次,并把轉(zhuǎn)換
3、結(jié)果 ADCL、ADCH共兩個(gè)字節(jié)的結(jié)果發(fā)送至 PC,PC進(jìn)行數(shù)值轉(zhuǎn)換后在 窗口里顯示。(見文章末尾圖)3、為防止串口被一只占用,點(diǎn)擊關(guān)閉串口可以關(guān)閉 COM1,供其它程序使用,點(diǎn)擊后按鈕變?yōu)榇蜷_串口,點(diǎn)擊可重新打開COM1。程序的編寫:1、 打開VC+6.0建立基于對話框的 MFC應(yīng)用程序Test,工程名稱(HI:位置Gl:|z刑CH串口上往梔I亡耐-創(chuàng)建新的工作空閭文件Tffi |工作區(qū)|其它文檔| ATLCOM AppWizariiCluBlrr Resource Type Wiiard TlCusWff) AppWizardDa1ab»sc Praject DevSfudta
4、 Add in Wizard Extt nderi Stored Proc Wi?Hrd filSAPI Exlens ion WizardMakefilejMFC AtliveX CnntfolWizaid 旬 MFC AppWiztrd |dlljsNew Dalabssr Wizard 科 Uliltty Project alWin3? Application Win3?ApplkniivuWin32 DynarniLink Libiary 3Win32 Stetic L ibraryV Win32您爰創(chuàng)建的應(yīng)用程序類型是:FC應(yīng)用程序向?qū)?步驟廠單文檔圖 廣多重文檔(MJ 涇基本對話框
5、叵j?P立欄癥£盲嚇糸結(jié)刊克持¥您的資源使用的語言是:I 申文1中國APPWZCHS.dIZjHFC應(yīng)用程序向?qū)?步驟2共4步您是否希望包含:廠“關(guān)于“對話框廠上下文相關(guān)幫助V 3D外觀您希望包含什么其他支持?廠自動(dòng)操作凹0 ActiveX控件回您希望包含WOSA支持嗎?廠 Windows Sockets (W|對話框的標(biāo)題是:|test您喜歡的風(fēng)格是:Microsoft Develcyer StudiornrrniwMIFC應(yīng)用程序向?qū)?步驟3共4步a MFC'WIr Windows資源管理器樣式您希望生成源文件備注嗎?a 是 Cx3您希望使用MFC,辛嗎?G作為
6、共享的DLL作為靜態(tài)的DLLFC應(yīng)用程序向?qū)?步驟&共克步類名型頭文件:CTestApptest.h基類:執(zhí)行文件:CWinApptest.cpi:上一歩|下 步完成2、 在項(xiàng)目中插入 MSComm 控件:工程-增加到工程-Components and Controls-雙擊 Registered ActiveX Controls- 選擇 Microsoft Communications Control, version 6.0-lnsert ,按 默認(rèn)值添加,你會(huì)發(fā)現(xiàn)多了個(gè)電話圖標(biāo),這是增加后串口通信控件。插入 工程世)組建1工具 窗口血 幫助設(shè)置活動(dòng)工程電)増加到工程I cl&am
7、p;SS FSource Control新逹卜匕 新建文件夾冊)te st從屬性設(shè)導(dǎo)出制作文件Alt+F7fjjiComtonents and Controls,.插入工程到工作空間(I).Components and Controls Gallery選擇要插入到工程的組件直扶苑圍(X): _ Xegi star ed ActiveX Cantr &ls :3 空亡駁 Microsoft AnirEiati on Control, version 5- 0 (S?2)icrasoft Common Dial。耳 CaRtrol, version 6. 0 (STB)Microsoft
8、Communi cations Controij version 6,0fNicroEof t EitaCombo Control, vers ion 6. 0 (OLEEE ) Nicr&soft. EataGrid Control &. 0 CSF6) (OLEEB) Microsof t EAtaLi st Control, version 5. 0 (OLEDBDcr«7 Mi cr<ffilllicriMi cr<cr<Mi cr(文件名 ) : |Mi crosoft Commuiti cati ons Control, vrsiInse
9、rtMicrosoft Comm Control 6.0膻abl口®函冒一一嚎矗日団匹 再禺C3IX國圈豐圍3*-fficlsl3、刪除確認(rèn)、取消和提示框,添加電話”進(jìn)程、靜態(tài)文本、按鈕、編輯框,拖動(dòng)添加的控件,根據(jù)喜好布局。控件B4、右擊編輯框Edit選擇屬性,在樣式里設(shè)置,勾選多行、垂直滾動(dòng),其它可按默認(rèn)值。 右擊靜態(tài)文本Text選擇屬性,在常規(guī)設(shè)置里,修改標(biāo)題。右擊按鈕PushButton選擇屬性,在在常規(guī)設(shè)置里,修改標(biāo)題。修改后界面如下,程序?qū)懗鰜磉\(yùn)行時(shí)電話”標(biāo)志會(huì)自動(dòng)消失。Aft abl OF 9 ® S 血a $畫EH 1= a H 魚園 ffi e5、查看-&
10、gt;建立類向?qū)?MFC ClassWizard->Member Viariable,選擇 ClassName 為 CTestDIg 的類,Control ID為MSC0MM1,雙擊它,為它添加控制變量m_comm1。類似的,選擇IDC_BUTT0N2添加控制變量 m_serial。(建立類向?qū)б部梢杂覔羧缓笤趶棾龅目旖莶藛卫镞x擇建立類向?qū)В〧C ClassiMe&sagt Maps Member Variables | Aulomation | AcIrveX Events | Class Info | Projcd:Class name:| lestcTeslDIg;Cont
11、rol IDs:TypeMemberZX-Vest1estDlg.h, ZA.-VsttestDlg,cppMessage Maps Member VriabJes Automation | ActiveX Events | Class InloProject:Class name:testT CTeslDIgZ:V*AtesttestDlg,h, Z:VAtes(teslDtgxpipConlrol IDs:TypeMemberIDCBUTTON】IDCHUTTON2CButtonm serial1IDCEDIT3IOCMSCOMM1CMSCornmm_cornm1IDCPROGRESSl(
12、組建-> 全部組件,然至此,基本框架已經(jīng)出來了,編譯后運(yùn)行可以看到如下所示的界面。 后組建-> 執(zhí)行)|5f li開始轉(zhuǎn)換打開串口民li打開串口6、點(diǎn)擊左側(cè)的視圖窗口,可以在三種模式下切換,第三個(gè)是打開我們的源代碼窗口, 個(gè)是類,第二個(gè)是窗體的資源視圖。兇 test n選擇File View,展開test files->Header Files,打開testDIg.h,在全局變量下添加如下代碼,然 后保存:int gllen;定義整型標(biāo)量gllen,用于記錄接收數(shù)據(jù)的個(gè)數(shù)CProgressCtrl * pbar; /指向進(jìn)度條的指針,用于操作進(jìn)度條CString
13、strRXDdata; /編輯框顯示的文本,記錄歷次轉(zhuǎn)換值/ Constructionpublic:CTestDlgtCWnC* pPrent - NULL); / standard constructorint gllen;"定義整型標(biāo)量gllen.用于記移收數(shù)據(jù)的個(gè)數(shù)CProgressCtrl pbar;"拒冋逬扈條的搟針,用壬理隹迸廢憊string strRXDdata; "編輯簽示的支笨.垃隸蔚次蒔誓鷹/ H H HV «« »»»!補(bǔ) " ««»«
14、1;«« 耳1(11:鼻«!«»*««« W« H »»»/ Dialog Data/AFX DATA(ClpstDlq)enun 7e>D - 10D TEST DIALOG ):C8utton n serial;7、點(diǎn)擊 Recourse View,展開 test recourses->Dialog,雙擊 IDD_TEST_DIALOG ,編輯我們 的主界面對話框。雙擊擊電話”彈出如下對話框,按確認(rèn)鍵:Add Member FuiiGtion|P|OnComm
15、MscommlMember function name:CancelMessage: OnCommObject ID: IDC_MSCOMM1VC會(huì)進(jìn)入源碼編輯窗口,這個(gè)函數(shù)是用來處理串口事件的,當(dāng)PC串口接收到數(shù)據(jù)時(shí),會(huì)產(chǎn)生一個(gè)數(shù)據(jù)緩沖區(qū)有數(shù)據(jù)的消息事件,然后調(diào)用執(zhí)行這個(gè)函數(shù)。添加如下代碼,進(jìn)行數(shù)據(jù)處理,窗口更新等操作:VARIANT variant1;定義VARIANT型變量,用于存放接收到的數(shù)據(jù)COleSafeArray safearray;/ 定義 safearray 型變量LONG len,k;定義長整型變量 len,kBYTE rxdata2048; 定義 BYTE 型數(shù)組CStr
16、ing stremp1,stremp2; 定義兩個(gè)字符串if(m_comm1.GetCommEve nt()=2)/ 判斷引起 On Comm 時(shí)間的原因/如果是接收到特定個(gè)字節(jié)數(shù),則讀取接收到的數(shù)據(jù)variant1 = m_comm1.GetInput();把接收到的數(shù)據(jù)存放到VARIANT型變量里safearray = variant1;/V ARIANT 型變量轉(zhuǎn)換為 ColeSafeArray 型變量 len = safearray.GetOn eDimSize();for(k=0;k<le n;k+)safearray.GetElement(&k,rxdata+k);
17、/ 得到接接收到的數(shù)據(jù)放到BYTE 型數(shù)組 rxdata 里for(k=0;k<le n;k+)BYTE bt = (*(unsigned char*)(rxdata+k); / 讀取 AD 轉(zhuǎn)換的高字節(jié)if(k%2)=0)if(k+1)<le n)gllen+;全局的變量,對接收到的轉(zhuǎn)換結(jié)果的個(gè)數(shù)進(jìn)行計(jì)算stremp2.Format("第%d次轉(zhuǎn)換結(jié)果:",gllen);顯示第幾次轉(zhuǎn)換int temp = bt*4+(*(u nsig ned char *)(rxdata+k+1)>>6); /高低字節(jié)合并成實(shí)際的轉(zhuǎn)換結(jié)果,注意轉(zhuǎn)換結(jié)果是左對齊st
18、remp1.Format("%2.2f",(2.56*temp/1024); 計(jì)算成實(shí)際電壓值SetDlgItemText(IDC_STATIC,("當(dāng)前電壓值為:"+stremp1+" V"); / 更新靜態(tài)文本控件pbar -> SetPos(temp);/更新進(jìn)度條的當(dāng)前位置strRXDdata += stremp2;把新的數(shù)據(jù)放到全局的字符串里strRXDdata += stremp1;strRXDdata += " Vrn" 字符串加單位 V后換行SetDlgltemText(IDC_EDIT1,s
19、trRXDdata); 更新文本控件的顯示uoidl CTrst D>lq:DnDnCoMHscofWil ()/ TDDDi Add yicur control natirltdtiiCHn handL«ia CDdFUAH I AHI vdrUnt 1 ;COlPSdfffirrjyLONGBVTECStrinq £trnpl4strRfi2; if coniI elC>oiMiLu?rit()-?>":uAHiflingw*厝F存放接收到的樹蚪 / :Eft/T . 卜豐謁串varljirit 1 fh> CQimli .EeU np
20、ul:(); sifrjrriigi u.iri"割辭弓庭oncoT間的匣因M戀電捋J巧峙;炸"優(yōu)L注平! "把妾收赧刮異§ "UHfUAHT型査*轉(zhuǎn)換左Ct)】 MdFl說rl©Mt"" 即;i叮fl賞別刖皿£試如XE2里nr(*f0;k<lrri ;k*)bvte bt chr丄*k) y/j -fl Di < r- ?'-這時(shí)重新編譯一下,看會(huì)不會(huì)有什么錯(cuò)誤,出現(xiàn)下面提示,可以選擇全部組建來清除。LINK : LNK4073: cann ot create map for .IL
21、K file; lin ki ng nonin creme ntally 出現(xiàn)下面錯(cuò)誤,請關(guān)閉運(yùn)行的test.exe后重試。LINK : fatal error LNK1104: cannot open file "Debug/test.exe"出現(xiàn)下面錯(cuò)誤兩種錯(cuò)誤,是由于空間編號(hào)問題引起的,當(dāng)我們添加了編輯框或者電話”后再添加,其編號(hào)自動(dòng)加一,就會(huì)出現(xiàn)控件沒定義。Z:vc+ 串口上位機(jī) testtestDlg.cpp(32) : error C2065: 'IDC_MSC0MM1' : undeclared identifier Z:vc+ 串口上位機(jī) t
22、esttestDlg.cpp(139) : error C2065: 'IDC_EDIT1' : undeclared identifier 解決方法是,在 RecourseView里,打開窗體IDD_TEST_DIALOG ,右擊 電話”或者編輯框 等其它出錯(cuò)的控件,右擊選擇屬性,在常規(guī)里修改ID,這里的程序,除 BUTTON有1、2兩個(gè)之外,其它都是1P可見圖己禁用回廠組IS麗制表站回全部組建編譯一下,看看有沒有錯(cuò)誤,沒有錯(cuò)誤就可以運(yùn)行一下,可以看到界面更原來是,li crvs?ft CoBBuai cati o&s Conlrolj蟲繆常規(guī)GeneralBuffe
23、rs |D: |iDC_MSC0MM1樣的。有錯(cuò)誤就修改一下,省得弄多了,錯(cuò)在哪里都不知道,查起來麻煩。8、在源碼編輯里,打開testDlg.cpp文件,進(jìn)行窗口初始化函數(shù)的編寫。找到 BOOL CTestDlg:OnlnitDialog()函數(shù),在 SetIcon(m_hlcon, FALSE);/ Set small icon/ TODO: Add extra ini tialization here后面添加如下初始化代碼:gllen = 0; /記錄轉(zhuǎn)換次數(shù)全局變量清零if(! m_comm1.GetPortOpen() 判斷串口是否已經(jīng)打開m_comm1.SetCommPort(1);
24、 / 選擇串口號(hào) 1m_comm1.SetPortOpen(TRUE); / 打開串口m_comm1.SetRThreshold(2); / 收到兩個(gè)字節(jié)引發(fā) On Comm 事件 m_comm1.SetInputMode(1); 輸入模式選為二進(jìn)制m_comm1.SetSetti ngs("57600, n,8,1"); 設(shè)置串口參數(shù),波特率 57600,無奇偶校驗(yàn),1位停止 位,8位數(shù)據(jù)位MessageBox("串口初始化完畢",”提示");/提示串口成功初始化else MessageBox("串口被占用","
25、提示");/如果已經(jīng)打開串口,消息框提醒pbar = (CProgressCtrl*)GetDlgltem(IDC_PROGRESS1); 獲得指向 IDC_PROGRESS1 的指針 pbar -> SetRa nge(0,1023); 設(shè)置進(jìn)度條的范圍 01023pbar -> SetPos(O);/當(dāng)前位置為 0m_serial.SetWindowText(”關(guān)閉串口 ");/按鈕顯示狀態(tài)改變ff lnOH; rtrJjl fxI rd ini t bi L i tn hrrrgllen 0;lF(f n com,EetPartop*n(><“
26、576C率n-h制r羽我希引二M1-十仁功 號(hào)?謹(jǐn)參成 口口卒式口口到A© -.£.聶i? / /口皿圈吏 開的尬壬 打W蕖齒優(yōu) 好局淹賈事 已翼 $:一禎 / / / / /HCDnnl.SetCDnrrfDrttl); ncoiwil £tPDrl:Oppn(TftUE); n cgiwki fe$etft1hreshold (2 >h_£qiw<i1 nputiNodrfl):ncoml .SvtSptting&tAOe.n.S甲匸;HessigpBox串口初姑化死畢”、“探示” 1 ; ?1m Hpssjge>(
27、7;c<h*$口袖占用"J嘔示"X pbjr -11:葉0亍錚1;葉1)Ept»lg t»M I DC_PR4E«ESS1);pb*F -> SetRdng?(t«1023);pbar -> tPt>M D>;_»riM .SttWndoiHKt(關(guān)宙串 口 "可以看到,串口的參數(shù)等等都在在這里初始化的,可以根據(jù)自己的需要修改的,具體可以查看VC+里的詳細(xì)介紹,看看有哪些參數(shù)可以給我們修改來用。添加后再編譯一下,運(yùn)行后可以看到多了一個(gè)串口初始化的提示信息窗口。 至此,我們已經(jīng)完成了主要
28、的串口操作及界面,剩下的就是兩個(gè)按鈕的操作了。9、回到資源視圖的IDD_TEST_DIALOG 窗口,雙擊開始轉(zhuǎn)換按鈕,給它添加事件,點(diǎn)擊 后PC通過串口發(fā)送Oxaa出來,給單片機(jī)接收。添加如下代碼:CByteArray m_Array; / 定義字節(jié)數(shù)組 m_Array.RemoveAII(); / 字節(jié)數(shù)組清空 m_Array.SetSize(1); / 設(shè)定維數(shù)為 1 m_Array.SetAt(0,0xaa); / 給 m_arrayO賦值 0 m_comm1.SetOutput(COIeV ariant(m_Array); 由于 SetOutput 函數(shù)的參數(shù)為 VARIANT 型,
29、必 須強(qiáng)制轉(zhuǎn)換后才能發(fā)送uold Cf:DnButtonli ()</ IODO: Add j/our control not iFicat i<in handlerhere/*»»*»*»*»<*»*»*>»*»*CBteArra n Array;"宅義宇節(jié)數(shù)組.Renoueftllf ;丿/字誤報(bào)殂清空n_Array ,SetSize( 1);"設(shè)定堆數(shù)方Ti* Arry.Setfttf 叫馭ao);館r coRinl SetOutputf COleUariantfm Rrra>):Set Out puWsJ數(shù)的券數(shù) 為 UfN ! -H H M-« » * N< N H 41 H i « M H H同樣地,雙擊另外一個(gè)按鈕,給串口操作按鈕添加代碼,用于關(guān)閉或者打開串口。添加如下代碼:if(! m_comm1.GetPortOpen() 判斷串口是否已經(jīng)打開
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 整體課程設(shè)計(jì)幾部分
- 素描頭像課程設(shè)計(jì)
- 物流網(wǎng)站建設(shè)課程設(shè)計(jì)
- 線上運(yùn)營課程設(shè)計(jì)
- 童話故事校本課程設(shè)計(jì)
- 烘培原料課程設(shè)計(jì)
- 深度學(xué)習(xí)技術(shù)在智能出行中的研究方向考核試卷
- 電光源在紫外固化中的應(yīng)用考核試卷
- 電氣安裝隧道照明設(shè)計(jì)考核試卷
- 皮革制品行業(yè)的市場競爭力分析與前景預(yù)測考核試卷
- 肝膿腫健康宣教
- 少先隊(duì)大隊(duì)輔導(dǎo)員勝任力模型研究
- 人才隊(duì)伍建設(shè)實(shí)施方案
- 德欽縣云嶺鄉(xiāng)、佛山鄉(xiāng)部分村落生活垃圾處置工程環(huán)評報(bào)告
- 積極心理學(xué)治療手冊
- 制冷車間及冷庫日常隱患排查表
- 寒假安全教育主題班會(huì)PPT-
- (完整版)聚乙烯課件
- 產(chǎn)品4五子衍宗丸
- 獨(dú)一味(正式稿2)
- 山西太原晉陽湖總體規(guī)劃城市設(shè)計(jì)景觀方案文本
評論
0/150
提交評論