應(yīng)用程序開發(fā)課件_第1頁(yè)
應(yīng)用程序開發(fā)課件_第2頁(yè)
應(yīng)用程序開發(fā)課件_第3頁(yè)
應(yīng)用程序開發(fā)課件_第4頁(yè)
應(yīng)用程序開發(fā)課件_第5頁(yè)
已閱讀5頁(yè),還剩93頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 第11章 應(yīng)用程序開發(fā)本章主要內(nèi)容串口應(yīng)用程序的編寫方法。TCP/IP協(xié)議以及Socket的編寫方法?;趗Clinux音頻接口的應(yīng)用程序的編寫 方法。鍵盤和LCD的應(yīng)用程序的編寫方法。漢字音樂點(diǎn)播程序的編寫實(shí)例。第十一章 目錄1.串口應(yīng)用程序 串口主要函數(shù)介紹 串口舉例 2.網(wǎng)絡(luò)應(yīng)用 TCP/IP網(wǎng)絡(luò)應(yīng)用 Web服務(wù)器應(yīng)用3 音頻設(shè)備應(yīng)用 常用音頻文件格式 播放WAV文件舉例4 鍵盤及LCD顯示應(yīng)用 LCD介紹 鍵盤實(shí)現(xiàn)5 漢字音樂點(diǎn)播應(yīng)用第十一章 目錄1.串口應(yīng)用程序 串口主要函數(shù)介紹 串口舉例 2.網(wǎng)絡(luò)應(yīng)用 TCP/IP網(wǎng)絡(luò)應(yīng)用 Web服務(wù)器應(yīng)用3 音頻設(shè)備應(yīng)用 常用音頻文件格式 播放

2、WAV文件舉例4 鍵盤及LCD顯示應(yīng)用 LCD介紹 鍵盤實(shí)現(xiàn)3 音頻設(shè)備應(yīng)用 本章從一個(gè)針對(duì)運(yùn)行在S3C44B0X上的uClinux操作系統(tǒng)進(jìn)行應(yīng)用程序的開發(fā)入手,給出Windows操作系統(tǒng)平臺(tái)上使用Hitool for uClinux等工具開發(fā)的多種應(yīng)用程序。本章主要介紹了:串口應(yīng)用程序的編寫方法。TCP/IP協(xié)議以及Socket的編寫方法。基于uClinux音頻接口的應(yīng)用程序的編寫 方法。鍵盤和LCD的應(yīng)用程序的編寫方法。漢字音樂點(diǎn)播程序的編寫實(shí)例。11.1 串口應(yīng)用程序S3C44B0X提供2個(gè)UART收發(fā)器,對(duì)它們可以操作在中斷方式或DMA方式。它們內(nèi)置波特率發(fā)生器,波特率發(fā)生器的時(shí)鐘源

3、為S3C44B0X的系統(tǒng)使用,所以最高速率可達(dá)115.2K bps。二個(gè)串口有單獨(dú)的波特率發(fā)生器,接收、發(fā)送和控制單元,支持紅外方式的傳送和接收。同時(shí),在S3C44B0X串口的接收器和發(fā)送器中都有16字節(jié)的FIFO,F(xiàn)IFO可以有效的降低接收器和發(fā)送器對(duì)CPU的中斷頻率,提高發(fā)送和接收的效率。串口設(shè)備的可配置參數(shù)包括波特率,起始位數(shù)量,數(shù)據(jù)位數(shù)量,停止位數(shù)量和流量控制協(xié)議。在Linux操作系統(tǒng)中,設(shè)備驅(qū)動(dòng)是以主設(shè)備號(hào)為主,每個(gè)設(shè)備都有唯一的主設(shè)備號(hào)和從設(shè)備號(hào)。11.1.1 串行口主要函數(shù)介紹 1. 打開串口 在Linux 下串口文件是位于/dev 下,串口0為/dev/ttyS0 ,串口1為/

4、dev/ttyS1,O_RDWR是以讀寫方式打開串口,O_NOCTTY表示該程序不會(huì)成為控制終端,避免了當(dāng)在鍵盤輸入類似ctrl+c的命令后,終止程序的運(yùn)行。 打開串口是通過使用標(biāo)準(zhǔn)的文件打開函數(shù)操作:int fd;fd = open( /dev/ttyS0, O_RDWR);if (-1 = fd) perror( 提示錯(cuò)誤!);11.1.1 串行口主要函數(shù)介紹2. 設(shè)置串口最基本的設(shè)置串口包括波特率設(shè)置,效驗(yàn)位和停止位設(shè)置。串口的設(shè)置主要是設(shè)置如下struct termios 結(jié)構(gòu)體的各成員值:struct termios unsigned short c_iflag; / 輸入模式標(biāo)志u

