最詳細(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è),還剩10頁(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)的WindowsXP程序?qū)崿F(xiàn)功能:1、PC初始化COM1口,使用n81方式,波特率57600與單片機(jī)通信。PC的COM口編號(hào)可以通過(guò)如下方式修改:當(dāng)然也可以通

2、過(guò)上位機(jī)軟件編寫(xiě),通過(guò)按鈕來(lái)選擇COM端口號(hào),但是此次僅僅是簡(jiǎn)單的例程,就沒(méi)有弄那么復(fù)雜了。COM1口可用的話,會(huì)提示串口初始化完畢。否則會(huì)提示串口已經(jīng)打開(kāi)Portalreadyopen,表示串口已經(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)串口,點(diǎn)擊可重新打開(kāi)COM1。程序的編寫(xiě):1、打開(kāi)VC+6.0建立基于對(duì)話框的MFC應(yīng)用

3、程序Test,2、在項(xiàng)目中插入MSComm控件:工程-增加到工程-ComponentsandControls-雙擊RegisteredActiveXControls-選擇MicrosoftCommunicationsControl,version6.0-Insert,按默認(rèn)值添加,你會(huì)發(fā)現(xiàn)多了個(gè)電話圖標(biāo),這是增加后串口通信控件。插霍工程迥組逹工具窗口血幫助,Som_ceCctl+i-ol:姓厘性設(shè)達(dá)逾,Som_ceCctl+i-ol:姓厘性設(shè)達(dá)逾Alt+FT導(dǎo)出制作或件.插入工程到工作空間(X).設(shè)置活動(dòng)工程迪Iclassr一1兇卜鳥(niǎo)文件嘰増加到工程(A)新建皿心匕新逹文件夾址汀3、刪除確認(rèn)、

4、取消和提示框,添加“電話”、進(jìn)程、靜態(tài)文本、按鈕、編輯框,拖動(dòng)添加的控件,根據(jù)喜好布局。4、右擊編輯框Edit選擇屬性,在樣式里設(shè)置,勾選多行、垂直滾動(dòng),其它可按默認(rèn)值。右擊靜態(tài)文本Text選擇屬性,在常規(guī)設(shè)置里,修改標(biāo)題。右擊按鈕PushButton選擇屬性,在在常規(guī)設(shè)置里,修改標(biāo)題。修改后界面如下,程序?qū)懗鰜?lái)運(yùn)行時(shí)“電話”標(biāo)志會(huì)自動(dòng)消失。編輯當(dāng)前電壓值肓Hlx國(guó)EZ2編輯當(dāng)前電壓值肓Hlx國(guó)EZ23開(kāi)始轉(zhuǎn)換打開(kāi)串口5、查看-建立類(lèi)向?qū)FCClassWizard-MemberViariable,選擇ClassName為CTestDlg的類(lèi),ControlID為MSCOMM1,雙擊它,為它添

5、加控制變量m_comml。類(lèi)似的,選擇IDC_BUTT0N2添加控制變量m_serial。(建立類(lèi)向?qū)б部梢杂覔羧缓笤趶棾龅目旖莶藛卫镞x擇建立類(lèi)向?qū)В㎝essageMapsMemberVariablesAutcmation|ActiveXEvents|ClassIntoProject:CJassname:testCTestDIgZ:.testtestDIg.h,Z:k.stDIg乂ppControlIDs:TypeMemberIlDCBUTT0N1IlDCBUTT0N2CButlonrnserialIDCEDIT3IDCMSC0MM1IDCPROGRESSICMSCammmcomm!至此,基本

6、框架已經(jīng)出來(lái)了,編譯后運(yùn)行可以看到如下所示的界面。(組建-全部組件,然后組建-執(zhí)行)6、點(diǎn)擊左側(cè)的視圖窗口,可以在三種模式下切換,第三個(gè)是打開(kāi)我們的源代碼窗口,第一個(gè)是類(lèi),第二個(gè)是窗體的資源視圖。i5Cla.勰1Res.File.2test.cppfpqtDln_rnn選擇FileView,展開(kāi)testfiles-HeaderFiles,打開(kāi)testDlg.h,在全局變量下添加如下代碼,然后保存:intgllen;/定義整型標(biāo)量gllen,用于記錄接收數(shù)據(jù)的個(gè)數(shù)CProgressCtrl*pbar;/指向進(jìn)度條的指針,用于操作進(jìn)度條CStringstrRXDdata;/編輯框顯示的文本,記錄歷

