第一篇:嵌入式Linux網(wǎng)絡(luò)通信實驗
淮陰工學(xué)院
Linux操作系統(tǒng)及嵌入式應(yīng)用
實驗報告
系(院): 計算機工程學(xué)院 專
業(yè):計算機科學(xué)與技術(shù)(物聯(lián)網(wǎng)工程)班
級: 物聯(lián)網(wǎng)1111
姓
名: 蔣振 學(xué)
號:1111307116 指導(dǎo)教師:
孫成富
學(xué)年學(xué)期:
2014 ~ 2015 學(xué)年 第 學(xué)期
實驗1 Socket全雙工通信實驗 實驗?zāi)康?/p>
1)了解網(wǎng)絡(luò)套接字編程
2)掌握網(wǎng)絡(luò)通信服務(wù)器和客戶端的工作過程 3)利用多線程實現(xiàn)全雙工通信 4)下載并運行網(wǎng)絡(luò)應(yīng)用程序
2實驗環(huán)境
1)宿主機:Fedora 10 2)嵌入式Linux軟硬件系統(tǒng):TQ2440(基于S3C2440A)開發(fā)板
3實驗準備
3.1Linux下的多線程編程
進程是程序執(zhí)行時的一個實例,即它是程序已經(jīng)執(zhí)行到何種程度的數(shù)據(jù)結(jié)構(gòu)的匯集。從內(nèi)核的觀點看,進程的目的就是擔當分配系統(tǒng)資源(CPU時間、內(nèi)存等)的基本單位。
線程是進程的一個執(zhí)行流,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。一個進程由幾個線程組成(擁有很多相對獨立的執(zhí)行流的用戶程序共享應(yīng)用程序的大部分數(shù)據(jù)結(jié)構(gòu)),線程與同屬一個進程的其他的線程共享進程所擁有的全部資源。
本實驗使用多線程解決了并行通信的難題。關(guān)于多線程的函數(shù)主要是使用pthread.h頭文件中定義的多線程操作函數(shù),如pthread_create、pthread_cancel等。
3.2TCP/IP概述
3.2.1TCP/IP的分層模型
OSI協(xié)議參考模型,是基于國際標準化組織(ISO)的建議發(fā)展起來的,它分為7個層次:應(yīng)用層、表示層、會話層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層及物理層。這個7層的協(xié)議模型雖然規(guī)定得非常細致和完善,但在實際中卻得不到廣泛 的應(yīng)用,其重要的原因之一就在于它過于復(fù)雜。但它仍是此后很多協(xié)議模型的基礎(chǔ)。與此相區(qū)別的TCP/IP協(xié)議模型將OSI的7層協(xié)議模型簡化為4層,從而更有利于實現(xiàn)和使用。
TCP/IP的協(xié)議參考模型和OSI協(xié)議參考模型的對應(yīng)關(guān)系如下圖 1所示:
SYN J SYN K,ACK J+1 ACK K+1 圖1 TCP/IP協(xié)議與OSI協(xié)議參考模型對比圖
3.2.2TCP的三次握手
TCP是面向連接的,所謂面向連接,就是當計算機雙方通信時必需先建立連接,然后進行數(shù)據(jù)通信,最后拆除連接三個過程。TCP在建立連接時又分三步走:
第一步(A->B):主機A向主機B發(fā)送一個包含SYN即同步(Synchronize)標志的TCP報文,SYN同步報文會指明客戶端使用的端口以及TCP連接的初始序號;
第二步(B->A):主機B在收到客戶端的SYN報文后,將返回一個SYN+ACK的報文,表示主機B的請求被接受,同時TCP序號被加一,ACK即確認(Acknowledgment)。
第三步(A->B):主機A也返回一個確認報文ACK給服務(wù)器端,同樣TCP序列號被加一,到此一個TCP連接完成。
3.3套接字(socket)概述
3.3.1套接字類型
1)流式套接字(SOCK_STREAM)
流式套接字提供可靠的、面向連接的通信流;它使用TCP協(xié)議,從而保證了數(shù)據(jù)傳輸?shù)目煽啃院晚樞蛐浴?)數(shù)據(jù)報套接字(SOCK_DGRAM)
數(shù)據(jù)報套接字定義了一種無可靠、面向無連接的服務(wù),數(shù)據(jù)通過相互獨立的報文進行傳輸,是無序的,并且不保證是可靠、無差錯的。它使用數(shù)據(jù)報協(xié)議UDP
3)原始套接字(SOCK_RAW)
原始套接字允許對底層協(xié)議如IP或ICMP進行直接訪問,它功能強大但使用較為不便,主要用于一些協(xié)議的開發(fā)。3.3.2
套接字編程
使用TCP時Socket編程流程圖如圖2所示。
服務(wù)器端 socket bind bind listen accept recv/recvfrom send/sendto close connect send/sendto recv/recvfrom close客戶端 socket
圖2 TCP時Socket編程流程圖
使用UDP時Socket編程如圖3所示。
socket listen accept recvfrom sendto或 socket connect send recv close或 recv send closesendto recvfrom或或 圖3 TCP時Socket編程流程圖
實驗過程
4.1
簡單的Socket通信程序設(shè)計
在Fedora 10操作系統(tǒng)的/home目錄下創(chuàng)建NetCommunicator目錄,并新建client.c和server.c源文件,NetCommunicator目錄如圖4所示。
圖4 NetCommunicator截圖
分別編寫Socket通信的客戶端和服務(wù)器端源代碼。編寫完畢,使用gcc編譯上述client.c和server.c源文件生成client和server可執(zhí)行程序(x86平臺),編譯過程如圖5所示。使用arm-linux-gcc編譯上述client.c和server.c源文件生成a_client和a_server可執(zhí)行程序(ARM平臺)。編譯過程如圖6所示.圖5 編譯x86 Socket通信程序過程截圖
圖6 編譯ARM平臺的可執(zhí)行程序
PC機測試,測試結(jié)果如下圖所示:
圖7 執(zhí)行服務(wù)器端程序
圖8 執(zhí)行客戶端程序
圖9 服務(wù)器端接收到客戶端發(fā)來的消息截圖
使用gcc-linux-gcc生成ARM平臺下的可執(zhí)行程序a_client和a_server,編譯結(jié)果如圖10所示。
圖10 編譯ARM平臺可執(zhí)行程序
4.2
全雙工Socket通信程序設(shè)計
為了實現(xiàn)全雙工通信,服務(wù)端進程和客戶端進程均使用了兩個線程,一個負責收,另一個負責發(fā)。
在NetCommunicator目錄,并新建clientV2.c和serverV2.c源文件,如圖11所示,編寫完畢,編譯通過生成clientV2和serverV2可執(zhí)行程序。
圖11 NetCommunicator工作目錄
PC機測試,測試結(jié)果如下圖所示:
圖12 客戶端進程
圖13 服務(wù)器端進程
實驗總結(jié)
通過本次實驗,了解了Linux環(huán)境下的Socket程序設(shè)計流程,對網(wǎng)絡(luò)編程有了一定的了解,提高了動手實踐的能力。
第二篇:嵌入式linu學(xué)習心得
嵌入式Linux學(xué)習心得
1、Linux命令
ls:查看目錄-l以列表方式查看;ls –l 與ll的功能一樣 pwd: 查看當前的目錄
cd:改變當前操作目錄cd /直接跳到根目錄 cd..回到上一級目錄 cat: 打印顯示當前文件的內(nèi)容信息
mkdir:創(chuàng)建目錄
fdisk: 查看硬盤分區(qū)信息,-l以列表方式查看
->代表是鏈接文件,類似window下的快捷方式。
cp: 復(fù)制命令,例子cp 文件名 /home/dir/
mv: 移動或改名,如mv sonf.confsonf.txt(改名)移動:mv sonf.conf / rm:刪除命令,如rm –f test.c;如刪除目錄rm –fr d
man:查看某個命令的幫助,man 命令
2、各系統(tǒng)目錄的功能
drw—r—w--:d代表是目錄,drw代表當前用戶的權(quán)限,r代表組用戶的權(quán)限,w代表其它用戶的權(quán)限。x代表有執(zhí)行權(quán)限。
/boot/gruff.conf: 啟動引導(dǎo)程序
/dev:brw—rw--:b代表是塊設(shè)備。Linux設(shè)備有三種,塊設(shè)備(b開頭)、字符設(shè)備(c開頭)、網(wǎng)絡(luò)設(shè)備。had代表第一個硬盤,hdb代表第二個硬盤。Hdb2代表第二塊硬盤的第二個分區(qū)。3,67代表主設(shè)備為3,從設(shè)備為67./etc:存放的是系統(tǒng)的配置文件。Inittab文件存放不同啟動方式下必須啟動的進程。Inittab文件中有6個啟動level,wait中對應(yīng)著6個level的目錄,respawn代表當一個進程被意外終止了,但會自動啟動的進程,如守護進程。rc.d目錄中存放了一個rc.sysinit文件,里面存放系統(tǒng)初始化配置信息。/etc還有一個vsftpd里面存放tcp、ftp的配置。
/home : 用戶目錄,存放用戶的文件,/lib:存放庫文件,后綴為so的文件代表動態(tài)鏈接庫。
/lost+found:系統(tǒng)意外終止,存放一些可以找回的文件。
/mnt:掛載外部設(shè)備,如掛載光驅(qū):mount –t /dev/cdrom/mnt/cdrom,如
果在雙系統(tǒng)中,要查看windows中D盤的文件,首先應(yīng)該將D盤的文件映射過來,mount –t /dev/hda2/mnt/windows/d
/opt:用戶安裝的應(yīng)用程序
/proc:是系統(tǒng)運行的映射,比較重要。里面的文件數(shù)字代表進程號。每個進程號目錄下包含進程的基本信息。還有其他信息,如cpuinfo等,內(nèi)核支持的文件系統(tǒng)filesystem等。系統(tǒng)支持的中斷interrupts,iomen代表內(nèi)存分配情況。ioport存放IO端口號。還有分區(qū)信息,modole信息,狀態(tài)信息,版本信息
對于Linux的設(shè)備驅(qū)動程序,有兩種加載模式,一種是直接加載進linux內(nèi)核,一種是以模塊的方式加載到內(nèi)核。
/sbin: 系統(tǒng)管理的一些工具。如poweroff關(guān)機工具。
/usr: 安裝系統(tǒng)時很多文件放在此目錄下面,包含一些更新等,include包含的頭文件,lib 是Linux的庫文件,src包含Linux2.4的內(nèi)核源碼
/var:存放是臨時變量
3、
第三篇:嵌入式實驗2
南昌航空大學(xué)實驗報告
二0一一 年 10月 16日
課程名稱: 嵌入式系統(tǒng) 實驗名稱: 串行端口程序設(shè)計 班 級: 080611 學(xué)生姓名: 曹啟斌 學(xué)號: 08061107 指導(dǎo)教師評定: 簽名:
一、實驗?zāi)康?了解在linux環(huán)境下串行程序設(shè)計的基本方法。掌握終端的主要屬性及設(shè)置方法,熟悉終端IO函數(shù)的使用。3 學(xué)習使用多線程來完成串口的收發(fā)處理。
二、實驗內(nèi)容
讀懂程序源代碼,學(xué)習終端IO函數(shù)tcgetattr(), tcsetattr(),tcflush()的使用方法,學(xué)習將多線程編程應(yīng)用到串口的接收和發(fā)送程序設(shè)計中。
三、預(yù)備知識
1、有C語言基礎(chǔ)。
2、掌握在LINUX下常用編輯器的使用。
3、掌握Makefile 的編寫和使用。
4、掌握Linux下的程序編譯與交叉編譯過程
四、實驗設(shè)備及工具
硬件:UP-NETARM2410-S嵌入式實驗儀,PC機pentumn500以上, 硬盤40G以上,內(nèi)存大于128M。
軟件:PC機操作系統(tǒng)REDHAT LINUX 9.0 +MINICOM + AMRLINUX開發(fā)環(huán)境
五、實驗原理
Linux 操作系統(tǒng)從一開始就對串行口提供了很好的支持,為進行串行通訊提供了大量的函數(shù),我們的實驗主要是為掌握在LINUX中進行串行通訊編程的基本方法。
1.程序流程圖
程序流程圖如圖2-3所示:
圖2-3 程序流程圖
2串口操作需要的頭文件
#include /*線程庫定義*/ 3打開串口 在 Linux 下串口文件是位于 /dev 下,串口一為/dev/ttyS0,串口二為 /dev/ttyS1,打開串口是通過使用標準的文件打開函數(shù)操作: int fd;/*以讀寫方式打開串口*/ fd = open(“/dev/ttyS0”, O_RDWR);if(-1 == fd){ perror(“ 提示錯誤!”);} 4設(shè)置串口 最基本的設(shè)置串口包括波特率設(shè)置,效驗位和停止位設(shè)置。串口的設(shè)置主要是設(shè)置 struct termios 結(jié)構(gòu)體的各成員值。 struct termio { unsigned short c_iflag;/* 輸入模式標志 */ unsigned short c_oflag;/* 輸出模式標志 */ unsigned short c_cflag;/* 控制模式標志 */ unsigned short c_lflag;/* local mode flags */ unsigned char c_line;/* line discipline */ unsigned char c_cc[NCC];/* control characters */ };設(shè)置這個結(jié)構(gòu)體很復(fù)雜,可以參考man手冊或者由趙克佳、沈志宇編寫的《UNIX程序編寫教程》,我這里就只考慮常見的一些設(shè)置: 波特率設(shè)置: 下面是修改波特率的代碼: struct termios Opt;tcgetattr(fd, &Opt);cfsetispeed(&Opt,B19200);/*設(shè)置為19200Bps*/ cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);校驗位和停止位的設(shè)置: 無效驗 8位 Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS8;奇效驗(Odd)7位 Option.c_cflag |= ~PARENB;Option.c_cflag &= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;偶效驗(Even)7位 Option.c_cflag &= ~PARENB;Option.c_cflag |= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;Space效驗 7位 Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= &~CSIZE;Option.c_cflag |= CS8;設(shè)置停止位: 1位: options.c_cflag &= ~CSTOPB;2位: options.c_cflag |= CSTOPB;需要注意的是,如果不是開發(fā)終端之類的,只是串口傳輸數(shù)據(jù),而不需要串口來處理,那么使用原始模式(Raw Mode)方式來通訊,設(shè)置方式如下: options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);/*Input*/ options.c_oflag &= ~OPOST;/*Output*/ 5讀寫串口 設(shè)置好串口之后,讀寫串口就很容易了,把串口當作文件讀寫就可以了。發(fā)送數(shù)據(jù): char buffer[1024];int Length=1024;int nByte;nByte = write(fd, buffer ,Length)讀取串口數(shù)據(jù): 使用文件操作read函數(shù)讀取,如果設(shè)置為原始模式(Raw Mode)傳輸數(shù)據(jù),那么read函數(shù)返回的字符數(shù)是實際串口收到的字符數(shù)。 可以使用操作文件的函數(shù)來實現(xiàn)異步讀取,如fcntl,或者select等來操作。char buff[1024];int Len=1024;int readByte = read(fd, buff, Len);6關(guān)閉串口 關(guān)閉串口就是關(guān)閉文件。close(fd);7空MODEM通訊連接電纜 一般進行串口調(diào)試使用空MODEM連接電纜,其接線方式如下圖2-4所示: 圖2-4 實用RS-232C通訊連線 六、實驗步驟 1.2.3.4.進入expbasic