VC串口上位機編程實例_第1頁
VC串口上位機編程實例_第2頁
VC串口上位機編程實例_第3頁
VC串口上位機編程實例_第4頁
VC串口上位機編程實例_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、VC+串口上位機簡單例程(源碼及詳細步驟)串口通信,MCU跟PC通信經常用到的一種通信方式,做界面、寫上位機程序的編程語言、編譯環(huán)境等不少,VB、C#、LABVIEW 等等,我會的語言很少,C語言用得比較多,但是還沒有找到如何用 C語言來寫串口通信上位機程序的資料,在圖書管理找到了用 VC+編寫串口上位機的資料,參考書籍,用自己相當蹩腳的C+寫出了一個簡單的串口上位機程序,分享一下,體驗一下單片機和PC通信的樂趣。編譯環(huán)境:VC+6.0操作系統:VMWare虛擬出來的Windows XP程序實現功能:1、PC初始化COM1 口,使用n81方式,波特率57600與單片機通信。PC的COM 口編號

2、可 以通過如下方式修改:-片W zw *9 嫗rnqtinni -JLf-回凸di if固 JrJrS-* tji IH ATVP44T:g 爲-5 «714口APJ打印甌口 MTl i J ZB call JCW* itlfl-* LaaiE 冠-當然也可以通過上位機軟件編寫,通過按鈕來選擇COM端口號,但是此次僅僅是簡單的例程,就沒有弄那么復雜了。COM1 口可用的話,會提示串口初始化完畢。否則會提示串口已經打開Port already open,表示串口已經打開,被占用了。2、點擊開始轉換,串口會向單片機發(fā)送0xaa,單片機串口中斷接收到 0xaa后啟動ADC轉換一次,并把轉換

3、結果 ADCL、ADCH共兩個字節(jié)的結果發(fā)送至 PC,PC進行數值轉換后在 窗口里顯示。(見文章末尾圖)3、為防止串口被一只占用,點擊關閉串口可以關閉 COM1,供其它程序使用,點擊后按鈕變?yōu)榇蜷_串口,點擊可重新打開COM1。程序的編寫:1、 打開VC+6.0建立基于對話框的 MFC應用程序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)建的應用程序類型是:FC應用程序向導-步驟廠單文檔圖 廣多重文檔(MJ 涇基本對話框

5、叵j?P立欄癥£盲嚇糸結刊克持¥您的資源使用的語言是:I 申文1中國APPWZCHS.dIZjHFC應用程序向導-步驟2共4步您是否希望包含:廠“關于“對話框廠上下文相關幫助V 3D外觀您希望包含什么其他支持?廠自動操作凹0 ActiveX控件回您希望包含WOSA支持嗎?廠 Windows Sockets (W|對話框的標題是:|test您喜歡的風格是:Microsoft Develcyer StudiornrrniwMIFC應用程序向導-步驟3共4步a MFC'WIr Windows資源管理器樣式您希望生成源文件備注嗎?a 是 Cx3您希望使用MFC,辛嗎?G作為

6、共享的DLL作為靜態(tài)的DLLFC應用程序向導-步驟&共克步類名型頭文件:CTestApptest.h基類:執(zhí)行文件:CWinApptest.cpi:上一歩|下 步完成2、 在項目中插入 MSComm 控件:工程-增加到工程-Components and Controls-雙擊 Registered ActiveX Controls- 選擇 Microsoft Communications Control, version 6.0-lnsert ,按 默認值添加,你會發(fā)現多了個電話圖標,這是增加后串口通信控件。插入 工程世)組建1工具 窗口血 幫助設置活動工程電)増加到工程I cl&am

7、p;SS FSource Control新逹卜匕 新建文件夾冊)te st從屬性設導出制作文件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、刪除確認、取消和提示框,添加電話”進程、靜態(tài)文本、按鈕、編輯框,拖動添加的控件,根據喜好布局。控件B4、右擊編輯框Edit選擇屬性,在樣式里設置,勾選多行、垂直滾動,其它可按默認值。 右擊靜態(tài)文本Text選擇屬性,在常規(guī)設置里,修改標題。右擊按鈕PushButton選擇屬性,在在常規(guī)設置里,修改標題。修改后界面如下,程序寫出來運行時電話”標志會自動消失。Aft abl OF 9 ® S 血a $畫EH 1= a H 魚園 ffi e5、查看-&