5、nsigned short c_oflag; / 輸出模式標(biāo)志unsigned short c_cflag; / 控制模式標(biāo)志unsigned short c_lflag; / local mode flags unsigned char c_line; / line disciplineunsigned char c_ccNCC; / control characters ; 11.1.1 串行口主要函數(shù)介紹通過對(duì)c_cflag的賦值,設(shè)置波特率,字符大小,使能本地連接,使能串行口驅(qū)動(dòng)讀取輸入數(shù)據(jù)。通過設(shè)置c_iflag ,控制端口對(duì)字符的輸入處理過程,IGNPAR符號(hào)常量表示忽略奇偶性錯(cuò)誤

6、的字節(jié),不對(duì)輸入數(shù)據(jù)進(jìn)行任何校驗(yàn),ICRNL 將回車符映射為換行符。 這里就只考慮常見的一些設(shè)置:(1) 波特率設(shè)置:下面是修改波特率的代碼:struct termios Opt;tcgetattr(fd, &Opt);cfsetispeed(&Opt,B19200); / 設(shè)置為19200Bpscfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);11.1.1 串行口主要函數(shù)介紹(2) 校驗(yàn)位和停止位的設(shè)置: 無效驗(yàn)8 位Option.c_cflag &= PARENB;Option.c_cflag &= CSTOPB;Option.c_cfl

7、ag &= CSIZE;Option.c_cflag |= CS8; 偶效驗(yàn)(Even) 7 位Option.c_cflag &= PARENB;Option.c_cflag |= PARODD;Option.c_cflag &= CSTOPB;Option.c_cflag &= CSIZE;Option.c_cflag |= CS7; 奇效驗(yàn)(Odd) 7 位Option.c_cflag |= PARENB;Option.c_cflag &= PARODD;Option.c_cflag &= CSTOPB;Option.c_cflag &= CSIZE;Option.c_cflag |= C

8、S7; Space 效驗(yàn)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;需要注意的是: 如果不是開發(fā)終端之類的,只是串口傳輸數(shù)據(jù),而不需要串口來處理,那么使用原始模式(Raw Mode)方式來通訊。 設(shè)置方式如下:options.c_lflag &= (ICANON | ECHO |

9、 ECHOE | ISIG); /Inputoptions.c_oflag &= OPOST; / Output3. 讀寫串口設(shè)置好串口之后,讀寫串口就很容易,把串口當(dāng)作文件讀寫就可以了。(1) 發(fā)送數(shù)據(jù)char buffer1024;int Length1024;11.1.1 串行口主要函數(shù)介紹 int nByte;nByte = write(fd, buffer ,Length)(2) 讀取串口數(shù)據(jù) 使用文件操作read 函數(shù)讀取,如果設(shè)置為原始模式(Raw Mode)傳輸數(shù)據(jù),那么read函數(shù)返回的字符數(shù)是實(shí)際串口收到的字符數(shù)??梢允褂貌僮魑募暮瘮?shù)來實(shí)現(xiàn)異步讀取,如fcntl,或者se

10、lect等來操作。char buff1024;int Len1024;int readByte = read(fd, buff, Len);4. 關(guān)閉串口關(guān)閉串口就是關(guān)閉文件。close(fd);11.1.2 串口舉例 假設(shè)接收程序readtest.c運(yùn)行在裝有標(biāo)準(zhǔn)Linux的PC機(jī)上,發(fā)送程序writetest.c運(yùn)行在目標(biāo)板S3C44B0X上,兩臺(tái)設(shè)備的串口通過交叉線連接在一起。接收程序readtest.c的源碼如下: #include #include #include #include #include #include #include #include #include #incl

