第11章應(yīng)用程序開發(fā)哈爾濱理工大學(xué)電子郵件系統(tǒng)_第1頁
第11章應(yīng)用程序開發(fā)哈爾濱理工大學(xué)電子郵件系統(tǒng)_第2頁
第11章應(yīng)用程序開發(fā)哈爾濱理工大學(xué)電子郵件系統(tǒng)_第3頁
第11章應(yīng)用程序開發(fā)哈爾濱理工大學(xué)電子郵件系統(tǒng)_第4頁
第11章應(yīng)用程序開發(fā)哈爾濱理工大學(xué)電子郵件系統(tǒng)_第5頁
已閱讀5頁,還剩93頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第11章

運用程序開發(fā)本章主要內(nèi)容串口運用程序的編寫方法。TCP/IP協(xié)議以及Socket的編寫方法。基于uClinux音頻接口的運用程序的編寫方法。鍵盤和LCD的運用程序的編寫方法。漢字音樂點播程序的編寫實例。第十一章目錄1.串口運用程序串口主要函數(shù)引見串口舉例

2.網(wǎng)絡(luò)運用TCP/IP網(wǎng)絡(luò)運用Web效力器運用3音頻設(shè)備運用常用音頻文件格式播放WAV文件舉例4鍵盤及LCD顯示運用LCD引見鍵盤實現(xiàn)5漢字音樂點播運用第十一章目錄1.串口運用程序串口主要函數(shù)引見串口舉例