10、gt;建立類向導 MFC ClassWizard->Member Viariable,選擇 ClassName 為 CTestDIg 的類,Control ID為MSC0MM1,雙擊它,為它添加控制變量m_comm1。類似的,選擇IDC_BUTT0N2添加控制變量 m_serial。(建立類向導也可以右擊然后在彈出的快捷菜單里選擇建立類向導)FC 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、組建-> 全部組件,然至此,基本框架已經出來了,編譯后運行可以看到如下所示的界面。 后組建-> 執(zhí)行)|5f li開始轉換打開串口民li打開串口6、點擊左側的視圖窗口,可以在三種模式下切換,第三個是打開我們的源代碼窗口, 個是類,第二個是窗體的資源視圖。兇 test n選擇File View,展開test files->Header Files,打開testDIg.h,在全局變量下添加如下代碼,然 后保存:int gllen;定義整型標量gllen,用于記錄接收數據的個數CProgressCtrl * pbar; /指向進度條的指針,用于操作進度條CString

13、strRXDdata; /編輯框顯示的文本,記錄歷次轉換值/ Constructionpublic:CTestDlgtCWnC* pPrent - NULL); / standard constructorint gllen;"定義整型標量gllen.用于記移收數據的個數CProgressCtrl pbar;"拒冋逬扈條的搟針,用壬理隹迸廢憊string strRXDdata; "編輯簽示的支笨.垃隸蔚次蒔誓鷹/ H H HV «« »»»!補 " ««»«

14、1;«« 耳1(11:鼻«!«»*««« W« H »»»/ Dialog Data/AFX DATA(ClpstDlq)enun 7e>D - 10D TEST DIALOG ):C8utton n serial;7、點擊 Recourse View,展開 test recourses->Dialog,雙擊 IDD_TEST_DIALOG ,編輯我們 的主界面對話框。雙擊擊電話”彈出如下對話框,按確認鍵:Add Member FuiiGtion|P|OnComm

15、MscommlMember function name:CancelMessage: OnCommObject ID: IDC_MSCOMM1VC會進入源碼編輯窗口,這個函數是用來處理串口事件的,當PC串口接收到數據時,會產生一個數據緩沖區(qū)有數據的消息事件,然后調用執(zhí)行這個函數。添加如下代碼,進行數據處理,窗口更新等操作:VARIANT variant1;定義VARIANT型變量,用于存放接收到的數據COleSafeArray safearray;/ 定義 safearray 型變量LONG len,k;定義長整型變量 len,kBYTE rxdata2048; 定義 BYTE 型數組CStr

16、ing stremp1,stremp2; 定義兩個字符串if(m_comm1.GetCommEve nt()=2)/ 判斷引起 On Comm 時間的原因/如果是接收到特定個字節(jié)數,則讀取接收到的數據variant1 = m_comm1.GetInput();把接收到的數據存放到VARIANT型變量里safearray = variant1;/V ARIANT 型變量轉換為 ColeSafeArray 型變量 len = safearray.GetOn eDimSize();for(k=0;k<le n;k+)safearray.GetElement(&k,rxdata+k);

17、/ 得到接接收到的數據放到BYTE 型數組 rxdata 里for(k=0;k<le n;k+)BYTE bt = (*(unsigned char*)(rxdata+k); / 讀取 AD 轉換的高字節(jié)if(k%2)=0)if(k+1)<le n)gllen+;全局的變量,對接收到的轉換結果的個數進行計算stremp2.Format("第%d次轉換結果:",gllen);顯示第幾次轉換int temp = bt*4+(*(u nsig ned char *)(rxdata+k+1)>>6); /高低字節(jié)合并成實際的轉換結果,注意轉換結果是左對齊st

18、remp1.Format("%2.2f",(2.56*temp/1024); 計算成實際電壓值SetDlgItemText(IDC_STATIC,("當前電壓值為:"+stremp1+" V"); / 更新靜態(tài)文本控件pbar -> SetPos(temp);/更新進度條的當前位置strRXDdata += stremp2;把新的數據放到全局的字符串里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型査*轉換左Ct)】 MdFl說rl©Mt"" 即;i叮fl賞別刖皿£試如XE2里nr(*f0;k<lrri ;k*)bvte bt chr丄*k) y/j -fl Di < r- ?'-這時重新編譯一下,看會不會有什么錯誤,出現下面提示,可以選擇全部組建來清除。LINK : LNK4073: cann ot create map for .IL