11、ude int spfd; int main() char fname16,hd16,*rbuf; int retv,i,ncount=0; struct termios oldtio; int realdata=0; spfd=open(/dev/ttyS1,O_RDWR|O_NOCTTY); if(spfd0) return -1; tcgetattr(spfd,&oldtio); /保存串口的當(dāng)前設(shè)置 cfmakeraw(&oldtio); cfsetispeed(&oldtio,B19200); cfsetospeed(&oldtio,B19200); tcsetattr(spfd,T

12、CSANOW,&oldtio); /選擇新設(shè)置,TCSANOW表示設(shè) 置立即生效 rbuf=hd; printf(ready for receiving data.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(the number received is %dn,retv); if(retv=-1) perror(read); for(i=0;incount;i+) realdata

13、+=(hd i -48)*pow(10,ncount-i-1); printf(complete receiving the data %dn,realdata); close(spfd); return 0; 11.1.2 串口舉例發(fā)送程序writetest.c的源碼如下: #include #include #include #include #include #include #include #include int spfd; int main(int argc, char *argv) char fname16,*sbuf; int sfd,retv,i; struct termi

14、os oldtio; spfd=open(/dev/ttyS0,O_RDWR|O_NOCTTY); perror(open /dev/ttyS0); if(spfd0) return -1; printf(ready for sending data.n); tcgetattr(spfd,&oldtio); cfmakeraw(&oldtio); cfsetispeed(&oldtio,B19200); cfsetospeed(&oldtio,B19200); tcsetattr(spfd,TCSANOW,&oldtio); fname0=1; fname1=2; fname2=3; fnam

15、e3=0; sbuf=(char *)malloc(4); strncpy(sbuf,fname,4); retv=write(spfd,sbuf,4); if(retv=-1) perror(write); printf(the number of char sent is %dn,retv); close(spfd); return 0; 11.1.2 串口舉例 本例程實(shí)現(xiàn): 在發(fā)送端發(fā)送數(shù)字123,在接收端接收并顯示接收到的數(shù)據(jù)。 這里請(qǐng)同學(xué)們注意的是: 發(fā)送方按字符發(fā)送數(shù)據(jù),接收方將接收的字符相應(yīng)的ascii值與字符0所對(duì)應(yīng)的ascii值相減,最終得到實(shí)際的十進(jìn)制數(shù)值。 11.2 網(wǎng)絡(luò)

16、應(yīng)用11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用 以太網(wǎng)技術(shù)作為當(dāng)前局域網(wǎng)的主流技術(shù),可以提供從10Mbit/s,100Mbit/s到1000Mbit/s的物理帶寬,以及比較好的抗干擾性、比較大的網(wǎng)絡(luò)半徑和比較低系統(tǒng)維護(hù)費(fèi)用;同時(shí)在不同速率以太網(wǎng)之間保持比較好的前向兼容性,所以在系統(tǒng)升級(jí)時(shí)很方便。圖11-1 以太網(wǎng)電路結(jié)構(gòu)圖11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用1. 網(wǎng)絡(luò)基礎(chǔ)(1) TCP/IP協(xié)議分層模型 在實(shí)際操作中接觸到的通常只是網(wǎng)絡(luò)系統(tǒng)的最高層應(yīng)用層的用戶界面。實(shí)際上要進(jìn)行網(wǎng)際的數(shù)據(jù)傳送,需要經(jīng)過如下的步驟: 需要發(fā)送的數(shù)據(jù)如E-mail、web頁(yè)等,通過用戶界面由應(yīng)用程序傳送到應(yīng)用程序的數(shù)據(jù)發(fā)送緩

17、沖區(qū),并設(shè)置好與下一層連接的參數(shù)等待發(fā)送。 數(shù)據(jù)做好傳輸前的準(zhǔn)備工作,進(jìn)入傳輸層。傳輸層主要負(fù)責(zé)為兩臺(tái)主機(jī)上的應(yīng)用程序提供端口到端口的通信。 然后進(jìn)入網(wǎng)絡(luò)層的范疇。這里主要處理數(shù)據(jù)分組在網(wǎng)絡(luò)中的活動(dòng),例如分組的選路。 當(dāng)然最終數(shù)據(jù)還是要靠物理層的電磁波或光導(dǎo)纖維來傳輸。 在接收的一方是相反的過程,數(shù)據(jù)從最底層一直到應(yīng)用層還原為 用戶可以識(shí)別的信息,這一切都是由上面的協(xié)議來規(guī)范的。 11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用(2) 數(shù)據(jù)的封裝與分用 數(shù)據(jù)的封裝用戶數(shù)據(jù)從應(yīng)用層逐級(jí)傳送到鏈路層,每經(jīng)過一層都要被該層的協(xié)議進(jìn)行一定的封裝、標(biāo)識(shí)和改造,就是給這個(gè)數(shù)據(jù)增加一些頭部信息(或尾部信息)。 數(shù)據(jù)封裝過

18、程如圖11-3所示。圖 11-3 數(shù)據(jù)的封裝過程11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用 數(shù)據(jù)的分用(解包)在接收端接收這些數(shù)據(jù)的時(shí)候,經(jīng)過拆分的數(shù)據(jù)要重新組合,并且去掉各層加上的頭部信息,把數(shù)據(jù)還原。(3) 客戶服務(wù)器模型 目前大多數(shù)網(wǎng)絡(luò)應(yīng)用程序在編寫時(shí)都采用客戶服務(wù)器模型,假設(shè)端是客戶,另一端是服務(wù)器,讓服務(wù)器提供給客戶一定的服務(wù)內(nèi)容。 并發(fā)型交互在并發(fā)型交互模式下,程度的主要運(yùn)作步驟如下: 等待一個(gè)客戶請(qǐng)求的到來; 生成一個(gè)新的進(jìn)程或者任務(wù)來處理這個(gè)客戶請(qǐng)求,同時(shí)這里還可以 接收其他客戶的請(qǐng)求。處理結(jié)束后,終止這個(gè)進(jìn)程。 反饋客戶端; 等待新的客戶請(qǐng)求的到來并進(jìn)行下一次服務(wù),如此循環(huán)運(yùn)作。11

19、.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用 重復(fù)型交互 重復(fù)型交互摸式下,程序的的主要運(yùn)作步驟如下: 等待一個(gè)客戶請(qǐng)求的到來; 處理客戶的請(qǐng)求,對(duì)客戶進(jìn)行服務(wù); 給客戶反饋信息,服務(wù)結(jié)束; 等待下一個(gè)請(qǐng)求到來,如此循環(huán)。11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用2. TCP套接字 Linux系統(tǒng)的套接字是一個(gè)通用的網(wǎng)絡(luò)編程接口。TCP協(xié)議就是通過套接字來實(shí)現(xiàn)連接的建立的,這里將就這個(gè)過程具體化并對(duì)其內(nèi)部的函數(shù)進(jìn)行必要的說明。(1) 套接字地址結(jié)構(gòu) 在頭文件中定義了以下結(jié)構(gòu)來保持套接字函數(shù)調(diào)用參數(shù)的一致性。 struct sockaddr unsigned short sa_family; / 地址類型,格式為AF

20、_xxxchar sa_data14; / 14字節(jié)的協(xié)議地址;11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用 其中的sa_family為套接字的協(xié)議簇地址類型,TCP/IP的協(xié)議對(duì)于IPv4地址類型為AF_INET。sa_data中存儲(chǔ)具體的協(xié)議地址,不同的協(xié)議簇有不同的地址格式。但一般編程中并不直接針對(duì)此數(shù)據(jù)結(jié)構(gòu)操作,而是使用另一個(gè)與sockaddr等價(jià)的數(shù)據(jù)結(jié)構(gòu)sockaddr_in(在netinet/in.h中定義): struct sockaddr_in unsigned short int sin_len;/*IPv4地址長(zhǎng)度*/ short int sin_family; /*地址類型*/

21、unsigned short int sin_port;/*存儲(chǔ)端口號(hào)*/ struct in_addr sin_addr; /*存儲(chǔ)IP地址*/ unsigned char sin_zero8; /*空字節(jié)*/ ;11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用 在編程中大多數(shù)是使用sockaddr_in這個(gè)結(jié)構(gòu)來設(shè)置獲取地址信息。sin_family指協(xié)議族,在TCP套接字編程中只能是AF_INET;sin_port存儲(chǔ)端口號(hào)(使用網(wǎng)絡(luò)字節(jié)順序),數(shù)據(jù)類型是一個(gè)16位的無符號(hào)整數(shù)類型; sin_addr存儲(chǔ)IP地址,IP地址使用in_addr這個(gè)數(shù)據(jù)結(jié)構(gòu): struct in_addr unsigned

22、 long s_addr; ; s_addr按照網(wǎng)絡(luò)字節(jié)順序存儲(chǔ)IP地址;sin_zero是為了讓sockaddr與sockaddr_in兩個(gè)數(shù)據(jù)結(jié)構(gòu)保持大小相同而保留的空字節(jié)。 11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用設(shè)置地址信息實(shí)例(IPv4) struct sockaddr_in mysock; /*設(shè)置sockaddr_in的結(jié)構(gòu)體變量 mysock*/ mysock.sin_family=AF_INET; /*TCP地址結(jié)構(gòu)*/ mysock.sin_port=htons(3490); /*short,NBO*/ mysock.sin_addr.s_addr=inet_addr(“0”);

23、 /*設(shè)置地址為0*/ bzero(&(mysock.sin_zero),8); /*設(shè)置sin_zero為8位保留字節(jié)*/注意: 如果mysock.sin_addr.s_addr= INADDR_ANY,則不指定IP地址(用于Server程序)。11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用(2) TCP客戶-服務(wù)器通信模型TCP客戶-服務(wù)器通信過程如圖11-4所示。圖 11-4 TCP客戶-服務(wù)器通信過程11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用(3) socket主要函數(shù) 強(qiáng)制類型轉(zhuǎn)換函數(shù)的調(diào)用: 將指向于特定協(xié)議的套接口地址結(jié)構(gòu)的指針類型-指向通用套接口地址結(jié)構(gòu)的指針。intconnect(int,str

24、uctsockaddr*,socklen_t)structsockaddr-inservaddr;connect(sockfd,(sturctsockaddr*)&servaddr,sizeof(servaddr);11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用 主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序的轉(zhuǎn)換函數(shù): #include unit16_thtons(uint16_thost16bitvalue); unit32_thtons(uint32_thost32bitvalue); unit16_tntohs(uint16_tnet16bitvalue); unit32_tntohs(uint32_tnet32bitv

25、alue); h:host n:network s:short(16bits) l:long(32bits)11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用 intsocket(intdomain,inttype, intprotocol)domain: 說明我們網(wǎng)絡(luò)程序所在的主機(jī)采用的通訊協(xié)族(AF_UNIX和AF_INET等)。type: 我們網(wǎng)絡(luò)程序所采用的通訊協(xié)議(SOCK_STREAM,SOCK_DGRAM等)SOCK_STREAM表明我們用的是TCP協(xié)議,這樣會(huì)提供按順序的,可靠,雙向,面向連接的比特流。SOCK_DGRAM表明我們用的是UDP協(xié)議,這樣只會(huì)提供定長(zhǎng)的,不可靠,無連接的通信。 p

26、rotocol: 由于我們指定了type, 所以這個(gè)地方我們一般只要用0來代替就可以了。socket為網(wǎng)絡(luò)通訊做基本的準(zhǔn)備。成功時(shí)返回文件描述符,失敗時(shí)返回-1,看errno可知道出錯(cuò)的詳細(xì)情況。11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用 intbind(intsockfd,structsockaddr*my_addr,intaddrlen) sockfd: 是由socket調(diào)用返回的文件描述符。 addrlen: 是sockaddr結(jié)構(gòu)的長(zhǎng)度。 my_addr: 是一個(gè)指向sockaddr的指針。 intlisten(intsockfd, intbacklog) sockfd: 是bind后的文件描

27、述符。 backlog: 設(shè)置請(qǐng)求排隊(duì)的最大長(zhǎng)度。當(dāng)有多個(gè)客戶端程序和服務(wù)端相連時(shí),使用這個(gè)表示可以介入的排隊(duì)長(zhǎng)度。listen函數(shù)將bind的文件描述符變?yōu)楸O(jiān)聽套接字,返回的情況和bind一樣。 intaccept(intsockfd,structsockaddr*addr, int*addrlen) sockfd:是listen后的文件描述符。 addr,addrlen是用來給客戶端的程序填寫的, 服務(wù)器端只要傳遞指針就可以了。bind, listen和accept是服務(wù)器端用的函數(shù),accept調(diào)用時(shí), 服務(wù)器端的程序會(huì)一直阻塞到有一個(gè)客戶程序發(fā)出了連接。 accept成功時(shí)返回最后的服