2.網(wǎng)絡(luò)運用TCP/IP網(wǎng)絡(luò)運用Web效力器運用3音頻設(shè)備運用常用音頻文件格式播放WAV文件舉例4鍵盤及LCD顯示運用LCD引見鍵盤實現(xiàn)3音頻設(shè)備運用本章從一個針對運轉(zhuǎn)在S3C44B0X上的uClinux操作系統(tǒng)進(jìn)展運用程序的開發(fā)入手,給出Windows操作系統(tǒng)平臺上運用HitoolforuClinux等工具開發(fā)的多種運用程序。本章主要引見了:串口運用程序的編寫方法。TCP/IP協(xié)議以及Socket的編寫方法?;趗Clinux音頻接口的運用程序的編寫方法。鍵盤和LCD的運用程序的編寫方法。漢字音樂點播程序的編寫實例。11.1串口運用程序S3C44B0X提供2個UART收發(fā)器,對它們可以操作在中斷方式或DMA方式。它們內(nèi)置波特率發(fā)生器,波特率發(fā)生器的時鐘源為S3C44B0X的系統(tǒng)運用,所以最高速率可達(dá)115.2Kbps。二個串口有單獨的波特率發(fā)生器,接納、發(fā)送和控制單元,支持紅外方式的傳送和接納。同時,在S3C44B0X串口的接納器和發(fā)送器中都有16字節(jié)的FIFO,F(xiàn)IFO可以有效的降低接納器和發(fā)送器對CPU的中斷頻率,提高發(fā)送和接納的效率。串口設(shè)備的可配置參數(shù)包括波特率,起始位數(shù)量,數(shù)據(jù)位數(shù)量,停頓位數(shù)量和流量控制協(xié)議。在Linux操作系統(tǒng)中,設(shè)備驅(qū)動是以主設(shè)備號為主,每個設(shè)備都有獨一的主設(shè)備號和從設(shè)備號。11.1.1串行口主要函數(shù)引見1.翻開串口在Linux下串口文件是位于/dev下,串口0為/dev/ttyS0,串口1為/dev/ttyS1,O_RDWR是以讀寫方式翻開串口,O_NOCTTY表示該程序不會成為控制終端,防止了當(dāng)在鍵盤輸入類似ctrl+c的命令后,終止程序的運轉(zhuǎn)。翻開串口是經(jīng)過運用規(guī)范的文件翻開函數(shù)操作: intfd; fd=open("/dev/ttyS0",O_RDWR); if(-1==fd){ perror("提示錯誤!"); }11.1.1串行口主要函數(shù)引見2.設(shè)置串口 最根本的設(shè)置串口包括波特率設(shè)置,效驗位和停頓位設(shè)置。串口的設(shè)置主要是設(shè)置如下structtermios構(gòu)造體的各成員值:structtermios { unsignedshortc_iflag; //輸入方式標(biāo)志unsignedshortc_oflag; //輸出方式標(biāo)志 unsignedshortc_cflag; //控制方式標(biāo)志unsignedshortc_lflag; //localmodeflagsunsignedcharc_line; //linediscipline unsignedcharc_cc[NCC];//controlcharacters}; 11.1.1串行口主要函數(shù)引見經(jīng)過對c_cflag的賦值,設(shè)置波特率,字符大小,使能本地銜接,使能串行口驅(qū)動讀取輸入數(shù)據(jù)。經(jīng)過設(shè)置c_iflag,控制端口對字符的輸入處置過程,IGNPAR符號常量表示忽略奇偶性錯誤的字節(jié),不對輸入數(shù)據(jù)進(jìn)展任何校驗,ICRNL將回車符映射為換行符。這里就只思索常見的一些設(shè)置: (1)波特率設(shè)置: 下面是修正波特率的代碼: structtermiosOpt; tcgetattr(fd,&Opt); cfsetispeed(&Opt,B19200);//設(shè)置為19200Bps cfsetospeed(&Opt,B19200); tcsetattr(fd,TCANOW,&Opt);11.1.1串行口主要函數(shù)引見(2)校驗位和停頓位的設(shè)置: ①無效驗8位 Option.c_cflag&=~PARENB; Option.c_cflag&=~CSTOPB; Option.c_cflag&=~CSIZE; Option.c_cflag|=~CS8;③偶效驗(Even)7位 Option.c_cflag&=~PARENB; Option.c_cflag|=~PARODD; Option.c_cflag&=~CSTOPB; Option.c_cflag&=~CSIZE; Option.c_cflag|=~CS7;②奇效驗(Odd)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;11.1.1串行口主要函數(shù)引見 ⑤設(shè)置停頓位 1位:options.c_cflag&=~CSTOPB; 2位:options.c_cflag|=CSTOPB; 需求留意的是:假設(shè)不是開發(fā)終端之類的,只是串口傳輸數(shù)據(jù),而不需求串口來處置,那么運用原始方式(RawMode)方式來通訊。設(shè)置方式如下: options.c_lflag&=~(ICANON|ECHO|ECHOE|ISIG);//Input options.c_oflag&=~OPOST;//Output3.讀寫串口設(shè)置好串口之后,讀寫串口就很容易,把串口當(dāng)作文件讀寫就可以了。 (1)發(fā)送數(shù)據(jù) charbuffer[1024]; intLength=1024;11.1.1串行口主要函數(shù)引見intnByte; nByte=write(fd,buffer,Length)(2)讀取串口數(shù)據(jù)運用文件操作read函數(shù)讀取,假設(shè)設(shè)置為原始方式(RawMode)傳輸數(shù)據(jù),那么read函數(shù)前往的字符數(shù)是實踐串口收到的字符數(shù)。可以運用操作文件的函數(shù)來實現(xiàn)異步讀取,如fcntl,或者select等來操作。 charbuff[1024]; intLen=1024; intreadByte=read(fd,buff,Len);4.封鎖串口 封鎖串口就是封鎖文件。 close(fd);11.1.2串口舉例假設(shè)接納程序readtest.c運轉(zhuǎn)在裝有規(guī)范Linux的PC機上,發(fā)送程序writetest.c運轉(zhuǎn)在目的板S3C44B0X上,兩臺設(shè)備的串口經(jīng)過交叉線銜接在一同。接納程序readtest.c的源碼如下: #include<stdio.h> #include<string.h> #include<malloc.h> #include<sys/types.h>#include<sys/stat.h> #include<fcntl.h> #include<unistd.h> #include<termios.h>#include<errno.h> #include<math.h>intspfd; intmain() { charfname[16],hd[16],*rbuf; intretv,i,ncount=0; structtermiosoldtio; intrealdata=0; spfd=open("/dev/ttyS1",O_RDWR|O_NOCTTY); if(spfd<0)return-1;} tcgetattr(spfd,&oldtio);//保管串口的當(dāng)前設(shè)置 cfmakeraw(&oldtio); cfsetispeed(&oldtio,B19200); cfsetospeed(&oldtio,B19200);tcsetattr(spfd,TCSANOW,&oldtio);//選擇新設(shè)置,TCSANOW表示設(shè) 置立刻生效rbuf=hd; printf("readyforreceivingdata...\n"); retv=read(spfd,rbuf,1);if(retv==-1){perror("read");reture-1;{ while(*rbuf!='\0') { ncount+=1; rbuf++; retv=read(spfd,rbuf,1); printf("thenumberreceivedis%d\n",retv); if(retv==-1)perror("read"); } for(i=0;i<ncount;i++) { realdata+=(hd[i]-48)*pow(10,ncount-i-1); } printf("completereceivingthedata%d\n",realdata); close(spfd); return0; }11.1.2串口舉例發(fā)送程序writetest.c的源碼如下: #include<stdio.h> #include<string.h> #include<malloc.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<unistd.h> #include<termios.h> intspfd; intmain(intargc,char*argv[]) { charfname[16],*sbuf; intsfd,retv,i; structtermiosoldtio; spfd=open("/dev/ttyS0",O_RDWR|O_NOCTTY); perror("open/dev/ttyS0");if(spfd<0)return-1; printf("readyforsendingdata...\n"); tcgetattr(spfd,&oldtio); cfmakeraw(&oldtio); cfsetispeed(&oldtio,B19200); cfsetospeed(&oldtio,B19200); tcsetattr(spfd,TCSANOW,&oldtio); fname[0]='1'; fname[1]='2'; fname[2]='3'; fname[3]='\0'; sbuf=(char*)malloc(4); strncpy(sbuf,fname,4); retv=write(spfd,sbuf,4); if(retv==-1)perror("write"); printf("thenumberofcharsentis%d\n",retv); close(spfd); return0; }11.1.2串口舉例本例程實現(xiàn):在發(fā)送端發(fā)送數(shù)字123,在接納端接納并顯示接納到的數(shù)據(jù)。

這里請同窗們留意的是:發(fā)送方按字符發(fā)送數(shù)據(jù),接納方將接納的字符相應(yīng)的ascii值與字符0所對應(yīng)的ascii值相減,最終得到實踐的十進(jìn)制數(shù)值。11.2網(wǎng)絡(luò)運用

11.2.1TCP/IP網(wǎng)絡(luò)運用以太網(wǎng)技術(shù)作為當(dāng)前局域網(wǎng)的主流技術(shù),可以提供從10Mbit/s,100Mbit/s到1000Mbit/s的物理帶寬,以及比較好的抗干擾性、比較大的網(wǎng)絡(luò)半徑和比較低系統(tǒng)維護(hù)費用;同時在不同速率以太網(wǎng)之間堅持比較好的前向兼容性,所以在系統(tǒng)晉級時很方便。圖11-1以太網(wǎng)電路構(gòu)造圖11.2.1TCP/IP網(wǎng)絡(luò)運用1.網(wǎng)絡(luò)根底 (1)TCP/IP協(xié)議分層模型在實踐操作中接觸到的通常只是網(wǎng)絡(luò)系統(tǒng)的最高層——運用層的用戶界面。實踐上要進(jìn)展網(wǎng)際的數(shù)據(jù)傳送,需求經(jīng)過如下的步驟:①需求發(fā)送的數(shù)據(jù)如、web頁等,經(jīng)過用戶界面由運用程序傳送到運用程序的數(shù)據(jù)發(fā)送緩沖區(qū),并設(shè)置好與下一層銜接的參數(shù)等待發(fā)送。②數(shù)據(jù)做好傳輸前的預(yù)備任務(wù),進(jìn)入傳輸層。傳輸層主要擔(dān)任為兩臺主機上的運用程序提供端口到端口的通訊。 ③然后進(jìn)入網(wǎng)絡(luò)層的范疇。這里主要處置數(shù)據(jù)分組在網(wǎng)絡(luò)中的活動,例如分組的選路。④當(dāng)然最終數(shù)據(jù)還是要靠物理層的電磁波或光導(dǎo)纖維來傳輸。⑤在接納的一方是相反的過程,數(shù)據(jù)從最底層不斷到運用層復(fù)原為用戶可以識別的信息,這一切都是由上面的協(xié)議來規(guī)范的。11.2.1TCP/IP網(wǎng)絡(luò)運用(2)數(shù)據(jù)的封裝與分用 ①數(shù)據(jù)的封裝 用戶數(shù)據(jù)從運用層逐級傳送到鏈路層,每經(jīng)過一層都要被該層的協(xié)議進(jìn)展一定的封裝、標(biāo)識和改造,就是給這個數(shù)據(jù)添加一些頭部信息(或尾部信息)。數(shù)據(jù)封裝過程如圖11-3所示。圖11-3數(shù)據(jù)的封裝過程11.2.1TCP/IP網(wǎng)絡(luò)運用②數(shù)據(jù)的分用(解包) 在接納端接納這些數(shù)據(jù)的時候,經(jīng)過拆分的數(shù)據(jù)要重新組合,并且去掉各層加上的頭部信息,把數(shù)據(jù)復(fù)原。(3)客戶—效力器模型 目前大多數(shù)網(wǎng)絡(luò)運用程序在編寫時都采用客戶——效力器模型,假設(shè)—端是客戶,另一端是效力器,讓效力器提供應(yīng)客戶一定的效力內(nèi)容。①并發(fā)型交互 在并發(fā)型交互方式下,程度的主要運作步驟如下: ◆等待一個客戶懇求的到來; ◆生成一個新的進(jìn)程或者義務(wù)來處置這個客戶懇求,同時這里還可以接納其他客戶的懇求。處置終了后,終止這個進(jìn)程。 ◆反響客戶端; ◆等待新的客戶懇求的到來并進(jìn)展下一次效力,如此循環(huán)運作。11.2.1TCP/IP網(wǎng)絡(luò)運用 ②反復(fù)型交互 反復(fù)型交互摸式下,程序的的主要運作步驟如下: ◆等待一個客戶懇求的到來; ◆處置客戶的懇求,對客戶進(jìn)展效力; ◆給客戶反響信息,效力終了; ◆等待下一個懇求到來,如此循環(huán)。11.2.1TCP/IP網(wǎng)絡(luò)運用2.TCP套接字Linux系統(tǒng)的套接字是一個通用的網(wǎng)絡(luò)編程接口。TCP協(xié)議就是經(jīng)過套接字來實現(xiàn)銜接的建立的,這里將就這個過程詳細(xì)化并對其內(nèi)部的函數(shù)進(jìn)展必要的闡明。(1)套接字地址構(gòu)造在頭文件<Linux/socket.h>中定義了以下構(gòu)造來堅持套接字函數(shù)調(diào)用參數(shù)的一致性。structsockaddr { unsignedshortsa_family;//地址類型,格式為AF_xxx charsa_data[14];//14字節(jié)的協(xié)議地址 };11.2.1TCP/IP網(wǎng)絡(luò)運用其中的sa_family為套接字的協(xié)議簇地址類型,TCP/IP的協(xié)議對于IPv4地址類型為AF_INET。sa_data中存儲詳細(xì)的協(xié)議地址,不同的協(xié)議簇有不同的地址格式。但普通編程中并不直接針對此數(shù)據(jù)構(gòu)造操作,而是運用另一個與sockaddr等價的數(shù)據(jù)構(gòu)造sockaddr_in(在netinet/in.h中定義): structsockaddr_in { unsignedshortintsin_len; /*IPv4地址長度*/ shortintsin_family; /*地址類型*/ unsignedshortintsin_port; /*存儲端口號*/ structin_addrsin_addr; /*存儲IP地址*/ unsignedcharsin_zero[8];/*空字節(jié)*/ };11.2.1TCP/IP網(wǎng)絡(luò)運用 在編程中大多數(shù)是運用sockaddr_in這個構(gòu)造來設(shè)置獲取地址信息。 sin_family指協(xié)議族,在TCP套接字編程中只能是AF_INET;sin_port存儲端口號(運用網(wǎng)絡(luò)字節(jié)順序),數(shù)據(jù)類型是一個16位的無符號整數(shù)類型;sin_addr存儲IP地址,IP地址運用in_addr這個數(shù)據(jù)構(gòu)造:structin_addr{ unsignedlongs_addr; };s_addr按照網(wǎng)絡(luò)字節(jié)順序存儲IP地址;sin_zero是為了讓sockaddr與sockaddr_in兩個數(shù)據(jù)構(gòu)造堅持大小一樣而保管的空字節(jié)。

11.2.1TCP/IP網(wǎng)絡(luò)運用設(shè)置地址信息實例〔IPv4) structsockaddr_inmysock; /*設(shè)置sockaddr_in的構(gòu)造體變量mysock*/ mysock.sin_family=AF_INET; /*TCP地址構(gòu)造*/ mysock.sin_port=htons(3490); /*short,NBO*/ mysock.sin_addr.s_addr=inet_addr(“0〞); /*設(shè)置地址為0*/ bzero(&(mysock.sin_zero),8); /*設(shè)置sin_zero為8位保管字節(jié)*/

留意:假設(shè)mysock.sin_addr.s_addr=INADDR_ANY,那么不指定IP地址(用于Server程序)。11.2.1TCP/IP網(wǎng)絡(luò)運用(2)TCP客戶-效力器通訊模型 TCP客戶-效力器通訊過程如圖11-4所示。圖11-4 TCP客戶-效力器通訊過程11.2.1TCP/IP網(wǎng)絡(luò)運用(3)socket主要函數(shù)①強迫類型轉(zhuǎn)換函數(shù)的調(diào)用: 將指向于特定協(xié)議的套接口地址構(gòu)造的指針類型->

指向通用套接口地址構(gòu)造的指針。 int

connect(

int,

struct

sockaddr

*,

socklen_t) struct

sockaddr-in

servaddr; connect(sockfd,(sturct

sockaddr

*)

&servaddr,

sizeof(servaddr));11.2.1TCP/IP網(wǎng)絡(luò)運用②主機字節(jié)序和網(wǎng)絡(luò)字節(jié)序的轉(zhuǎn)換函數(shù):

#include

<netinet/in.h>

unit16_t

htons(uint16_t

host16bitvalue);

unit32_t

htons(uint32_t

host32bitvalue);

unit16_t

ntohs(uint16_t

net16bitvalue);

unit32_t

ntohs(uint32_t

net32bitvalue);

h

:

host

n

:

network

s

:

short

(16

bits)

l

:

long

(32

bits)

11.2.1TCP/IP網(wǎng)絡(luò)運用③int

socket(int

domain,

int

type,int

protocol)

domain:闡明我們網(wǎng)絡(luò)程序所在的主機采用的通訊協(xié)族(AF_UNIX和AF_INET等)。 type:我們網(wǎng)絡(luò)程序所采用的通訊協(xié)議(SOCK_STREAM,SOCK_DGRAM等)

SOCK_STREAM闡明我們用的是TCP協(xié)議,這樣會提供按順序的,可靠,雙向,面向銜接的比特流。SOCK_DGRAM

闡明我們用的是UDP協(xié)議,這樣只會提供定長的,不可靠,無銜接的通訊。 protocol:由于我們指定了type,所以這個地方我們普通只需用0來替代就可以了。 socket為網(wǎng)絡(luò)通訊做根本的預(yù)備。勝利時前往文件描畫符,失敗時前往-1,看errno可知道出錯的詳細(xì)情況。11.2.1TCP/IP網(wǎng)絡(luò)運用④int

bind(int

sockfd,

struct

sockaddr

*my_addr,

int

addrlen)

sockfd:是由socket調(diào)用前往的文件描畫符。

addrlen:是sockaddr構(gòu)造的長度。

my_addr:是一個指向sockaddr的指針。⑤int

listen(int

sockfd,int

backlog)

sockfd:是bind后的文件描畫符。 backlog:設(shè)置懇求排隊的最大長度。當(dāng)有多個客戶端程序和效力端相連時,

運用這個表示可以介入的排隊長度。

listen函數(shù)將bind的文件描畫符變?yōu)楸O(jiān)聽套接字,前往的情況和bind一樣。⑥int

