最詳細(xì)的VC++串口上位機(jī)編程_第1頁(yè)
最詳細(xì)的VC++串口上位機(jī)編程_第2頁(yè)
最詳細(xì)的VC++串口上位機(jī)編程_第3頁(yè)
最詳細(xì)的VC++串口上位機(jī)編程_第4頁(yè)
最詳細(xì)的VC++串口上位機(jī)編程_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、VC+串口上位機(jī)編程 串口通信,MCU跟PC通信經(jīng)常用到的一種通信方式,做界面、寫(xiě)上位機(jī)程序的編程語(yǔ)言、 編譯環(huán)境等不少, VB、C#、LABVIEW 等等,我會(huì)的語(yǔ)言很少, C語(yǔ)言用得比較多,但是 還沒(méi)有找到如何用 C語(yǔ)言來(lái)寫(xiě)串口通信上位機(jī)程序的資料, 在圖書(shū)管理找到了用 VC+編寫(xiě) 串口上位機(jī)的資料,參考書(shū)籍,用自己相當(dāng)蹩腳的 C+寫(xiě)出了一個(gè)簡(jiǎn)單的串口上位機(jī)程序, 分享一下,體驗(yàn)一下單片機(jī)和 PC通信的樂(lè)趣。 編譯環(huán)境:VC+6.0 操作系統(tǒng):VMWare虛擬出來(lái)的Windows XP 程序?qū)崿F(xiàn)功能: 1、PC初始化COM 1 口,使用n81方式,波特率57600與單片機(jī)通信。PC的COM

2、 口編號(hào)可 以通過(guò)如下方式修改: 當(dāng)然也可以通過(guò)上位機(jī)軟件編寫(xiě),通過(guò)按鈕來(lái)選擇 COM端口號(hào),但是此次僅僅是簡(jiǎn)單的例 程,就沒(méi)有弄那么復(fù)雜了。 COM1 口可用的話,會(huì)提示串口初始化完畢。否則會(huì)提示串口已 經(jīng)打開(kāi)Port already open,表示串口已經(jīng)打開(kāi),被占用了。 2、點(diǎn)擊開(kāi)始轉(zhuǎn)換,串口會(huì)向單片機(jī)發(fā)送 0 xaa,單片機(jī)串口中斷接收到 0 xaa后啟動(dòng)ADC轉(zhuǎn) 換一次,并把轉(zhuǎn)換結(jié)果 ADCL、ADCH共兩個(gè)字節(jié)的結(jié)果發(fā)送至 PC, PC進(jìn)行數(shù)值轉(zhuǎn)換后在 窗口里顯示。 (見(jiàn)文章末尾圖) 3、為防止串口被一只占用, 點(diǎn)擊關(guān)閉串口可以關(guān)閉 COM1 ,供其它程序使用,點(diǎn)擊后按鈕 變?yōu)榇蜷_(kāi)

3、串口,點(diǎn)擊可重新打開(kāi) COM1。 程序的編寫(xiě): 1、 打開(kāi)VC+6.0建立基于對(duì)話框的 MFC應(yīng)用程序Test,文件 工程I工作區(qū)I其它文檔I Win32 Application Win32 Console Application Win32 DynamioLink Library Win32 Static Library FC應(yīng)用程序向?qū)?步彝1 您要?jiǎng)?chuàng)建的應(yīng)用程序類(lèi)型是: L 單文檔國(guó) C 多重文檔(M) c 基本對(duì)話框(Qi P文檔/查看體系結(jié)構(gòu)支持 您的資源使用的語(yǔ)言是: | 中文中國(guó) HAPPWZCHS.DLL) 3土 ATL COM AppWizard TlCluster Reso

