計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)報(bào)告_第1頁
計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)報(bào)告_第2頁
計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)報(bào)告_第3頁
計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)報(bào)告_第4頁
計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、青島理工大學(xué)理學(xué)院電子信息與技術(shù)專業(yè)計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)報(bào)告指導(dǎo)教師:夏欣學(xué)生班級(jí):電子082學(xué)生學(xué)號(hào):200801108學(xué)生姓名:孫艷雙報(bào)告完成日期:2011- 05-29 一、實(shí)驗(yàn)內(nèi)容一1 實(shí)驗(yàn)要求:學(xué)會(huì)vc+串口上位機(jī)編程2 實(shí)施過程:程序的編寫:1、 打開vc+6.0建立基于對話框的mfc應(yīng)用程序test,創(chuàng)建應(yīng)用程序類型為:基本對話框,其他為默認(rèn)設(shè)置,點(diǎn)擊完成。 2、 在項(xiàng)目中插入mscomm控件:工程-增加到工程-components and controls-雙擊registered activex controls-選擇microsoft communications control

2、, version 6.0-insert,按默認(rèn)值添加,你會(huì)發(fā)現(xiàn)多了個(gè)電話圖標(biāo),這是增加后串口通信控件。3、 刪除確認(rèn)、取消和提示框,添加“電話”、進(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ū)懗鰜磉\(yùn)行時(shí)“電話”標(biāo)志會(huì)自動(dòng)消失。5、 查看-建立類向?qū)fc classwizard-member viariable,選擇classname為ctestdlg的類,

3、control id為mscomm1,雙擊它,為它添加控制變量m_comm1。類似的,選擇idc_button2添加控制變量m_serial。(建立類向?qū)б部梢杂覔羧缓笤趶棾龅目旖莶藛卫镞x擇建立類向?qū)В┲链?,基本框架已?jīng)出來了,編譯后運(yùn)行可以看到如下所示的界面。(組建-全部組件,然后 組建-執(zhí)行)6、 點(diǎn)擊左側(cè)的視圖窗口,可以在三種模式下切換,第三個(gè)是打開我們的源代碼窗口,第一個(gè)是類,第二個(gè)是窗體的資源視圖。選擇file view,展開test files-header files,打開testdlg.h,在全局變量下添加如下代碼,然后保存:int gllen;/定義整型標(biāo)量gllen,用于記