accept(int

sockfd,

struct

sockaddr

*addr,int

*addrlen)

sockfd:是listen后的文件描畫符。

addr,addrlen是用來給客戶端的程序填寫的,效力器端只需傳送指針就可以了。

bind,listen和accept是效力器端用的函數(shù),accept調(diào)用時,效力器端的程序會不斷阻塞到有一個客戶程序發(fā)出了銜接。 accept勝利時前往最后的效力器端的文件描畫符,這個時候效力器端可以向該描畫符寫信息了,失敗時前往-1。

11.2.1TCP/IP網(wǎng)絡(luò)運用⑦int

connect(int

sockfd,

struct

sockaddr

*

serv_addr,int

addrlen)

sockfd是socket前往的文件描畫符。

serv_addr:儲存了效力器端的銜接信息,其中sin_add是效力端的地址。addrlen:serv_addr的長度

。 connect函數(shù)是客戶端用來同效力端銜接的。勝利時前往0,sockfd是同效力端通訊的文件描畫符,失敗時前往-1。⑧ssize_t

write(int

fd,const

void

*buf,size_t

nbytes) write函數(shù)將buf中的nbytes字節(jié)內(nèi)容寫入文件描畫符fd。勝利時前往寫的字節(jié)數(shù),失敗時前往-1。并設(shè)置errno變量,在網(wǎng)絡(luò)程序中,當(dāng)我們向套接字文件描畫符寫時有兩種能夠。