4、urce Type Wizard TlCustom AppWizard Database Project rDevStudio Add in Wizard ( Extended Stored Proc Wizard xfilSAPI Extension Wizard Makefile tMFC ActiveX ControlWizard 虎 MFC AppWizard (dll) MFC AppWizard (exe 卜 New Database Wizard Tl Utility Project 壬程名稱(chēng)(Ml: test- 位置(CJ: _ |znvc “串口上位機(jī)Uest &創(chuàng)建

5、新的工作空間(B) 廠添加到當(dāng)前工作空何的 r從屬于咧: 平臺(tái)(3: Win32 FC應(yīng)用程序向?qū)?步馨 2共 4步 您是否希望包含: 廠關(guān)于“對(duì)話框 r 上下文相關(guān)幫助 V 3D外觀 您希望包含什么其他支持? r 自動(dòng)操作凹 丁丁 ActiveX 控件 您希望包含 WOSA支持嗎? Windows Sockets (W| 對(duì)話框的標(biāo)題是: |test IFC應(yīng)用程序向?qū)?步尊 3共 4步 您喜歡的風(fēng)格是: 6 MFCWI r Windows 資源管理器樣式 您希望生成源文件備注嗎? 是(Y) 您希望使用 MFC弄嗎? C 作為共享的 DLL 廠作為靜態(tài)的 DLLx* Check Box (?

6、 Rdio Bvttoa C* Rdio BvttoB Edito 9 Control: | Record 、 Microsoft Developer Studio 2、 在項(xiàng)目中插入 MSComm 控件:工程-增加到工程-Components and Controls-雙擊 Registered ActiveX Controls- 選擇 Microsoft Communications Control, version 6.0-Insert , 按 默認(rèn)值添加,你會(huì)發(fā)現(xiàn)多了個(gè)電話圖標(biāo),這是增加后串口通信控件。 插入插入(1)工程工程(I)組建康)工具組建康)工具d)窗口窗口 幫助詛)幫助詛)

7、 CWinApp 設(shè)置活動(dòng)工程設(shè)置活動(dòng)工程 插入工程到工作空間插入工程到工作空間隹)隹). .應(yīng)用程序向?qū)槟鷦?chuàng)建了以下類(lèi): CTestDIg 類(lèi)名 0: 頭文件: CTestApp 執(zhí)行文件: Source Control 從屬性從屬性. 設(shè)置匿)設(shè)置匿) 辱出制作文辱出制作文境文件Alt+F7 ! ! - M te st 新建新建值)值) 卜卜 新建新建文件夾僵)文件夾僵).一一 CTestA iComEonentX and Controls. FC應(yīng)用程序向?qū)?步哀 4共 4步 增加到工程增加到工程值)值) Components and Controls Gallery 選擇要插入到工程

8、的組件 查找范圍查找范圍(X): | W 皂皂X Cgtmlw 傘傘 匡匡| | Mi cr&soft Anigtion Control, version 5- 0 (S?2) icrasoft Common Dial理理 CaRtrol, version 6. 0 (5T6) fNicroEof t EitaCombo Control, vers ion 6. 0 (OLEEE ) Nicr&soft EataGrid Control &. 0 缶缶理理) )(OLEEB) Microsoft DMaLiwt Control, version 5. 0 (OLEDBD

9、 文件名文件名 俱俱) ): Mi crosoft ComimuiLi cati ons Control, ver si IrtSr t Microsoft Comm Control 6.0 3、刪除確認(rèn)、取消和提示框,添加 電話”、進(jìn)程、靜態(tài)文本、按鈕、編輯框,拖動(dòng)添加的 控件,根據(jù)喜好布局。曜ablablo orilril函圖一一咤序日?qǐng)F(tuán)叵 * *& &O OIXIXB B囤令卜slsl33 - -ffiffic cl ls s取消取消 Microsoft Communi cations Controij version 6,0 富富Mi cr( 7 Mi err ffil

10、icri Mi err cr建立類(lèi)向?qū)?MFC ClassWizard-Member Viariable,選擇 ClassName 為 CTestDlg 的類(lèi),Control ID為MSCOMM1,雙擊它,為它添加控制變量 m_comm1。 類(lèi)似的,選擇IDC_BUTTON2添加控制變量 m_serial。 (建立類(lèi)向?qū)б部梢杂覔羧缓笤趶棾龅目旖莶藛卫镞x擇建立類(lèi)向?qū)В?Message Maps Member Variables Automat沁打 | AcIrveX Events | Class IMo Type Member Class name: CTeslDlg Z%testMestDl