21、K file; lin ki ng nonin creme ntally 出現下面錯誤,請關閉運行的test.exe后重試。LINK : fatal error LNK1104: cannot open file "Debug/test.exe"出現下面錯誤兩種錯誤,是由于空間編號問題引起的,當我們添加了編輯框或者電話”后再添加,其編號自動加一,就會出現控件沒定義。Z:vc+ 串口上位機 testtestDlg.cpp(32) : error C2065: 'IDC_MSC0MM1' : undeclared identifier Z:vc+ 串口上位機 t

22、esttestDlg.cpp(139) : error C2065: 'IDC_EDIT1' : undeclared identifier 解決方法是,在 RecourseView里,打開窗體IDD_TEST_DIALOG ,右擊 電話”或者編輯框 等其它出錯的控件,右擊選擇屬性,在常規(guī)里修改ID,這里的程序,除 BUTTON有1、2兩個之外,其它都是1P可見圖己禁用回廠組IS麗制表站回全部組建編譯一下,看看有沒有錯誤,沒有錯誤就可以運行一下,可以看到界面更原來是,li crvs?ft CoBBuai cati o&s Conlrolj蟲繆常規(guī)GeneralBuffe

23、rs |D: |iDC_MSC0MM1樣的。有錯誤就修改一下,省得弄多了,錯在哪里都不知道,查起來麻煩。8、在源碼編輯里,打開testDlg.cpp文件,進行窗口初始化函數的編寫。找到 BOOL CTestDlg:OnlnitDialog()函數,在 SetIcon(m_hlcon, FALSE);/ Set small icon/ TODO: Add extra ini tialization here后面添加如下初始化代碼:gllen = 0; /記錄轉換次數全局變量清零if(! m_comm1.GetPortOpen() 判斷串口是否已經打開m_comm1.SetCommPort(1);

24、 / 選擇串口號 1m_comm1.SetPortOpen(TRUE); / 打開串口m_comm1.SetRThreshold(2); / 收到兩個字節(jié)引發(fā) On Comm 事件 m_comm1.SetInputMode(1); 輸入模式選為二進制m_comm1.SetSetti ngs("57600, n,8,1"); 設置串口參數,波特率 57600,無奇偶校驗,1位停止 位,8位數據位MessageBox("串口初始化完畢",”提示");/提示串口成功初始化else MessageBox("串口被占用","

25、提示");/如果已經打開串口,消息框提醒pbar = (CProgressCtrl*)GetDlgltem(IDC_PROGRESS1); 獲得指向 IDC_PROGRESS1 的指針 pbar -> SetRa nge(0,1023); 設置進度條的范圍 01023pbar -> SetPos(O);/當前位置為 0m_serial.SetWindowText(”關閉串口 ");/按鈕顯示狀態(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-十仁功 號?謹參成 口口卒式口口到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(關宙串 口 "可以看到,串口的參數等等都在在這里初始化的,可以根據自己的需要修改的,具體可以查看VC+里的詳細介紹,看看有哪些參數可以給我們修改來用。添加后再編譯一下,運行后可以看到多了一個串口初始化的提示信息窗口。 至此,我們已經完成了主要

28、的串口操作及界面,剩下的就是兩個按鈕的操作了。9、回到資源視圖的IDD_TEST_DIALOG 窗口,雙擊開始轉換按鈕,給它添加事件,點擊 后PC通過串口發(fā)送Oxaa出來,給單片機接收。添加如下代碼:CByteArray m_Array; / 定義字節(jié)數組 m_Array.RemoveAII(); / 字節(jié)數組清空 m_Array.SetSize(1); / 設定維數為 1 m_Array.SetAt(0,0xaa); / 給 m_arrayO賦值 0 m_comm1.SetOutput(COIeV ariant(m_Array); 由于 SetOutput 函數的參數為 VARIANT 型,

29、必 須強制轉換后才能發(fā)送uold Cf:DnButtonli ()</ IODO: Add j/our control not iFicat i<in handlerhere/*»»*»*»*»<*»*»*>»*»*CBteArra n Array;"宅義宇節(jié)數組.Renoueftllf ;丿/字誤報殂清空n_Array ,SetSize( 1);"設定堆數方Ti* Arry.Setfttf 叫馭ao);館r coRinl SetOutputf COleUariantfm Rrra>):Set Out puWsJ數的券數 為 UfN ! -H H M-« » * N< N H 41 H i « M H H同樣地,雙擊另外一個按鈕,給串口操作按鈕添加代碼,用于關閉或者打開串口。添加如下代碼:if(! m_comm1.GetPortOpen() 判斷串口是否已經打開

溫馨提示

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

評論

0/150

提交評論