write的前往值大于0,表示寫了部分或者是全部的數(shù)據(jù)。 前往的值小于0,此時出現(xiàn)了錯誤.我們要根據(jù)錯誤類型來處置。11.2.1TCP/IP網(wǎng)絡(luò)運用⑨ssize_t

read(int

fd,void

*buf,size_t

nbyte)

read函數(shù)是從fd中讀取內(nèi)容。當(dāng)讀勝利時,read前往實踐所讀的字節(jié)數(shù),假設(shè)前往的值是0

表示曾經(jīng)讀到文件的終了了,小于0表示出現(xiàn)了錯誤。⑩recv和send函數(shù)提供了和read和write差不多的功能,不過提供了第四個參數(shù)來控制讀寫操作。

int

recv(int

sockfd,void

*buf,int

len,int

flags) int

send(int

sockfd,void

*buf,int

len,int

flags) 前面的三個參數(shù)和read,write一樣,第四個參數(shù)可以是0或者是以下的組合: ◆MSG_DONTROUTE:不查找路由表 ◆MSG_OOB:接受或者發(fā)送帶外數(shù)據(jù) ◆MSG_PEEK:查看數(shù)據(jù),并不從系統(tǒng)緩沖區(qū)移走數(shù)據(jù) ◆MSG_WAITALL