7、次轉(zhuǎn)換值/Constructionpublic:*CTfpParrent-NULL);/standardconstructor*/*intglleir;定義整型標(biāo):fifn,CProgressCtrlpbar;捐冋逬虞務(wù)的常針CStringstrRKDdata;褊輯睚醜不的文本*/*/OialogData/HjfiFXDfiTftCCTestDlg)tritiittRDIDDTEISTEJIilLOE;;CButtonnserlal;ft.LJrfv一一一乂7、點(diǎn)擊RecourseView,展開(kāi)testrecourses-Dialog,雙擊IDD_TEST_DIALOG,編輯我們的主界面對(duì)話框

8、。雙擊擊“電話”,彈出如下對(duì)話框,按確認(rèn)鍵: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è)函數(shù)。添加如下代碼,進(jìn)行數(shù)據(jù)處理,窗口更新等操作:VARIANTvariantl;/定義VARIANT型變量,用于存放接收到的數(shù)據(jù)COleSafeArraysafearray;/定義safearray型變量LONGlen,k;/定義長(zhǎng)整型變量len,kBYTErxdata2048;定義BYTE型數(shù)組CStringstremp1,stremp2;定義兩個(gè)字符串if(m_comm1.GetCommEvent()=2)/判斷引

9、起OnComm時(shí)間的原因/如果是接收到特定個(gè)字節(jié)數(shù),則讀取接收到的數(shù)據(jù)variantl=m_comml.GetInput();把接收到的數(shù)據(jù)存放到VARIANT型變量里safearray=variant1;/VARIANT型變量轉(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+)BYTEbt=(*(unsignedchar*)(rxdata+k);/讀取AD轉(zhuǎn)換的高字

10、節(jié)if(k%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_EDIT1,strRXDdata);更新文本控件的

11、顯示/TDDDiAtfdcontrolnotifiEatioinhandleicodi?hereUARIAHTvdrUhtl;阿嘆歸$時(shí)的片妙;LONGlen.k;UARIAHTvdrUhtl;阿嘆歸$時(shí)的片妙;LONGlen.k;BVTErKdat2C4B;CStrinystrenp!iEtrertpZ;if-GrtOnebinSize()upariint1.gietlnipum;sFe.)-i;IpnsaFrra-GrtOnebinSize();for(lc-0:lOVTEHt-*();/卄舉心葉$楓曠:壬這時(shí)重新編譯一下,看會(huì)不會(huì)有什么錯(cuò)誤,出現(xiàn)下面提示,可以選擇全部組建

12、來(lái)清除。LINK:LNK4073:cannotcreatemapfor.ILKfile;linkingnonincrementally出現(xiàn)下面錯(cuò)誤,請(qǐng)關(guān)閉運(yùn)行的test.exe后重試。LINK:fatalerrorLNK1104:cannotopenfileDebug/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.cpp(32):errorC2065:IDC_MSCOMM1:undeclaredidentifierZ:vc+串口上位機(jī)testtestDlg.

13、cpp(139):errorC2065:IDC_EDIT1:undeclaredidentifier解決方法是,在RecourseView里,打開(kāi)窗體IDD_TEST_DIALOG,右擊“電話”或者編輯框等其它出錯(cuò)的控件,右擊選擇屬性,在常規(guī)里修改ID,這里的程序,除BUTTON有1、2兩個(gè)之外,其它都是1全部組建編譯一下,看看有沒(méi)有錯(cuò)誤,沒(méi)有錯(cuò)誤就可以運(yùn)行一下,可以看到界面更原來(lái)是樣的。有錯(cuò)誤就修改一下,省得弄多了,錯(cuò)在哪里都不知道,查起來(lái)麻煩。8、在源碼編輯里,打開(kāi)testDlg.cpp文件,進(jìn)行窗口初始化函數(shù)的編寫(xiě)。找到BOOLCTestDlg:OnInitDialog()函數(shù),在Set

14、Icon(m_hIcon,FALSE);/Setsmallicon/TODO:Addextrainitializationhere后面添加如下初始化代碼:gllen=0;/記錄轉(zhuǎn)換次數(shù)全局變量清零if(!m_comm1.GetPortOpen()判斷串口是否已經(jīng)打開(kāi)m_comm1.SetCommPort(1);/選擇串口號(hào)1m_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

15、);/設(shè)置串口參數(shù),波特率57600,無(wú)奇偶校驗(yàn),1位停止位,8位數(shù)據(jù)位MessageBox(串口初始化完畢,”提示”);提示串口成功初始化elseMessageBox(串口被占用,”提示”);如果已經(jīng)打開(kāi)串口,消息框提醒pbar=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);獲得指向IDC_PROGRESS1的指針pbar-SetRange(0,1023);設(shè)置進(jìn)度條的范圍01023pbar-SetPos(O);/當(dāng)前位置為0m_serial.SetWindowText(”關(guān)閉串口);/按鈕顯示狀態(tài)改變/AddeNhdinitiallziitionher