4、錄接收數(shù)據(jù)的個(gè)數(shù)cprogressctrl * pbar; /指向進(jìn)度條的指針,用于操作進(jìn)度條cstring strrxddata; /編輯框顯示的文本,記錄歷次轉(zhuǎn)換值7、 點(diǎn)擊recourse view,展開test recourses-dialog,雙擊idd_test_dialog,編輯我們的主界面對話框。雙擊擊“電話”,彈出如下對話框,按確認(rèn)鍵:vc會(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型變量,

5、用于存放接收到的數(shù)據(jù)colesafearray safearray;/定義safearray型變量long len,k;/定義長整型變量len,kbyte rxdata2048;/定義byte型數(shù)組cstring stremp1,stremp2;/定義兩個(gè)字符串if(m_comm1.getcommevent()=2) /判斷引起oncomm時(shí)間的原因/如果是接收到特定個(gè)字節(jié)數(shù),則讀取接收到的數(shù)據(jù)variant1 = m_comm1.getinput();/把接收到的數(shù)據(jù)存放到variant型變量里safearray = variant1;/variant型變量轉(zhuǎn)換為colesafearray型

6、變量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%2)=0)if(k+1)6); /高低字節(jié)合并成實(shí)際的轉(zhuǎn)換結(jié)果,注意轉(zhuǎn)換結(jié)果是左對齊 stremp1.format(%2.2f,(2.56*temp/1024);/計(jì)算成實(shí)際電壓值setdlgitemtext(idc_static,

7、(當(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);/更新文本控件的顯示這時(shí)重新編譯一下,看會(huì)不會(huì)有什么錯(cuò)誤,出現(xiàn)下面提示,可以選擇全部組建來清除。link : lnk4073: cannot create map for .ilk file; linking noninc

8、rementally全部組建編譯一下,看看有沒有錯(cuò)誤,沒有錯(cuò)誤就可以運(yùn)行一下,可以看到界面更原來是一樣的。8、 在源碼編輯里,打開testdlg.cpp文件,進(jìn)行窗口初始化函數(shù)的編寫。找到bool ctestdlg:oninitdialog()函數(shù),在seticon(m_hicon, false); / set small icon/ todo: add extra initialization here后面添加如下初始化代碼:gllen = 0; /記錄轉(zhuǎn)換次數(shù)全局變量清零if(! m_comm1.getportopen()/判斷串口是否已經(jīng)打開m_comm1.setcommport(1);

9、 /選擇串口號(hào)1m_comm1.setportopen(true); /打開串口m_comm1.setrthreshold(2); /收到兩個(gè)字節(jié)引發(fā)oncomm事件m_comm1.setinputmode(1);/輸入模式選為二進(jìn)制m_comm1.setsettings(57600,n,8,1); /設(shè)置串口參數(shù),波特率57600,無奇偶校驗(yàn),1位停止位,8位數(shù)據(jù)位messagebox(串口初始化完畢,提示); /提示串口成功初始化else messagebox(串口被占用,提示); /如果已經(jīng)打開串口,消息框提醒pbar = (cprogressctrl*)getdlgitem(idc_p

10、rogress1);/獲得指向idc_progress1的指針pbar - setrange(0,1023);/設(shè)置進(jìn)度條的范圍01023pbar - setpos(0);/當(dāng)前位置為0m_serial.setwindowtext(關(guān)閉串口);/按鈕顯示狀態(tài)改變可以看到,串口的參數(shù)等等都在在這里初始化的,可以根據(jù)自己的需要修改的,具體可以查看vc+里的詳細(xì)介紹,看看有哪些參數(shù)可以給我們修改來用。添加后再編譯一下,運(yùn)行后可以看到多了一個(gè)串口初始化的提示信息窗口。至此,我們已經(jīng)完成了主要的串口操作及界面,剩下的就是兩個(gè)按鈕的操作了。9、 回到資源視圖的idd_test_dialog窗口,雙擊開始轉(zhuǎn)

11、換按鈕,給它添加事件,點(diǎn)擊后pc通過串口發(fā)送0xaa出來,給單片機(jī)接收。添加如下代碼:cbytearray m_array; /定義字節(jié)數(shù)組m_array.removeall(); /字節(jié)數(shù)組清空m_array.setsize(1); /設(shè)定維數(shù)為1m_array.setat(0,0xaa); /給m_array0賦值0m_comm1.setoutput(colevariant(m_array);/由于setoutput函數(shù)的參數(shù)為variant型,必須強(qiáng)制轉(zhuǎn)換后才能發(fā)送同樣地,雙擊另外一個(gè)按鈕,給串口操作按鈕添加代碼,用于關(guān)閉或者打開串口。添加如下代碼:if(! m_comm1.getpor

12、topen()/判斷串口是否已經(jīng)打開 m_comm1.setportopen(true); /如果串口是關(guān)閉的,則打開串口m_serial.setwindowtext(關(guān)閉串口); /按鈕顯示狀態(tài)改變elsem_comm1.setportopen(false); /如果已經(jīng)打開串口,則關(guān)閉串口m_serial.setwindowtext(打開串口);/按鈕顯示狀態(tài)改變至此,一個(gè)簡單的串口上位機(jī)軟件編寫完成了,可以用來測試下,通過單片機(jī)往串口里發(fā)送數(shù)據(jù),可以看到主窗口的的轉(zhuǎn)換結(jié)果,已經(jīng)進(jìn)度條顯示電壓值變化。要把這個(gè)程序拿出來用,只需把vc+串口上位機(jī)testrelease的test.exe拷出來

13、用就行。release可以在編譯窗口里選擇win32 release,然后重新編譯一下就出來了。3 最終完成情況:4 遇到的問題、調(diào)試及總結(jié):第7步驟是可能會(huì)遇到一下問題:如果全部組建編譯出現(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_mscomm1 : u

14、ndeclared identifierz:vc+串口上位機(jī)testtestdlg.cpp(139) : error c2065: idc_edit1 : undeclared identifier解決方法是,在recourseview里,打開窗體idd_test_dialog,右擊“電話”或者編輯框等其它出錯(cuò)的控件,右擊選擇屬性,在常規(guī)里修改id,這里的程序,除button有1、2兩個(gè)之外,其它都是1二、實(shí)驗(yàn)內(nèi)容二1 實(shí)驗(yàn)要求:完成停止等待協(xié)議模擬2 實(shí)施過程:實(shí)驗(yàn)步驟:1 建立基于對話框的project2 加入edit框兩個(gè),按鈕一個(gè)(可以把按鈕命名為“copy”)3 完成任務(wù)為控制編輯框

15、:單擊“copy”按鈕即可實(shí)現(xiàn)把一個(gè)對話框的內(nèi)容copy到另外一個(gè)對話框中具體實(shí)現(xiàn)方法:a 給兩個(gè)編輯框添加成員變量,(我們可以先添加為string類型),分別名為m_input, m_output b 在單擊“copy”按鈕的函數(shù)里面添加updatedata(true); m_output=m_input; updatedata(false); c 編譯運(yùn)行,在m_input 所對應(yīng)的edit中輸入數(shù)據(jù),點(diǎn)擊“copy”按鈕,即可實(shí)現(xiàn)3中功能4 實(shí)現(xiàn)串口通信:添加一個(gè)“發(fā)送“按鈕。然后,請按照給大家的文件說明去做。注意文件中給出的程序應(yīng)該放在哪里,不要亂放。另外,修改一些程序后,及時(shí)的編譯,

16、如果不能通過編譯,可以及時(shí)修改,避免改的程序多了,不知道哪里出了問題。5 實(shí)現(xiàn)數(shù)據(jù)鏈路層的停止-等待協(xié)議。協(xié)議流程圖及說明在下面。發(fā)送方,在用戶點(diǎn)擊“發(fā)送”按鈕后,并不是直接把數(shù)據(jù)送到串口,而是首先構(gòu)成幀,然后發(fā)送數(shù)據(jù)。接受方收到數(shù)據(jù)后,不直接把數(shù)據(jù)顯示到編輯框中,而是采用停止等待協(xié)議的方法去測試數(shù)據(jù)的正確與否,正確在送到編輯框中顯示,并回送確認(rèn)信息;否則按照協(xié)議發(fā)否認(rèn)信息。對數(shù)據(jù)鏈路層的協(xié)議3編程,針對上面的圖給出的流程圖。a 發(fā)送方流程圖(按發(fā)送按鈕后的程序,即在單擊發(fā)送按鈕的函數(shù)中)b接收方流程圖(在串口事件函數(shù)中)c源代碼發(fā)送端:(client.cpp)#include #includ

17、e #include #pragma comment(lib,ws2_32.lib) #define server_port7300 /偵聽端口客戶端向服務(wù)器傳送的結(jié)構(gòu):struct bagchar packet;void main(int argc, char *argv)word wversionrequested;wsadata wsadata;int ret,i,ra,data=0;socket sclient,slisten; struct sockaddr_in saserver;/地址信息struct bag bag;char *ptr = (char *)&bag;bool f

18、success = true;winsock初始化:wversionrequested = makeword(2, 2);/希望使用的winsock dll的版本ret = wsastartup( wversionrequested, &wsadata );if (ret != 0)printf(wsastartup() failed!n);return;確認(rèn)winsock dll支持版本2.2:if (lobyte(wsadata.wversion) != 2 | hibyte( wsadata.wversion ) != 2 )wsacleanup();printf(invalid win

19、sock version!n);return;創(chuàng)建socket,使用tcp協(xié)議:sclient = socket(af_inet, sock_stream, ipproto_tcp);slisten = socket(af_inet, sock_stream, ipproto_tcp);if(sclient = invalid_socket)wsacleanup();printf(socket() failed!n);return;構(gòu)建服務(wù)器地址信息:saserver.sin_family = af_inet;/地址家族saserver.sin_port = htons(server_port

20、);/轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)序連接服務(wù)器:ret = connect(sclient, (struct sockaddr *)&saserver, sizeof(saserver);if (ret = socket_error)printf(connect() successed!n);closesocket(sclient);/關(guān)閉套接字wsacleanup();return;按照預(yù)定協(xié)議,客戶端將發(fā)送一個(gè)數(shù)字:for(i=97;i=104;i+)ra = rand()%11;if(ra%5 = 1) data+=i;else data=i;bag.packet=data;ret = send(sc

21、lient, (char *)&bag, sizeof(bag), 0);ret = recv(slisten, ptr, sizeof(bag), 0);if(bag.packet!=i)i-;printf(send()successed!n);continue;else if(bag.packet=i)printf(packet %d has been sent!n,i+1);closesocket(sclient);wsacleanup();接受端(server.cpp):#include #include #include #include #pragma comment(lib,ws

22、2_32.lib) #define server_port7300 /偵聽端口客戶端向服務(wù)器傳送的結(jié)構(gòu):struct bagchar packet;void main()word wversionrequested;wsadata wsadata;int ret,nleft,length;socket slisten, sserver; /偵聽套接字,連接套接字struct sockaddr_in saserver, saclient;/地址信息struct bag bag;char *ptr,*pp;winsock初始化:wversionrequested = makeword(2, 2);

23、/希望使用的winsock dll的版本ret = wsastartup(wversionrequested, &wsadata);if (ret != 0)printf(wsastartup() failed!n);return;確認(rèn)winsock dll支持版本2.2:if (lobyte(wsadata.wversion) != 2 | hibyte( wsadata.wversion ) != 2 )wsacleanup();printf(invalid winsock version!n);return;創(chuàng)建socket,使用tcp協(xié)議:slisten = socket(af_ine

24、t, sock_stream, ipproto_tcp);if(slisten = invalid_socket)wsacleanup();printf(socket() failed!n);return;構(gòu)建本地地址信息:saserver.sin_family = af_inet;/地址家族saserver.sin_port = htons(server_port);/轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)序saserver.sin_addr.s_un.s_addr = htonl(inaddr_any);/使用inaddr_any指示任意地址綁定:ret = bind(slisten, (struct socka

25、ddr *)&saserver, sizeof(saserver);if (ret = socket_error)printf(bind() failed! code:%dn, wsagetlasterror();closesocket(slisten);/關(guān)閉套接字wsacleanup();return;偵聽連接請求:ret = listen(slisten, 5);if (ret = socket_error)printf(listen() failed! code:%dn, wsagetlasterror();closesocket(slisten);/關(guān)閉套接字wsacleanup()

26、;return;printf(waiting for client connecting!n);printf(tips : ctrl+c to quit!n);阻塞等待接受客戶端連接:length = sizeof(saclient);sserver = accept(slisten, (struct sockaddr *)&saclient, &length);if(sserver = invalid_socket)printf(accept() failed! code:%dn, wsagetlasterror();closesocket(slisten);/關(guān)閉套接字wsacleanup();ret

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論