:等待一切數(shù)據(jù)11.2.1TCP/IP網(wǎng)絡(luò)運用3.舉例 我們將運用TCP協(xié)議提供的效力,組成一個簡單的反復(fù)型的網(wǎng)絡(luò)時間效力器。在一臺EV44B0II系統(tǒng)中啟動效力程序并指定效力端口。在另外一臺EV44B0II系統(tǒng)中啟動客戶端程序并指定效力器IP地址和效力端口。效力器將接納該效力,并前往效力器本地的系統(tǒng)時間。 本程序運用TCP協(xié)議,可以任務(wù)在效力器或客戶端形狀。運用的默許端口號為9988。程序流程圖如圖11-5所示:圖11-5 流程圖11.2.1TCP/IP網(wǎng)絡(luò)運用附程序清單: /*TCP/IPnettimeservice*/ #include<sys/param.h> #include<sys/stat.h> #include<sys/ioctl.h> #include<sys/socket.h> #include<sys/time.h> #include<sys/file.h> #include<netinet/in.h> #include<netinet/ip.h> #include<netinet/tcp.h> #include<arpa/inet.h> #include<stdio.h> #include<signal.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #include<errno.h> #include<netdb.h> #include<pwd.h> #include<stdarg.h> externchar*optarg; /*getopt*/ #defineCOM_SERVER1 #defineCOM_CLIENT 2 intComStatus; #definePORT_NUMBER 0x1000 shortComPort; intmain(intargc,char*argv[]) { intfd_listen,fd_client,fd_service; charserver_ip[64];

intport;structsockaddr_insn={AF_INET};intsa_len;char*buffer;intstart,packet_len,c,counter;intdebug;ComStatus=COM_SERVER;ComPort=PORT_NUMBER;while((c=getopt(argc,argv,"sc:o:"))!=-1) { switch(c) { case'c':/*getserveripaddress*/ memcpy(server_ip,optarg,(strlen(optarg)+1)); ComStatus=COM_CLIENT; break; case's': /*opendebugflag*/ ComStatus=COM_SERVER; break; case'o': ComPort=atoi(optarg); break; default: /*printusage*/ fprintf(stderr,"Usage:%s[[-c<serverip>]|-s][-p<port>]\n",argv[0]); exit(1); } } /*setupaddressandport*/ sn.sin_port=__constant_htons(ComPort); sn.sin_addr.s_addr=0; if(argc<2) { fprintf(stderr,"\nargvtooless\n"); exit(1); }