11、g_h* ZA.*-VsttestDlgxpp Cnntrol IDs: Message Maps Member Variobks Automation | ActiveX Events | Class Info Project: Class name: test H CTeslDIg Z:V*AtesttestDlg,h, Z:VAtes(teslDtgxpip Conlrol IDs: Type Member QbC_ BUTTON1 1DC BUTTON2 CButton m serial IDC_EDIT3 IDC_MSC0MM1 CMSComm m_CG(nm1 IDCPROGRES

12、S1 至此,基本框架已經(jīng)出來(lái)了,編譯后運(yùn)行可以看到如下所示的界面。 (組建-全部組件,然 后組建- 執(zhí)行) I 區(qū)區(qū) | | P =二二 test 區(qū)| 污污 開(kāi)始轉(zhuǎn)換開(kāi)始轉(zhuǎn)換 上上 I打開(kāi)串口打開(kāi)串口j 當(dāng)前電壓值為:當(dāng)前電壓值為: I僑谿簸僑谿簸 打開(kāi)串口打開(kāi)串口 6、點(diǎn)擊左側(cè)的視圖窗口,可以在三種模式下切換,第三個(gè)是打開(kāi)我們的源代碼窗口, 第 個(gè)是類(lèi),第二個(gè)是窗體的資源視圖。 邑 test.cpp tPfDn 選擇File View ,展開(kāi)test files-Header Files,打開(kāi)testDlg.h ,在全局變量下添加如下代碼,然 后保存: int gllen;/定義整型標(biāo)量g

13、llen ,用于記錄接收數(shù)據(jù)的個(gè)數(shù) CProgressCtrl * pbar; /指向進(jìn)度條的指針,用于操作進(jìn)度條 CString strRXDdata; /編輯框顯示的文本,記錄歷次轉(zhuǎn)換值 / Construction public: CTestDlgtCWnC* pParent - NULL); / standard constructor int gllen; 定義整型標(biāo)量gllen.用于記卷收數(shù)據(jù)的個(gè)數(shù) CPragressCtrl * pbar; 指回避虐條的疵針,用芝捷作進(jìn)度全 string strRXDdata; 細(xì)輯荏顯示的戈未*也泰房次藉麟也 / * W H H N D - 1

14、0D TEST DIALOG ): C8utton n serial; 7、 點(diǎn)擊 Recourse View ,展開(kāi) test recourses-Dialog,雙擊 IDD_TEST_DIALOG ,編輯我們 的主界面對(duì)話框。 雙擊擊 電話”,彈出如下對(duì)話框,按確認(rèn)鍵: Add Member Functioii |P| Member function name: Cancel Message: OnComm Object ID: IDC_MSCOMM1 VC會(huì)進(jìn)入源碼編輯窗口,這個(gè)函數(shù)是用來(lái)處理串口事件的,當(dāng) PC串口接收到數(shù)據(jù)時(shí),會(huì) 產(chǎn)生一個(gè)數(shù)據(jù)緩沖區(qū)有數(shù)據(jù)的消息事件, 然后調(diào)用執(zhí)行這個(gè)