16、egllpn“;if*HiEainnl.SetFortOpeint)m_CDnn1lBSetCflnnl*ort(1);OniEDnri爭(zhēng)件住萃9“OniEDnri爭(zhēng)件住萃9“和,無(wú)奇偶校陸,oIDCprocrissi鷹條而范直曠in_EDnFilSetRIhreshold(2;ricDnnl.SetlnpiiitMadef1);fCedhfi1.SetSettings(M57&O0fnMeSSage8ox(-n初始優(yōu)完畢“,“提示“);elselfe-5sageBn34(hh$口枝占用M;,sjS示”);phr(CFroqrCtrj.)(;pEDIt11en(IDCPROGRES1);pbA

17、F-sCRanef0a1023);pbarSetFosfn);fi_serljH.SetWindciwTcxU關(guān)閉串口J;可以看到,串口的參數(shù)等等都在在這里初始化的,可以根據(jù)自己的需要修改的,具體可以查看VC+里的詳細(xì)介紹,看看有哪些參數(shù)可以給我們修改來(lái)用。添加后再編譯一下,運(yùn)行后可以看到多了一個(gè)串口初始化的提示信息窗口。至此,我們已經(jīng)完成了主要的串口操作及界面,剩下的就是兩個(gè)按鈕的操作了。9、回到資源視圖的IDD_TEST_DIALOG窗口,雙擊開(kāi)始轉(zhuǎn)換按鈕,給它添加事件,點(diǎn)擊后PC通過(guò)串口發(fā)送Oxaa出來(lái),給單片機(jī)接收。添加如下代碼:CByteArraym_Array;/定義字節(jié)數(shù)組m_A

18、rray.RemoveAll();/字節(jié)數(shù)組清空m_Array.SetSize(1);/設(shè)定維數(shù)為1m_Array.SetAt(O,Oxaa);給m_array0賦值0m_comml.SetOutput(COleVariant(m_Array);由于SetOutput函數(shù)的參數(shù)為VARIANT型,必須強(qiáng)制轉(zhuǎn)換后才能發(fā)送uoidcrestDig::oneuttf)ni(/TOOQ:AddyuurcontrolnotiFicstioncud?here定義節(jié)數(shù)組確嬲翳給m_anay町賦值。由于SetDutputiOi的參數(shù)為U定義節(jié)數(shù)組確嬲翳給m_anay町賦值。由于SetDutputiOi的參數(shù)為U/劇!HHNMK#tt同樣地,雙擊另外一個(gè)按鈕,給串口操作按鈕添加代碼,用于關(guān)閉或者打開(kāi)串口。添加如下代碼:if(!m_co

溫馨提示

  • 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)論