/*allocmemfordatabuffer*/ packet_len=256; buffer=malloc(packet_len); if(buffer<0){ fprintf(stderr,"\nmallocbuffererror\n"); exit(1); }if(ComStatus==COM_SERVER) { /*serverprocess*/ if((fd_listen= socket(AF_INET,SOCK_STREAM,0))<0) { fprintf(stderr,"\ncannotopenserver socket,exit\n"); exit(1); } if(bind(fd_listen,(structsockaddr*)&sn,sizeof(sn))<0)

{ fprintf(stderr,"\ncannotbinserver,socket,exit\n"); close(fd_listen); exit(1); }if(listen(fd_listen,1)<0) { fprintf(stderr,"listenfailed,exit"); close(fd_listen); exit(1); } sa_len=sizeof(sn); { printf("\ngetservicerequestfrom%s\n",inet_ntoa(sn.sin_addr)); } start=time(0); *(int*)buffer=start; while(1) {/*loopservice*/ fd_service=accept(fd_listen,(structsockaddr*)&sn,&sa_len); if(fd_service<0) {perror("acceptfailed"); exit(1); } else if(write(fd_service,buffer,packet_len)<0) { perror("serverwrite"); close(fd_listen);close(fd_service); exit(1); } printf("\ncurrenttime%ds\n",start); close(fd_service);

} close(fd_listen); } else {/*clientprocess*/ if((fd_client=socket(AF_INET,SOCK_STREAM,0))<0)

{ perror("clientsocket"); exit(1); }sn.sin_addr.s_addr=inet_addr(server_ip); sa_len=sizeof(sn);if(connect(fd_client,(structsockaddr*)&sn,sa_len)<0) { perror("clientconnect"); close(fd_client); exit(1); } if((counter=read(fd_client,buffer,packet_len))<=0) { perror("receivefailed"); close(fd_client); exit(1); } start=*(int*)(buffer); printf("\nnetservertime%ds\n",start); close(fd_client); } free(buffer); exit(0); }11.2.1TCP/IP網(wǎng)絡(luò)運用首先配置開發(fā)板IP地址〔ifconfigeth020netmask〕,配置Hitools的調(diào)試協(xié)議為MDB,啟動主機的TargetServer程序運轉(zhuǎn),選擇Hitools的loadimagethenforktask窗口的CommandLine中填寫參數(shù)〔–s–o8888〕,然后帶參下載運轉(zhuǎn)。其次啟動客戶端程序,在超級終端中,進(jìn)入目錄/var/tmp,入./nettime–c20–o8888回車。超級終端顯示客戶端程序輸出了效力器端的以秒為單位的時間:“netservertime333s〞。11.2.2web效力器運用1.Web效力器的原理從原理上來說,Web效力器與其他在socket端口進(jìn)展監(jiān)聽的運用程序差別不大,都是監(jiān)聽并接納用戶懇求,遵照HTTP協(xié)議,根據(jù)懇求內(nèi)容和類型,運用串行和并行方式提供相應(yīng)的效力。運用Web效力的益處是:在提供效力時,客戶端的軟件是規(guī)范的,不需求思索客戶端軟件的開發(fā)問題,運用者容易上手;效力器端的開發(fā),也是有很多現(xiàn)成的資源可以利用。11.2.2web效力器運用2.基于uClinux的Web技術(shù) uClinux下,主要有三個Web效力器:httpd,thttpd和boa。Httpd是最簡單的Web效力器,功能比較簡單,不支持認(rèn)證和CGI。thttpd和boa均支持認(rèn)證和CGI,功能比較豐富,其中boa是一個單義務(wù)的http效力器,源代碼開放,性能比較高,占用系統(tǒng)資源比較少。boa效力器在接納到懇求時,不啟動多個效力進(jìn)程處置多個懇求,在一個進(jìn)程內(nèi)處置一切效力懇求。由于目前的uClinux還不支持ASP、PHP等動態(tài)網(wǎng)頁技術(shù),一切在uClinux下經(jīng)過CGI技術(shù)銜接web頁和本地程序,提供動態(tài)和交互的特性。boa的配置文件boa.conf:在boa.conf中,對boa的一些配置項進(jìn)展了配置,這些配置項大多可以運用默許值。11.2.2web效力器運用本程序?qū)⒃贓V44B0IIuClinux系統(tǒng)中,啟動一個web效力器,并添加簡單的網(wǎng)頁和CGI程序。在對內(nèi)核配置時,選擇boa程序和cgi。將cgi_generic文件夾下的cgi.c和makefile,覆蓋到程序包中的/usr/cgi_generic/。將boa文件夾下的hash.c,覆蓋到程序包中的/usr/boa/src。將rc文件,覆蓋到程序包中的/vendor/Miectek/44b0。要運轉(zhuǎn)boa,運用“>boa–c/tmp/&〞命令。11.2.2web效力器運用3.程序闡明程序闡明如下:/*rc*/ /*本腳本將為boa建立運轉(zhuǎn)的根目錄,和其他運轉(zhuǎn)環(huán)境*/hostnameSamsung /bin/expand/etc/ramfs.img/dev/ram0 mount-tprocproc/proc mount-text2/dev/ram0/var mkdir/var/config mkdir/var/tmp mkdir/var/log mkdir/var/run mkdir/var/lock cat/etc/motd ifconfiglo routeadd-netnetmasklo dhcpcd-p-aeth0& cd/tmp mkdircgi_bin cd/etc cpindex.html/tmp cpboa.conf/tmp cpmime.types/tmp cpcgi_bin/*/tmp/cgi_bin chmod775/tmp/cgi_bin/* #mount-tjffs/dev/mtdblock1/var #ifconfigeth0hwether00:11:22:33:44:55 #ifconfigeth04 #login

/*cgi.c*/ /*本程序接納boa傳送的參數(shù),控制數(shù)碼管顯示指定的數(shù)字,并前往網(wǎng)頁*/#include<stdio.h> #include<string.h> #include"cgivars.h" #include"htmllib.h" #include"template.h" intmain(){ char**postvars=NULL;/*POSTrequestdatarepository*/ char**getvars=NULL;/*GETrequestdatarepository*/ intform_method;/*POST=1,GET=0*/