15、函數(shù)。添加如下代碼,進(jìn)行數(shù)據(jù) 處理,窗口更新等操作: VARIANT variantl;/定義VARIANT型變量,用于存放接收到的數(shù)據(jù) COleSafeArray safearray;/ 定義 safearray 型變量 LONG len,k;/定義長(zhǎng)整型變量 len,k BYTE rxdata2048;/ 定義 BYTE 型數(shù)組 CString stremp1,stremp2;/ 定義兩個(gè)字符串OnCommMscomml if(m_comm1.GetCommEvent()=2)/ 判斷引起 OnComm 時(shí)間的原因 (/如果是接收到特定個(gè)字節(jié)數(shù),則讀取接收到的數(shù)據(jù) variantl = m

16、_comm1.GetInput();/把接收到的數(shù)據(jù)存放到 VARIANT型變量里 safearray = variant1;/V ARIANT 型變量轉(zhuǎn)換為 ColeSafeArray 型變量 len = safearray.GetOneDimSize(); for(k=0;klen;k+) ( safearray.GetElement(&k,rxdata+k); / 得到接接收到的數(shù)據(jù)放到 BYTE 型數(shù)組 rxdata 里 for(k=0;klen;k+) ( BYTE bt = (*(unsigned char*)(rxdata+k); / 讀取 AD 轉(zhuǎn)換的高字節(jié) if(k%

17、2)=0) if(k+1)6); / 高低字節(jié)合并成實(shí)際的轉(zhuǎn)換結(jié)果,注 意轉(zhuǎn)換結(jié)果是左對(duì)齊 stremp1.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后換行 SetDlgItemText(IDC_ED

18、IT1,strRXDdata);/ 更新文本控件的顯示 uoidl CTrst Dlq:DnDnCoMHscofWil () / TDDDi Add yicur control natirlcatiin handL ia CDdF Dr(*c-0;k(rxdatj k); /j -fl Di oiMiLu?rit ()-?) ff 用于薦放畿收別的裁餐 j Eft 莊工土華窯令ips /定BYT理翼粗 varljirit 1 FH CQimli .EeU npul:(); sifrjrriigi u.iri 判斷引悲姑血7間的原因 把蠢收放到 UARlfiHtP .Ji g /。朋 I AtU

19、 型曩* m 】M “ w ru i到的*2據(jù) Mt 頃 聯(lián)拙 ,攜位列mr藉一冷科 r 偵逢 LINK : LNK4073: cannot create map for .ILK file; linking nonincrementally 出現(xiàn)下面錯(cuò)誤,請(qǐng)關(guān)閉運(yùn)行的 test.exe后重試。 LINK : fatal error LNK1104: cannot open file Debug/test.exe” 出現(xiàn)下面錯(cuò)誤兩種錯(cuò)誤, 是由于空間編號(hào)問(wèn)題引起的, 當(dāng)我們添加了編輯框或者 龜話”后再 添加,其編號(hào)自動(dòng)加一,就會(huì)出現(xiàn)控件沒(méi)定義。 Z:vc+ 串口上位機(jī) testtestDlg.

20、cpp(32) : error C2065: IDC_MSCOMM1 : undeclared identifier Z:vc+ 串口上位機(jī) testtestDlg.cpp(139) : error C2065: IDC_EDIT1 : undeclared identifier 解決方法是,在 RecourseView里,打開(kāi)窗體IDD_TEST_DIALOG ,右擊 電話”或者編輯框 等其它出錯(cuò)的控件,右擊選擇屬性,在常規(guī)里修改 ID,這里的程序,除 BUTTON有1、2 兩個(gè)之外,其它都是1 i cr vsitft CoBBuni cati Control 云 常規(guī) General Bu

21、ffers | D: |lDC_MSC0MM1 Q 可見(jiàn)兇 廠組回 r己禁用回 v制表站回 全部組建編譯一下, 看看有沒(méi)有錯(cuò)誤,沒(méi)有錯(cuò)誤就可以運(yùn)行一下, 可以看到界面更原來(lái)是 樣的。有錯(cuò)誤就修改一下,省得弄多了,錯(cuò)在哪里都不知道,查起來(lái)麻煩。 8、在源碼編輯里,打開(kāi) testDlg.cpp文件,進(jìn)行窗口初始化函數(shù)的編寫(xiě)。 找到 BOOL CTestDlg:OnInitDialog()函數(shù), 在 SetIcon(m_hIcon, FALSE); / Set small icon / TODO: Add extra initialization here 后面添加如下初始化代碼: gllen =

22、0; /記錄轉(zhuǎn)換次數(shù)全局變量清零 if(! m_comm1.GetPortOpen()/ 判斷串口是否已經(jīng)打開(kāi) m_comm1.SetCommPort(1); / 選擇串口號(hào) 1 m_comm1.SetPortOpen(TRUE); / 打開(kāi)串口 m_comm1.SetRThreshold(2); /收到兩個(gè)字節(jié)引發(fā) OnComm 事件 m_comm1.SetInputMode(1);/ 輸入模式選為二進(jìn)制 m_comm1.SetSettings(57600,n,8,1); 設(shè)置串口參數(shù),波特率 57600,無(wú)奇偶校驗(yàn),1位停止 位,8位數(shù)據(jù)位 MessageBox(串口初始化完畢,提示);/

23、提示串口成功初始化 else MessageBox(串口被占用,提示);/如果已經(jīng)打開(kāi)串口,消息框提醒 pbar = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);/ 獲得指向 IDC_PROGRESS1 的指針 pbar - SetRange(0,1023);/ 設(shè)置進(jìn)度條的范圍 01023 pbar - SetPos(0);/當(dāng)前位置為 0 m_serial.SetWindowText(關(guān)閉串口 );/按鈕顯示狀態(tài)改變 / IODO: Add extrd initiali/ IODO: Add extrd initializdtiam herezdti

24、am here gllen 0; 1F( ? n COMI ,GetPartop*n( ; 1 nputMadfifl); .Sst&pttingsC &oa.ri.SV; HessdgeSox (”串口初弟化完畢”H示”); ?1 MPESJi)eBox(串口袖占用握示); pbjr - (CProgrpCtrl-)EPt lg I t M I DC_PR4ERESS1); pbjr - SrtRnqetV,10?3); pbar - tPtM D; _HH M. .SttWndokffMtr 美用亭口 P; 可以看到,串口的參數(shù)等等都在在這里初始化的, 可以根據(jù)自己的需要修