28、務(wù)器端的文件描述符, 這個(gè)時(shí)候服務(wù)器端可以向該描述符寫信息了,失敗時(shí)返回-1。 11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用 intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen)sockfd是socket返回的文件描述符。serv_addr: 儲(chǔ)存了服務(wù)器端的連接信息,其中sin_add是服務(wù)端的地址。 addrlen: serv_addr的長(zhǎng)度。connect函數(shù)是客戶端用來同服務(wù)端連接的。成功時(shí)返回0,sockfd是同服務(wù)端通訊的文件描述符,失敗時(shí)返回-1。 ssize_twrite(intfd, constvoid*buf, size_

29、tnbytes) write函數(shù)將buf中的nbytes字節(jié)內(nèi)容寫入文件描述符fd。 成功時(shí)返回寫的字節(jié)數(shù), 失敗時(shí)返回-1。并設(shè)置errno變量,在網(wǎng)絡(luò)程序中,當(dāng)我們向套接字文件描述符寫時(shí)有兩種可能。 write的返回值大于0,表示寫了部分或者是全部的數(shù)據(jù)。返回的值小于0,此時(shí)出現(xiàn)了錯(cuò)誤.我們要根據(jù)錯(cuò)誤類型來處理。 11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用 ssize_tread(intfd, void*buf, size_tnbyte)read函數(shù)是從fd中讀取內(nèi)容。當(dāng)讀成功時(shí),read返回實(shí)際所讀的字節(jié)數(shù),如果返回的值是0表示已經(jīng)讀到文件的結(jié)束了,小于0表示出現(xiàn)了錯(cuò)誤。 recv和send函數(shù)