form_method=getRequestMethod(); /*decideformrequestmethod,POSTorGET*/ if(form_method==POST) {/*getvarsfromrequeststring*/ getvars=getGETvars(); postvars=getPOSTvars(); }elseif(form_method==GET) {/*Inthisexp,weuseGETinindex.html*/ getvars=getGETvars();

if(getvars){ inti=0; while(getvars[i]) { if(strcmp(getvars[i],"LampNum")==0) {/*getwhichnumberison*/ /*controlreg*/staticvolatileunsignedint*iopmod=(volatileunsignedint*)(0x3ff5000); staticvolatileunsignedint*iopdata=(volatileunsignedint*)(0x3ff5008);intlampnum=0; lampnum=strtoul(getvars[i+1],NULL,0);/*lightnumber*/ iopmod[0]=0x000000ff; iopdata[0]=(~lampnum); break; } i+=2;} } }/*writewebpagetostdout*/ htmlHeader("DemoWebPage"); htmlBody(); template_page(postvars,form_method);htmlFooter(); cleanUp(form_method,getvars,postvars);/*display*/ fflush(stdout); exit(0); } 11.2.2web效力器運用4.運轉(zhuǎn)過程 (1)對程序修正后,重新編譯內(nèi)核并焼寫燒寫到EV44B0II評價板。 (2)啟動EV44B0II評價板。確認(rèn)EV44B0II的IP地址。 (3)運轉(zhuǎn)boa-c/tmp/&,啟動web效力器。 (4)翻開PC上的閱讀器(如IE6或Netscape)輸入EV44B0II的IP作為網(wǎng)址,例如http25/,這時就可以看到要測試的網(wǎng)頁內(nèi)容。網(wǎng)頁內(nèi)容是/tmp/index.html文件。 (5)在lampnumber文本框中,寫入“1〞,然后點擊“display〞。 (6)EV44B0上的數(shù)碼管顯示對應(yīng)數(shù)字。 (7)在閱讀器上顯示“DemoWebPage〞。11.3音頻設(shè)備運用 S3C44B0II包含一個IIS總線接口,它可以作為銜接8位或16位立體聲編解碼集成電路的接口,IIS總線接口提供內(nèi)置FIFO的DMA傳送方式,可以同時接納和發(fā)送,或單獨接納和發(fā)送。IIS總線接口可以發(fā)送和接納采樣量化過的聲音數(shù)據(jù),它為外部的CODEC芯片提供任務(wù)主時鐘,數(shù)據(jù)收發(fā)時鐘和左右聲道選擇信號。詳細(xì)的采樣量化任務(wù)留給CODEC芯片完成。在接納方向,CODEC將模擬聲音采樣量化;在發(fā)送方向,CODEC將聲音數(shù)據(jù)復(fù)原為模擬聲音。UDA1341和IIS的驅(qū)動程序,位于/Linux/drivers/char目錄下。它們是ev44b0_sound.c、ev44b0_sound.h、l3-ev44b0.c。音頻設(shè)備文件的設(shè)備名為/dev/audio。11.3.1常用音頻文件格式1.WAV文件(1)概述 WAV是MicrosoftWindows本身提供的音頻格式,由于Windows本身的影響力,這個格式曾經(jīng)成為了現(xiàn)實上的通用音頻格式。(2)WAV文件的構(gòu)造在Windows環(huán)境下,大部分的多媒體文件都遵照著一種構(gòu)造來存放信息,這種構(gòu)造稱為“資源互換文件格式〞(ResourceslnterchangeFileFormat),簡稱RIFF。WAV為WAVEFORM(波形)的縮寫。聲音文件的構(gòu)造如圖11-6所示,“RIFF〞的格式區(qū)分碼為“WAVE〞。整個文件由兩個chunk所組成:區(qū)分碼"fmt"(留意,最后一個是空白字符!)及"data"。在"fmt"的chunk下包含了一個PCMWAVEFORMAT數(shù)據(jù)構(gòu)造,其定義如下:圖11-6WAVE文件構(gòu)造11.3.1常用音頻文件格式

整個文件由兩個chunk所組成:區(qū)分碼“fmt〞(留意,最后一個是空白字符!)及“data〞。在“fmt〞的chunk下包含了一個PCMWAVEFORMAT數(shù)據(jù)構(gòu)造,其定義如下:typedefstructpcmwaveformat-tag{ WAVEFORMATwf; WORDwBitsPerSample; }PCMWAVEFORMAT;typedefstructwaveformat-tag{ WORDwFormatTag; WORDnChannels; DWORDnSamplesPerSec; DWORDnAvgBytesperSec; WORDnBlockAlign; }WAVEFORMAT;11.3.1常用音頻文件格式 其意義分別為: wFormatTag:記錄著此聲音的格式代號,例如WAVE_FORMAT_PCM,WAVE_F0RAM_ADPCM等等。 nChannels:記錄聲音的頻道數(shù)。 nSamp1esPerSec:記錄每秒取樣數(shù)。 nAvgBytesPerSec:記錄每秒的數(shù)據(jù)量。 nBlockA1ign:記錄區(qū)塊的對齊單位。 wBitsPerSample:記錄每個取樣所需的位元數(shù)。11.3.1常用音頻文件格式2.mp3格式 (1)概述mp3是Fraunhofer-IIS研討所的研討成果。mp3是第一個適用的有損音頻緊縮編碼。衡量mp3文件的緊縮比例通常運用比特率來表示。由于mp3是世界上第一個有損緊縮的編碼方案,所以可以說一切的播放軟件都支持它,否那么就根本沒有生命力。在制造方面,也曾經(jīng)產(chǎn)生了許多第三方的編碼工具。(2)MP3的文件構(gòu)造MPEG音頻文件沒有文件頭而是由很多獨立的數(shù)據(jù)幀構(gòu)成,每個幀都是獨立的可以被單獨播放,每個幀都有本人的幀頭和音頻信息。幀頭是有32bits〔4bytes〕構(gòu)成,起始的11bit是幀同步信息。幀可以有CRC校驗信息,也可以沒有。普通來說都沒有CRC校驗。CRC校驗信息為16bit長,它緊跟在幀頭的后面,在校驗信息后就是經(jīng)過緊縮的音樂文件數(shù)據(jù)了。MP3文件的比特率表如表11-1所示。表11-1MP3文件的比特率11.3.1常用音頻文件格式MP3文件的采樣率表如表11-2所示。表11-2MP3文件的采樣率表11.3.1常用音頻文件格式MP3文件的播放方式表如表11-3所示。表11-3MP3文件的采樣率表11.3.2播放WAV文件舉例1.程序 該程序由sound.c和wave.h組成,sound.c中包含了*.wave文件的處置,和sound驅(qū)動的運用;wave.h中包含了wave文件的宏定義。附源程序:

#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<Linux/sound.h>#include<Linux/soundcard.h>#include"wave.h"#defineWAVEFILE"/bin/test.wav"#defineAUDIOBUFLEN4096/*4Kbytesbuffer*/staticunsignedintbuffer[AUDIOBUFLEN/4];intmain(void){ intfd_dev,fd_file; intresult,len,i;structwave_s*wave_head; structaudio_mixmix; char*buf=(char*)buffer; charctl_buf[100]; fprintf(stderr,"\n\t\tWelcometoMICETEKWorld\nNowdoingsoundtest...\n\n");fprintf(stderr,"Openaudiodevice:/dev/audio\n"); if(-1==(fd_dev=open("/dev/audio",O_WRONLY))) { fprintf(stderr,"Failedtoopenaudiodevice\n"); return0; } fprintf(stderr,"Openwavefile:%s\n",WAVEFILE);if(-1==(fd_file=open(WAVEFILE,O_RDONLY))){fprintf(stderr,"Failedtoopen/bin/test.wavefile\n");return0;}result=read(fd_file,buf,sizeof(structwave_s));if(result<0){ fprintf(stderr,"Readwavefileerror.\n"); return0;}wave_head=(structwave_s*)buf;if((wave_head->format[0]!='R')||(wave_head->format[1]!='I')||(wave_head->format[2]!='F')||(wave_head->format[3]!='F')){ fprintf(stderr,"Fileformat(1)error.\n"); return0;}printf("Filelength=%d\n",wave_head->file_length);wave_head->format2[7]=0;if(strcmp(wave_head->format2,"WAVEfmt")!=0){ fprintf(stderr,"Fileformat(2)error.\n"); return0;}printf("Channels=%d\n",wave_head->nChannels);printf("IOctrlChannels\n");sprintf(ctl_buf,"%d",wave_head->nChannels);ioctl(fd_dev,SNDCTL_DSP_CHANNELS,ctl_buf);printf("SamplesPerSec=%d\n",wave_head->nSamplesPerSec);printf("IOctrlSamplesPerSec\n");sprintf(ctl_buf,"%d",wave_head->nSamplesPerSec);ioctl(fd_dev,SNDCTL_DSP_SPEED,ctl_buf);printf("AvgBytesPerSec=%d\n",wave_head->nAvgBytesPerSec);printf("BlockAlign=%d\n",wave_head->nBlockAlign);printf("BitsPerSample=%d\n",wave_head->wBitsPerSample);if((wave_head->format3[0]!='d')||(wave_head->format3[1]!='a')||(wave_head->format3[2]!='t')||(wave_head->format3[3]!='a')) { fprintf(stderr,"Fileformat(3)isUnknown.\n"); } else { fprintf(stderr,"Fileformat(3)isdata.\n"); } printf("TotalDataBytes=%d\n",wave_head->nDataBytes);len=wave_head->nDataBytes;/*realaudiolength*/while(len){unsignedintlength,ret;if(len>AUDIOBUFLEN)length=AUDIOBUFLEN;

elselength=len;result=read(fd_file,buf,length);if(result<0){printf("ReadFileerror.\n");return0;}ret=wriate(fd_dev,buf,result); if(ret<0) {printf("WriteAudioerror.\n");return0;}len-=result;} close(fd_file);printf("CloseWaveFile:%s\n",WAVEFILE);

close(fd_dev);printf("ClosedeviceFile:/dev/audio\n");/*Recordtest*/fprintf(stderr,"OpenaudiodeviceforRecord\n"); if(-1==(fd_dev=open("/dev/audio",O_RDONLY))) { fprintf(stderr,"Failedtoopenaudiodevice\n"); return0; }buf=malloc(600000); if(buf==0){ fprintf(stderr,"FailedtomallocabufferforRecord.\n"); return0;}fprintf(stderr,"Recordwillstartafter3seconds,andrecordtimewillbe3s.\n");sleep(3); fprintf(stderr,"Recordstart!\n");read(fd_dev,buf,600000);fprintf(stderr,"RecordOK.\n");close(fd_dev);/*Playback*/fprintf(stderr,"PlaybacknowandtesttheMix.\n"); if(-1==(fd_dev=open("/dev/audio",O_WRONLY))) { fprintf(stderr,"Failedtoopenaudiodevice\n"); free(buf); return0; } memset(&mix,0,sizeof(structaudio_mix));/*SetallMaximumonBassandTreble*/mix.mode=3;/*testBass*/ for(i=0;i<15;i++)

{fprintf(stderr,"BassBoost++\n");mix.BassBoost++;ioctl(fd_dev,0x4d00,&mix);write(fd_dev,buf,600000);sleep(4);} mix.BassBoost=0;/*resetBass*//*testmute,muteis1bits!*/ for(i=0;i<2;i++){fprintf(stderr,"mute++\n");mix.mute++;ioctl(fd_dev,0x4d00,&mix);write(fd_dev,buf,600000);sleep(4);}/*testTreble*/ for(i=0;i<4;i++){fprintf(stderr,"Treble++\n");amix.Treble+

溫馨提示

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

評論

0/150

提交評論