25、改的, 具體可以查 看VC+里的詳細(xì)介紹,看看有哪些參數(shù)可以給我們修改來(lái)用。 添加后再編譯一下,運(yùn)行后可以看到多了一個(gè)串口初始化的提示信息窗口。 至此,我們已經(jīng)完成了主要的串口操作及界面,剩下的就是兩個(gè)按鈕的操作了。 9、回到資源視圖的IDD_TEST_DIALOG 窗口,雙擊開(kāi)始轉(zhuǎn)換按鈕,給它添加事件,點(diǎn)擊 后PC通過(guò)串口發(fā)送0 xaa出來(lái),給單片機(jī)接收。 添加如下代碼: CByteArray m_Array; / 定義字節(jié)數(shù)組 m_Array.RemoveAll(); / 字節(jié)數(shù)組清空 m_Array.SetSize(1); / 設(shè)定維數(shù)為 1 m_Array.SetAt(0,0 xaa)

26、; / 給 m_array0賦值 0 m_comm1.SetOutput(COleV ariant(m_Array);/ 由于 SetOutput 函數(shù)的參數(shù)為 VARIANT 型,必 須強(qiáng)制轉(zhuǎn)換后才能發(fā)送 void CTestDlg::0nBuCton1() / IODO: Add your control not iFicat i* * * CBteArra n Array; 定義字節(jié)數(shù)組 .Renoueftllf ; 字 /會(huì)虱清空 n_Array ,SetSize( 1); 設(shè)定維數(shù)為 1 i* Arry.Setfttf。,蹌 2); 紿“_日“對(duì)【明斌麓.0 R coRinl .SetOutput (COlUariant (FI Rrra) : Set Out puliSj敦的舞敷出 ,/ N -H H 9 H M- * N N H H M H H H i M H H 4* H 同樣地,雙擊另外一個(gè)按鈕,給串口操作按鈕添加代碼, 用于關(guān)閉或者打開(kāi)串口。 添加如下 代碼: if(! m_comm1.GetPortOpen()/ 判斷串口是否已經(jīng)打開(kāi) C C 目

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論