30、提供了和read和write差不多的功能,不過提供了第四個(gè)參數(shù)來控制讀寫操作。 intrecv(intsockfd, void*buf,intlen, intflags)intsend(intsockfd, void*buf, intlen,intflags)前面的三個(gè)參數(shù)和read, write一樣,第四個(gè)參數(shù)可以是0或者是以下的組合: MSG_DONTROUTE:不查找路由表 MSG_OOB:接受或者發(fā)送帶外數(shù)據(jù) MSG_PEEK:查看數(shù)據(jù),并不從系統(tǒng)緩沖區(qū)移走數(shù)據(jù) MSG_WAITALL:等待所有數(shù)據(jù)11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用3.舉例 我們將使用TCP協(xié)議提供的服務(wù),組成一個(gè)簡(jiǎn)單

31、的重復(fù)型的網(wǎng)絡(luò)時(shí)間服務(wù)器。在一臺(tái)EV44B0II系統(tǒng)中啟動(dòng)服務(wù)程序并指定服務(wù)端口。在另外一臺(tái)EV44B0II系統(tǒng)中啟動(dòng)客戶端程序并指定服務(wù)器IP地址和服務(wù)端口。服務(wù)器將接收該服務(wù),并返回服務(wù)器本地的系統(tǒng)時(shí)間。本程序使用TCP協(xié)議,可以工作在服務(wù)器或客戶端狀態(tài)。使用的默認(rèn)端口號(hào)為9988。 程序流程圖如圖11-5所示:圖11-5 流程圖11.2.1 TCP/IP網(wǎng)絡(luò)應(yīng)用附程序清單:/*TCP/IP nettime service*/#include #include #include #include #include #include #include #include #include #i

