版權(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ī)簡(jiǎn)單例程(源碼及詳細(xì)步驟)VC+串口上位機(jī)簡(jiǎn)單例程.rar (4.33 MB)VC+編寫(xiě)簡(jiǎn)單串口上位機(jī)程序2010年4月13日10:23:40串口通信,MCU 跟 PC 通信經(jīng)常用到的一種通信方式,做界面、寫(xiě)上位機(jī)程序的編程語(yǔ)言、編譯環(huán)境等不少,VB、C#、LABVIEW 等等,我會(huì)的語(yǔ)言很少,C 語(yǔ)言用得比較多,但是還沒(méi)有找到如何用 C 語(yǔ)言來(lái)寫(xiě)串口通信上位機(jī)程序的資料,在管理找到了用 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)的 Win
2、dows XP程序?qū)崿F(xiàn)功能:1、 PC 初始化 COM1口,使用 n81方式,波特率57600與單片機(jī)通信。PC 的 COM 口以通過(guò)如下方式修改:可當(dāng)然也可以通過(guò)上位機(jī)編寫(xiě),通過(guò)按鈕來(lái)選擇 COM 端,但是此次僅僅是簡(jiǎn)單的例程,就沒(méi)有弄那么復(fù)雜了。COM1口可用的話(huà),會(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、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建立基于框的 MFC 應(yīng)用程序Test,2、 在項(xiàng)目中m 控件:工程-增加到工程-Components and Controls-雙擊Registered ActiveX Controls-選擇Communications Control, ver6.0-Insert,按默認(rèn)值添加,你會(huì)發(fā)現(xiàn)多了個(gè)圖標(biāo),這是增加后串口通信控件。3、 刪除確認(rèn)、取消和提示框,添加“控件,根據(jù)喜好布局。”、進(jìn)程、靜態(tài)文本、按鈕、編輯框,拖動(dòng)添加的4、 右擊編
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)。5、 查看-建立類(lèi)向?qū)?MFC ClassWizard-Member Viariable,選擇 Claame 為 CTestDlg的類(lèi),Control ID 為M1,雙擊它,為它添加控制變量m1。類(lèi)似的,選擇 IDC_BUTTON2添加控制變量 m_serial。(建立類(lèi)向?qū)б部梢杂覔羧缓笤趶棾龅目旖莶藛卫镞x擇建立類(lèi)向?qū)В┲链耍究蚣芤呀?jīng)出來(lái)了,
5、編譯后運(yùn)行可以看到如下所示的界面。(組建-全部組件,然后 組建-執(zhí)行)6、 點(diǎn)擊左側(cè)的視圖窗口,可以在三種模式下切換,第三個(gè)是打開(kāi)個(gè)是類(lèi),第二個(gè)是窗體的資源視圖。的源代碼窗口,第一選擇 File View,展開(kāi) test files-Header Files,打開(kāi) testDlg.h,在全局變量下添加如下代碼,然后保存:gllen;/定義整型標(biāo)量 gllen,用于接收數(shù)據(jù)的個(gè)數(shù)CProgressCtrl * pbar; /指向進(jìn)度條的指針,用于操作進(jìn)度條CString strRXDdata; /編輯框顯示的文本,歷次轉(zhuǎn)換值7、 點(diǎn)擊 Recourse View,展開(kāi) test recourse
6、s-Dialog,雙擊 IDD_TEST_DIALOG,編輯的主界面雙擊擊“框?!保瑥棾鋈缦驴?,按確認(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ù)處理,窗口更新等操作:VARIANT variant1;/定義 VARIANT 型變量,用于存放接收到的數(shù)據(jù)COleSafeArray safearray;/定義 safearray 型變量LONG len,k;/定義長(zhǎng)整型變量 len,k BYTE rxdata2048;/定義 BYTE 型數(shù)組 CString stremp
7、1,stremp2;/定義兩個(gè)字符串if(mEvent()=2) 判斷引起m 時(shí)間的原因/如果是接收到特定個(gè)字節(jié)數(shù),則接收到的數(shù)據(jù)variant1 =m1.GetInput();/把接收到的數(shù)據(jù)存放到 VARIANT 型變量里safearray = variant1;/VARIANT 型變量轉(zhuǎn)換為 ColeSafeArray 型變量len = safearray.GetOneDimSize(); for(k=0;klen;k+)safearray.Geement(&k,rxdata+k); /得到接接收到的數(shù)據(jù)放到 BYTE 型數(shù)組 rxdata 里for(k=0;klen;k+)BYTE b
8、t = (*(unsigned char*)(rxdata+k); / 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_SIC,(當(dāng)前電壓值為: +stremp1+ V); /更新靜態(tài)文本控件pbar - Set(temp);/更新進(jìn)度條的當(dāng)前位置strRXDdata += stremp2;/把新的數(shù)據(jù)放到全局的字符串里strRXDdata += stremp1;strRXDdata += Vrn;/字符串加V 后換行
9、SetDlgItemText(IDC_EDIT1,strRXDdata);/更新文本控件的顯示這時(shí)重新編譯一下,看會(huì)不會(huì)錯(cuò)誤,出現(xiàn)下面提示,可以選擇全部組建來(lái)清除。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ò)誤,是由于空間問(wèn)題引起的,當(dāng)添加了編輯框或者“”后再添加,其自動(dòng)加一,就會(huì)出現(xiàn)控件沒(méi)定義。Z:vc+
10、串口上位機(jī)testtestDlg.cpp(32) : error C2065: M1 : undeclared identifierZ: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全部組建編譯一下,看看有沒(méi)有錯(cuò)誤,沒(méi)有錯(cuò)誤就可以運(yùn)行一下,可以看到界面更原來(lái)是一樣的。有錯(cuò)誤就
11、修改一下,省得弄多了,錯(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 = 0; /轉(zhuǎn)換次數(shù)全局變量清零if(!m1.GetPortOpen()/判斷串口是否已經(jīng)打開(kāi)mPort(1); /選擇串1m1.SetPortOpen(TRUE); /打開(kāi)串口 m1.SetRThres
12、hold(2); 收到兩個(gè)字節(jié)m1.SetInputMode(1);/輸入模式選為二進(jìn)制m 事件m1.SetSettings(57600,n,8,1); /設(shè)置串口參數(shù),波特率57600,無(wú)奇偶校驗(yàn),1位停止位,8位數(shù)據(jù)位MessageBox(串口初始化完畢,提示); /提示串口成功初始化else MessageBox(串口被占用,提示); /如果已經(jīng)打開(kāi)串口,消息框提醒pbar = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);/獲得指向 IDC_PROGRESS1的指針 pbar - SetRange(0,1023);/設(shè)置進(jìn)度條的范圍01023pba
13、r - Set(0);/當(dāng)前位置為0m_serial.SetWindowText(關(guān)閉串口);/按鈕顯示狀態(tài)改變可以看到,串口的參數(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ā)送0 xaa 出來(lái),給單片機(jī)接收。添加如下代碼:CByteArray m_Array; /定義字節(jié)數(shù)組 m
14、_Array.RemoveAll(); /字節(jié)數(shù)組清空 m_Array.SetSize(1); /設(shè)定維數(shù)為1m_Array.Se(0,0 xaa); /給 m_array0賦值0m1.SetOutpOleVariant(m_Array);/由于 SetOutput 函數(shù)的參數(shù)為 VARIANT 型,必須強(qiáng)制轉(zhuǎn)換后才能發(fā)送同樣地,雙擊另外一個(gè)按鈕,給串口操作按鈕添加代碼,用于關(guān)閉或者打開(kāi)串口。添加如下代碼:if(!m1.GetPortOpen()/判斷串口是否已經(jīng)打開(kāi)m1.SetPortOpen(TRUE); /如果串口是關(guān)閉的,則打開(kāi)串口m_serial.SetWindowText(關(guān)閉串口); /按鈕顯示狀態(tài)改變elsem1.SetPortOpen(FALSE); /如果已經(jīng)打開(kāi)串口,則關(guān)閉串口 m_serial.SetWindow
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版綠色建筑施工現(xiàn)場(chǎng)環(huán)保設(shè)施租賃合同2篇
- 2025年林業(yè)重點(diǎn)工程項(xiàng)目樹(shù)木種植承包合同范本3篇
- 2025年水上運(yùn)輸船舶檢驗(yàn)與認(rèn)證合同3篇
- 2025年度大連建筑工程施工合同施工場(chǎng)地占用協(xié)議3篇
- 二零二五版砍樹(shù)承包合同聯(lián)合森林碳匯交易協(xié)議2篇
- 二零二五版大豆期貨交易委托合同樣本2篇
- 二零二四上海離婚協(xié)議書(shū)定制與婚姻法律風(fēng)險(xiǎn)評(píng)估、咨詢(xún)、代理、調(diào)解及訴訟服務(wù)合同3篇
- 2024新借款合同范本
- 2025年度綠色屋頂綠化租賃項(xiàng)目合同4篇
- 二零二五年度玻璃幕墻保溫隔熱材料供應(yīng)合同樣本3篇
- 充電樁項(xiàng)目運(yùn)營(yíng)方案
- 2024年農(nóng)民職業(yè)農(nóng)業(yè)素質(zhì)技能考試題庫(kù)(附含答案)
- 高考對(duì)聯(lián)題(對(duì)聯(lián)知識(shí)、高考真題及答案、對(duì)應(yīng)練習(xí)題)
- 新版《鐵道概論》考試復(fù)習(xí)試題庫(kù)(含答案)
- 【律師承辦案件費(fèi)用清單】(計(jì)時(shí)收費(fèi))模板
- 高中物理競(jìng)賽真題分類(lèi)匯編 4 光學(xué) (學(xué)生版+解析版50題)
- Unit1FestivalsandCelebrations詞匯清單高中英語(yǔ)人教版
- 西方經(jīng)濟(jì)學(xué)-高鴻業(yè)-筆記
- 2024年上海市中考語(yǔ)文試題卷(含答案)
- 幼兒園美術(shù)教育研究策略國(guó)內(nèi)外
- 生豬養(yǎng)殖生產(chǎn)過(guò)程信息化與數(shù)字化管理
評(píng)論
0/150
提交評(píng)論