32、nclude #include #include #include #include #include #include #include #include #include extern char *optarg; /* getopt */#define COM_SERVER 1#define COM_CLIENT2int ComStatus;#define PORT_NUMBER 0 x1000short ComPort ;int main(int argc,char * argv )int fd_listen,fd_client,fd_service;char server_ip64;

33、int port; struct sockaddr_in sn = AF_INET ; int sa_len; char * buffer; int start,packet_len,c,counter; int debug; ComStatus = COM_SERVER; ComPort = PORT_NUMBER; while(c = getopt(argc,argv,sc:o:) != -1)switch(c)case c: /* get server ip address */ memcpy(server_ip,optarg,(strlen(optarg)+1); ComStatus

34、= COM_CLIENT;break; case s: /* open debug flag */ ComStatus = COM_SERVER; break; case o:ComPort = atoi(optarg); break; default: /* print usage */ fprintf(stderr, Usage: %s -c | -s -p n, argv0);exit(1);/* setup address and port */sn.sin_port = _constant_htons(ComPort);sn.sin_addr.s_addr = 0;if(argc 2

35、)fprintf(stderr,n argv too less n);exit(1); /* alloc mem for data buffer */packet_len = 256;buffer = malloc(packet_len);if(buffer 0) fprintf(stderr,n malloc buffer error n); exit(1); if(ComStatus = COM_SERVER)/* server process */if(fd_listen = socket(AF_INET,SOCK_STREAM,0) 0)fprintf(stderr,ncan not

36、open server socket ,exitn);exit(1);if(bind(fd_listen,(struct sockaddr *)&sn, sizeof(sn) 0) fprintf(stderr,ncan not bin server,socket,exitn);close(fd_listen);exit(1); if (listen(fd_listen, 1) 0)fprintf(stderr,listen failed,exit);close(fd_listen);exit(1);sa_len = sizeof(sn);printf(nget service request

37、 from %sn,inet_ntoa(sn.sin_addr);start = time(0);*(int *)buffer = start;while(1) /* loop service*/fd_service = accept(fd_listen, (struct sockaddr *)&sn, &sa_len);if (fd_service 0) perror(accept failed);exit(1);elseif(write(fd_service,buffer,packet_len) 0)perror(server write);close(fd_listen); close(

38、fd_service);exit(1);printf(ncurrent time %d sn,start);close(fd_service);close(fd_listen); else /* client process */if(fd_client = socket(AF_INET,SOCK_STREAM,0) 0)perror(client socket);exit(1);sn.sin_addr.s_addr = inet_addr(server_ip);sa_len = sizeof(sn);if(connect(fd_client,(struct sockaddr *)&sn,sa

39、_len) 0)perror(client connect);close(fd_client);exit(1);if(counter = read(fd_client,buffer,packet_len) boa c /tmp/ & ”命令。11.2.2 web服務(wù)器應(yīng)用3. 程序說明程序說明如下: /* rc */* 本腳本將為boa建立運(yùn)行的根目錄,和其他運(yùn)行環(huán)境 */ hostname Samsung/bin/expand /etc/ramfs.img /dev/ram0mount -t proc proc /procmount -t ext2 /dev/ram0 /varmkdir /

40、var/configmkdir /var/tmpmkdir /var/logmkdir /var/runmkdir /var/lockcat /etc/motdifconfig lo route add -net netmask lodhcpcd -p -a eth0 &cd /tmpmkdir cgi_bincd /etccp index.html /tmpcp boa.conf /tmpcp mime.types /tmpcp cgi_bin/* /tmp/cgi_binchmod 775 /tmp/cgi_bin/*#mount -t jffs /dev/mtdblock1 /var#i

41、fconfig eth0 hw ether 00:11:22:33:44:55#ifconfig eth0 4#login /* cgi.c */* 本程序接收boa傳遞的參數(shù),控制數(shù)碼管顯示指定的數(shù)字,并返回網(wǎng)頁(yè) */ #include #include #include cgivars.h#include htmllib.h#include template.hint main( ) char *postvars = NULL; /* POST request data repository */ char *getvars = NULL; /* GET request data repo

42、sitory */ int form_method; /* POST = 1, GET = 0 */ form_method = getRequestMethod( );/* decide form request method ,POST or GET */if(form_method = POST) /* get vars from request string */ getvars = getGETvars( ); postvars = getPOSTvars( ); else if(form_method = GET) /* In this exp,we use GET in inde

43、x.html */ getvars = getGETvars( ); if(getvars) int i = 0; while(getvars i) if(strcmp(getvarsi,LampNum) = 0) /* get which number is on */ /* control reg */ static volatile unsigned int*iopmod = (volatile unsigned int *) (0 x3ff5000); static volatile unsigned int*iopdata = (volatile unsigned int *) (0

44、 x3ff5008); int lampnum =0; lampnum = strtoul(getvarsi+1,NULL,0); /* light number */ iopmod0=0 x000000ff; iopdata0 = (lampnum); break; i += 2; /* write web page to std out */ htmlHeader(Demo Web Page); htmlBody(); template_page(postvars, form_method); htmlFooter(); cleanUp(form_method, getvars, post

45、vars); /* display */ fflush(stdout); exit(0); 11.2.2 web服務(wù)器應(yīng)用4. 運(yùn)行過程(1)對(duì)程序修改后,重新編譯內(nèi)核并焼寫燒寫到EV44B0II評(píng)估板。(2) 啟動(dòng)EV44B0II評(píng)估板。確認(rèn)EV44B0II的IP地址。(3) 運(yùn)行boa -c /tmp/ & ,啟動(dòng)web服務(wù)器。(4) 打開PC上的瀏覽器(如IE6或Netscape)輸入EV44B0II的IP作為網(wǎng) 址,例如25/ ,這時(shí)就可以看到要測(cè)試的網(wǎng)頁(yè)內(nèi) 容。網(wǎng)頁(yè)內(nèi)容是/tmp/index.html文件。(5) 在lamp number 文本框中,寫入“1”,然后點(diǎn)擊 “displ

46、ay”。(6) EV44B0上的數(shù)碼管顯示對(duì)應(yīng)數(shù)字。(7) 在瀏覽器上顯示“Demo Web Page”。11.3 音頻設(shè)備應(yīng)用 S3C44B0II包含一個(gè)IIS總線接口,它可以作為連接8位或16位立體聲編解碼集成電路的接口,IIS總線接口提供內(nèi)置FIFO的DMA傳送模式,可以同時(shí)接收和發(fā)送,或單獨(dú)接收和發(fā)送。 IIS總線接口可以發(fā)送和接收采樣量化過的聲音數(shù)據(jù),它為外部的CODEC芯片提供工作主時(shí)鐘,數(shù)據(jù)收發(fā)時(shí)鐘和左右聲道選擇信號(hào)。具體的采樣量化工作留給CODEC芯片完成。在接收方向,CODEC將模擬聲音采樣量化;在發(fā)送方向,CODEC將聲音數(shù)據(jù)還原為模擬聲音。UDA1341和IIS的驅(qū)動(dòng)程序

47、,位于/Linux/drivers/char目錄下。它們是ev44b0_sound.c、ev44b0_sound.h、l3-ev44b0.c。音頻設(shè)備文件的設(shè)備名為/dev/audio。11.3.1 常用音頻文件格式1. WAV文件(1) 概述WAV是Microsoft Windows本身提供的音頻格式,由于Windows本身的影響力,這個(gè)格式已經(jīng)成為了事實(shí)上的通用音頻格式。 (2) WAV文件的結(jié)構(gòu)在Windows環(huán)境下,大部分的多媒體文件都遵循著一種結(jié)構(gòu)來存放信息,這種結(jié)構(gòu)稱為“資源互換文件格式”(Resources lnterchange File Format),簡(jiǎn)稱RIFF。WAV為

48、WAVEFORM(波形)的縮寫。聲音文件的結(jié)構(gòu)如圖116所示,“RIFF”的格式辨別碼為“WAVE”。整個(gè)文件由兩個(gè)chunk所組成:辨別碼fmt(注意,最后一個(gè)是空白字符!)及data。在fmt的chunk下包含了一個(gè)PCMWAVEFORMAT數(shù)據(jù)結(jié)構(gòu),其定義如下:圖 11-6 WAVE文件結(jié)構(gòu)11.3.1 常用音頻文件格式 整個(gè)文件由兩個(gè)chunk所組成:辨別碼“fmt”(注意,最后一個(gè)是空白字符!)及“data”。在“fmt”的chunk下包含了一個(gè)PCMWAVEFORMAT數(shù)據(jù)結(jié)構(gòu),其定義如下: typedef struct pcmwaveformat - tag WAVEFORMAT

49、 wf ;WORD wBitsPerSample; PCMWAVEFORMAT; typedef struct waveformat - tag WORD wFormatTag ; WORD nChannels; DWORD nSamplesPerSec; DWORD nAvgBytesperSec; WORD nBlockAlign; WAVEFORMAT;11.3.1 常用音頻文件格式其意義分別為:wFormatTag:記錄著此聲音的格式代號(hào),例如WAVE_FORMAT_PCM,WAVE_F0RAM_ADPCM等等。nChannels:記錄聲音的頻道數(shù)。nSamp1esPerSec:記錄每

50、秒取樣數(shù)。nAvgBytesPerSec:記錄每秒的數(shù)據(jù)量。nBlockA1ign:記錄區(qū)塊的對(duì)齊單位。wBitsPerSample:記錄每個(gè)取樣所需的位元數(shù)。11.3.1 常用音頻文件格式2. mp3格式 (1) 概述mp3是Fraunhofer-IIS研究所的研究成果。mp3是第一個(gè)實(shí)用的有損音頻壓縮編碼。衡量mp3文件的壓縮比例通常使用比特率來表示。由于mp3是世界上第一個(gè)有損壓縮的編碼方案,所以可以說所有的播放軟件都支持它,否則就根本沒有生命力。在制作方面,也曾經(jīng)產(chǎn)生了許多第三方的編碼工具。 (2) MP3的文件結(jié)構(gòu)MPEG音頻文件沒有文件頭而是由很多獨(dú)立的數(shù)據(jù)幀構(gòu)成,每個(gè)幀都是獨(dú)立的

51、可以被單獨(dú)播放,每個(gè)幀都有自己的幀頭和音頻信息。幀頭是有32bits(4bytes)構(gòu)成,起始的11bit是幀同步信息。幀可以有CRC校驗(yàn)信息,也可以沒有。一般來說都沒有CRC校驗(yàn)。CRC校驗(yàn)信息為16bit長(zhǎng),它緊跟在幀頭的后面,在校驗(yàn)信息后就是經(jīng)過壓縮的音樂文件數(shù)據(jù)了。MP3文件的比特率表如表111所示。表 11-1 MP3文件的比特率11.3.1 常用音頻文件格式MP3文件的采樣率表如表112所示。表 11-2 MP3文件的采樣率表11.3.1 常用音頻文件格式MP3文件的播放模式表如表113所示。 表 11-3 MP3文件的采樣率表11.3.2 播放WAV文件舉例1. 程序 該程序由s

52、ound.c和wave.h組成,sound.c中包含了*.wave文件的處理,和sound驅(qū)動(dòng)的使用;wave.h中包含了wave文件的宏定義。附源程序: #include #include #include #include #include #include #include #include wave.h #define WAVEFILE /bin/test.wav #define AUDIOBUFLEN 4096 /* 4K bytes buffer */ static unsigned int bufferAUDIOBUFLEN/4; int main(void) int fd_de

53、v,fd_file;int result,len,i; struct wave_s *wave_head; struct audio_mix mix; char *buf =(char *) buffer; char ctl_buf100; fprintf(stderr,nttWelcome to MICETEK WorldnNow doing sound test.nn); fprintf(stderr,Open audio device : /dev/audion);if (-1 = (fd_dev = open( /dev/audio, O_WRONLY) fprintf(stderr,

54、 Failed to open audio devicen ); return 0;fprintf(stderr,Open wave file : %sn,WAVEFILE); if ( -1 = (fd_file = open(WAVEFILE, O_RDONLY) fprintf(stderr, Failed to open /bin/test.wave filen ); return 0; result = read(fd_file,buf,sizeof(struct wave_s); if (result format0!= R)|(wave_head-format1!= I)|(wa

55、ve_head-format2 != F)| (wave_head-format3 != F) fprintf(stderr, File format (1) error.n ); return 0; printf(File length= %dn,wave_head-file_length); wave_head-format27 = 0; if (strcmp(wave_head-format2,WAVEfmt) != 0) fprintf(stderr, File format (2) error.n );return 0; printf(Channels = %dn,wave_head

56、-nChannels); printf( IO ctrl Channelsn); sprintf(ctl_buf,%d,wave_head-nChannels); ioctl(fd_dev,SNDCTL_DSP_CHANNELS,ctl_buf); printf(Samples Per Sec = %dn,wave_head-nSamplesPerSec); printf( IO ctrl SamplesPerSecn); sprintf(ctl_buf,%d,wave_head-nSamplesPerSec); ioctl(fd_dev,SNDCTL_DSP_SPEED,ctl_buf);

57、printf(Avg Bytes Per Sec = %dn,wave_head-nAvgBytesPerSec); printf(Block Align = %dn,wave_head-nBlockAlign); printf(Bits Per Sample = %dn,wave_head-wBitsPerSample); if(wave_head-format30!=d)|(wave_head-format31!= a)|( wave_head-format32 != t)| (wave_head-format33 != a) fprintf(stderr, File format (3)

58、 is Unknown.n );else fprintf(stderr, File format (3) is data.n ); printf(Total Data Bytes = %dn,wave_head-nDataBytes); len = wave_head-nDataBytes; /* real audio length*/ while (len) unsigned int length,ret; if (len AUDIOBUFLEN) length = AUDIOBUFLEN; else length = len; result = read(fd_file,buf,lengt

59、h); if (result 0) printf(Read File error.n); return 0; ret = wriate(fd_dev,buf,result); if (ret 0) printf(Write Audio error.n); return 0; len -= result; close(fd_file); printf(Close Wave File: %sn,WAVEFILE); close(fd_dev); printf(Close device File : /dev/audio n); /*Record test*/ fprintf(stderr,Open

60、 audio device for Recordn);if (-1 = (fd_dev = open( /dev/audio, O_RDONLY) fprintf(stderr, Failed to open audio devicen ); return 0; buf = malloc(600000); if (buf = 0) fprintf(stderr, Failed to malloc a buffer for Record.n ); return 0; fprintf(stderr,Record will start after 3 seconds, and record time

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論