第11章应用程序开发-哈尔滨理工大学电子邮件系统

上传人:陈** 文档编号:180696484 上传时间:2023-01-07 格式:PPTX 页数:99 大小:2MB
收藏 版权申诉 举报 下载
第11章应用程序开发-哈尔滨理工大学电子邮件系统_第1页
第1页 / 共99页
第11章应用程序开发-哈尔滨理工大学电子邮件系统_第2页
第2页 / 共99页
第11章应用程序开发-哈尔滨理工大学电子邮件系统_第3页
第3页 / 共99页
资源描述:

《第11章应用程序开发-哈尔滨理工大学电子邮件系统》由会员分享,可在线阅读,更多相关《第11章应用程序开发-哈尔滨理工大学电子邮件系统(99页珍藏版)》请在装配图网上搜索。

1、 第第11章章 应用程序开发应用程序开发本章主要内容a)串口应用程序的编写方法。b)TCP/IP协议以及Socket的编写方法。c)基于uClinux音频接口的应用程序的编写 方法。d)键盘和LCD的应用程序的编写方法。e)汉字音乐点播程序的编写实例。第十一章 目录q1.串口应用程序 l 串口主要函数介绍l 串口举例 q2.网络应用l TCP/IP网络应用l Web服务器应用q3 音频设备应用l 常用音频文件格式l 播放WAV文件举例q4 键盘及LCD显示应用l LCD介绍l 键盘实现q5 汉字音乐点播应用第十一章 目录q1.串口应用程序 l 串口主要函数介绍l 串口举例 q2.网络应用l T

2、CP/IP网络应用l Web服务器应用q3 音频设备应用l 常用音频文件格式l 播放WAV文件举例q4 键盘及LCD显示应用l LCD介绍l 键盘实现p3 音频设备应用 本章从一个针对运行在本章从一个针对运行在S3C44B0X上的上的uClinux操作系统进行应用程序的开发入手,操作系统进行应用程序的开发入手,给出给出Windows操作系统平台上使用操作系统平台上使用Hitool for uClinux等工具开发的多种应用程序。等工具开发的多种应用程序。本章主要介绍了:本章主要介绍了:a)串口应用程序的编写方法。b)TCP/IP协议以及Socket的编写方法。c)基于uClinux音频接口的应

3、用程序的编写 方法。d)键盘和LCD的应用程序的编写方法。e)汉字音乐点播程序的编写实例。11.1 11.1 串口应用程序串口应用程序nS3C44B0X提供提供2个个UART收发器,对它们可以操作在中断方式或收发器,对它们可以操作在中断方式或DMA方式。它们内置波特率发生器,波特率发生器的时钟源为方式。它们内置波特率发生器,波特率发生器的时钟源为S3C44B0X的系统使用,所以最高速率可达的系统使用,所以最高速率可达115.2K bps。二个串口有。二个串口有单独的波特率发生器,接收、发送和控制单元,支持红外方式的传送单独的波特率发生器,接收、发送和控制单元,支持红外方式的传送和接收。和接收。

4、n同时,在同时,在S3C44B0X串口的接收器和发送器中都有串口的接收器和发送器中都有16字节的字节的FIFO,FIFO可以有效的降低接收器和发送器对可以有效的降低接收器和发送器对CPU的中断频率,提高发送的中断频率,提高发送和接收的效率。和接收的效率。n串口设备的可配置参数包括波特率,起始位数量,数据位数量,停止串口设备的可配置参数包括波特率,起始位数量,数据位数量,停止位数量和流量控制协议。位数量和流量控制协议。n在在Linux操作系统中,设备驱动是以主设备号为主,每个设备都有唯操作系统中,设备驱动是以主设备号为主,每个设备都有唯一的主设备号和从设备号。一的主设备号和从设备号。11.1.1

5、 11.1.1 串行口主要函数介绍串行口主要函数介绍 1.1.打开串口打开串口 在在Linux 下串口文件是位于下串口文件是位于/dev 下,串口下,串口0为为/dev/ttyS0,串口,串口1为为/dev/ttyS1,O_RDWR是以读写方式打开串口,是以读写方式打开串口,O_NOCTTY表示该程表示该程序不会成为控制终端,避免了当在键盘输入类似序不会成为控制终端,避免了当在键盘输入类似ctrl+c的命令后,终的命令后,终止程序的运行。止程序的运行。打开串口是通过使用标准的文件打开函数操作:打开串口是通过使用标准的文件打开函数操作:int fd;fd=open(/dev/ttyS0,O_RD

6、WR);if(-1=fd)perror(提示错误!提示错误!);11.1.1 11.1.1 串行口主要函数介绍串行口主要函数介绍2.2.设置串口设置串口最基本的设置串口包括波特率设置,效验位和停止位设置。串口的最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置如下设置主要是设置如下struct termios 结构体的各成员值:结构体的各成员值:struct termios unsigned short c_iflag;/输入模式标志输入模式标志unsigned short c_oflag;/输出模式标志输出模式标志unsigned short c_cflag;/控制模式

7、标控制模式标志志unsigned short c_lflag;/local mode flags unsigned char c_line;/line disciplineunsigned char c_ccNCC;/control characters ;11.1.1 11.1.1 串行口主要函数介绍串行口主要函数介绍n通过对通过对c_cflag的赋值,设置波特率,字符大小,使能本地连接,使能的赋值,设置波特率,字符大小,使能本地连接,使能串行口驱动读取输入数据。串行口驱动读取输入数据。n通过设置通过设置c_iflag,控制端口对字符的输入处理过程,控制端口对字符的输入处理过程,IGNPAR

8、符号常符号常量表示忽略奇偶性错误的字节,不对输入数据进行任何校验,量表示忽略奇偶性错误的字节,不对输入数据进行任何校验,ICRNL 将回车符映射为换行符。将回车符映射为换行符。这里就只考虑常见的一些设置:这里就只考虑常见的一些设置:(1)波特率设置:波特率设置:下面是修改下面是修改波特率波特率的代码:的代码:struct termios Opt;tcgetattr(fd,&Opt);cfsetispeed(&Opt,B19200);/设置为设置为19200Bpscfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);11.1.1 11.1.1 串行

9、口主要函数介绍串行口主要函数介绍(2)校验位和停止位的设置:校验位和停止位的设置:无效验无效验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|=PAR

10、ENB;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 11.1.1 串行口主要函数介绍串行口主要函数介绍 设置停止位设置停止位1 位:位:options.c_cflag&=CSTOPB;2 位:位:options.c_cflag|=CSTOPB;需要

11、需要注意注意的是:的是:如果不是开发终端之类的,只是串口传输数据,而不需要串口来如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式处理,那么使用原始模式(Raw Mode)(Raw Mode)方式来通讯方式来通讯。设置方式如下:设置方式如下:options.c_lflag&=(ICANON|ECHO|ECHOE|ISIG);/Inputoptions.c_oflag&=OPOST;/Output3.3.读写串口读写串口设置好串口之后,读写串口就很容易,把串口当作文件读写就可以了。设置好串口之后,读写串口就很容易,把串口当作文件读写就可以了。(1)发送数据发送数据ch

12、ar buffer1024;int Length1024;11.1.1 11.1.1 串行口主要函数介绍串行口主要函数介绍 int nByte;nByte=write(fd,buffer,Length)(2)读取串口数据读取串口数据 使用文件操作使用文件操作read 函数读取,如果设置为原始模式函数读取,如果设置为原始模式(Raw Mode)传输传输数据,那么数据,那么read函数返回的字符数是实际串口收到的字符数。可以使函数返回的字符数是实际串口收到的字符数。可以使用操作文件的函数来实现异步读取,如用操作文件的函数来实现异步读取,如fcntl,或者,或者select等来操作。等来操作。cha

13、r buff1024;int Len1024;int readByte=read(fd,buff,Len);4.4.关闭串口关闭串口关闭串口就是关闭文件。关闭串口就是关闭文件。close(fd);11.1.2 11.1.2 串口举例串口举例 假设接收程序假设接收程序readtest.c运行在装有标准运行在装有标准Linux的的PC机上,发送程机上,发送程序序writetest.c运行在目标板运行在目标板S3C44B0X上,两台设备的串口通过交叉线上,两台设备的串口通过交叉线连接在一起。连接在一起。接收程序接收程序readtest.c的源码如下:的源码如下:#include#include#in

14、clude#include#include#include#include#include#include#include 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);/保存串口的当前设置保存串口的当前设置 cfmakeraw(&oldtio);cfsetispeed(&oldtio

15、,B19200);cfsetospeed(&oldtio,B19200);tcsetattr(spfd,TCSANOW,&oldtio);/选择新设置,选择新设置,TCSANOW表示设表示设 置立即生效置立即生效 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);i

16、f(retv=-1)perror(read);for(i=0;incount;i+)realdata+=(hd i-48)*pow(10,ncount-i-1);printf(complete receiving the data%dn,realdata);close(spfd);return 0;11.1.2 11.1.2 串口举例串口举例发送程序发送程序writetest.c的源码如下:的源码如下:#include#include#include#include#include#include#include#include int spfd;int main(int argc,char*

17、argv)char fname16,*sbuf;int sfd,retv,i;struct termios 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,&oldt

18、io);fname0=1;fname1=2;fname2=3;fname3=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 11.1.2 串口举例串口举例 本例程实现:本例程实现:在发送端发送数字在发送端发送数字123123,在接收端接收,在接收端接收并显示接收到的数据。并显示接收到的数据。这里请同学们这里请同学们

19、注意注意的是:的是:发送方按字符发送数据,接收方将接收的字发送方按字符发送数据,接收方将接收的字符相应的符相应的asciiascii值与字符值与字符0 0所对应的所对应的asciiascii值相减,值相减,最终得到实际的十进制数值。最终得到实际的十进制数值。11.2 网络应用11.2.1 TCP/IP网络应用 以太网技术作为当前局域网的主流技术,可以提供从以太网技术作为当前局域网的主流技术,可以提供从10Mbit/s,100Mbit/s到到1000Mbit/s的物理带宽,以及比较好的抗干扰性、比较大的物理带宽,以及比较好的抗干扰性、比较大的网络半径和比较低系统维护费用;同时在不同速率以太网之间

20、保持的网络半径和比较低系统维护费用;同时在不同速率以太网之间保持比较好的前向兼容性,所以在系统升级时很方便。比较好的前向兼容性,所以在系统升级时很方便。图11-1 以太网电路结构图11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用1.1.网络基础网络基础(1)TCP/IP协议分层模型协议分层模型 在实际操作中接触到的通常只是网络系统的最高层在实际操作中接触到的通常只是网络系统的最高层应用层的用户界面。应用层的用户界面。实际上要进行网际的数据传送,需要经过如下的步骤:实际上要进行网际的数据传送,需要经过如下的步骤:需要发送的数据如需要发送的数据如E-mail、web页等,通过用

21、户界面由应用程序传送到应页等,通过用户界面由应用程序传送到应用程序的数据发送缓冲区,并设置好与下一层连接的参数等待发送。用程序的数据发送缓冲区,并设置好与下一层连接的参数等待发送。数据做好传输前的准备工作,进入传输层。传输层主要负责为两台主机上数据做好传输前的准备工作,进入传输层。传输层主要负责为两台主机上的应用程序提供端口到端口的通信。的应用程序提供端口到端口的通信。然后进入网络层的范畴。这里主要处理数据分组在网络中的活动,例如分然后进入网络层的范畴。这里主要处理数据分组在网络中的活动,例如分组的选路。组的选路。当然最终数据还是要靠物理层的电磁波或光导纤维来传输。当然最终数据还是要靠物理层的

22、电磁波或光导纤维来传输。在接收的一方是相反的过程,数据从最底层一直到应用层还原为在接收的一方是相反的过程,数据从最底层一直到应用层还原为 用户可以识别的信息,这一切都是由上面的协议来规范的。用户可以识别的信息,这一切都是由上面的协议来规范的。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用(2)数据的封装与分用数据的封装与分用 数据的封装数据的封装用户数据从应用层逐级传送到链路层,每经过一层都要被该层的协议用户数据从应用层逐级传送到链路层,每经过一层都要被该层的协议进行一定的封装、标识和改造,就是给这个数据增加一些头部信息进行一定的封装、标识和改造,就是给这个数据增加一些头

23、部信息(或尾部信息或尾部信息)。数据封装过程数据封装过程如图如图11-3所示。所示。图 11-3 数据的封装过程11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用 数据的分用数据的分用(解包解包)在接收端接收这些数据的时候,经过拆分的数据要重新组合,并且去在接收端接收这些数据的时候,经过拆分的数据要重新组合,并且去掉各层加上的头部信息,把数据还原。掉各层加上的头部信息,把数据还原。(3)客户客户服务器模型服务器模型 目前大多数网络应用程序在编写时都采用客户目前大多数网络应用程序在编写时都采用客户服务器模型,假服务器模型,假设设端是客户,另一端是服务器,让服务器提供给客户一定的

24、服务内端是客户,另一端是服务器,让服务器提供给客户一定的服务内容。容。并发型交互并发型交互在并发型交互模式下,程度的主要运作步骤如下:在并发型交互模式下,程度的主要运作步骤如下:等待一个客户请求的到来;等待一个客户请求的到来;生成一个新的进程或者任务来处理这个客户请求,同时这里还可生成一个新的进程或者任务来处理这个客户请求,同时这里还可以以 接收其他客户的请求。处理结束后,终止这个进程。接收其他客户的请求。处理结束后,终止这个进程。反馈客户端;反馈客户端;等待新的客户请求的到来并进行下一次服务,如此循环运作。等待新的客户请求的到来并进行下一次服务,如此循环运作。11.2.1 TCP/IP11.

25、2.1 TCP/IP网络应用网络应用 重复型交互重复型交互 重复型交互摸式下,程序的的主要运作步骤如下:重复型交互摸式下,程序的的主要运作步骤如下:等待一个客户请求的到来;等待一个客户请求的到来;处理客户的请求,对客户进行服务;处理客户的请求,对客户进行服务;给客户反馈信息,服务结束;给客户反馈信息,服务结束;等待下一个请求到来,如此循环。等待下一个请求到来,如此循环。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用2.2.TCP套接字套接字 Linux系统的套接字是一个通用的网络编程接口。系统的套接字是一个通用的网络编程接口。TCP协议就是通协议就是通过套接字来实现连接的

26、建立的,这里将就这个过程具体化并对其内过套接字来实现连接的建立的,这里将就这个过程具体化并对其内部的函数进行必要的说明。部的函数进行必要的说明。(1)套接字地址结构套接字地址结构 在头文件在头文件中定义了以下结构来保持套接字函数调中定义了以下结构来保持套接字函数调用参数的一致性。用参数的一致性。struct sockaddr unsigned short sa_family;/地址类型,格式为地址类型,格式为AF_xxxchar sa_data14;/14字节的协议地字节的协议地址址;11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用 其中的其中的sa_family为套接字的

27、协议簇地址类型,为套接字的协议簇地址类型,TCP/IP的协议对的协议对于于IPv4地址类型为地址类型为AF_INET。sa_data中存储具体的协议地址,不同中存储具体的协议地址,不同的协议簇有不同的地址格式。但一般编程中并不直接针对此数据结构的协议簇有不同的地址格式。但一般编程中并不直接针对此数据结构操作,而是使用另一个与操作,而是使用另一个与sockaddr等价的数据结构等价的数据结构sockaddr_in(在在netinet/in.h中定义中定义):struct sockaddr_in unsigned short int sin_len;/*IPv4地址长度地址长度*/short in

28、t sin_family;/*地址类型地址类型*/unsigned short int sin_port;/*存储端口号存储端口号*/struct in_addr sin_addr;/*存储存储IP地址地址*/unsigned char sin_zero8;/*空字节空字节*/;11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用 在编程中大多数是使用在编程中大多数是使用sockaddr_in这个结构来设置获取地址信息。这个结构来设置获取地址信息。sin_family指协议族,在指协议族,在TCP套接字编程中只能是套接字编程中只能是AF_INET;sin_port存储端口号存储

29、端口号(使用网络字节顺序使用网络字节顺序),数据类型是一个,数据类型是一个16位的无符号整数位的无符号整数类型;类型;sin_addr存储存储IP地址,地址,IP地址使用地址使用in_addr这个数据结构:这个数据结构:struct in_addr unsigned long s_addr;s_addr按照网络字节顺序存储按照网络字节顺序存储IP地址;地址;sin_zero是为了让是为了让sockaddr与与sockaddr_in两个数据结构保持大小相同而保留的空字节。两个数据结构保持大小相同而保留的空字节。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用设置地址信息实例设

30、置地址信息实例(IPv4)struct sockaddr_in mysock;/*设置设置sockaddr_in的结构体变量的结构体变量 mysock*/mysock.sin_family=AF_INET;/*TCP地址结构地址结构*/mysock.sin_port=htons(3490);/*short,NBO*/mysock.sin_addr.s_addr=inet_addr(“166.111.160.10”);/*设置地址为设置地址为166.111.160.10*/bzero(&(mysock.sin_zero),8);/*设置设置sin_zero为为8位保留字节位保留字节*/注意:注意

31、:如果如果mysock.sin_addr.s_addr=INADDR_ANY,则不指定则不指定IP地址地址(用于用于Server程序程序)。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用(2)TCP客户客户-服务器通信模型服务器通信模型TCP客户客户-服务器通信过程服务器通信过程如图如图11-4所示。所示。图 11-4 TCP客户-服务器通信过程11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用(3)socket主要函数主要函数 强制类型转换函数的调用强制类型转换函数的调用:将指向于特定协议的套接口地址结构的指针类型将指向于特定协议的套接口地址结构的指针

32、类型-指向通用套接指向通用套接口地址结构的指针。口地址结构的指针。int connect(int,struct sockaddr*,socklen_t)struct sockaddr-in servaddr;connect(sockfd,(sturct sockaddr*)&servaddr,sizeof(servaddr);11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用 主机字节序和网络字节序的转换函数:主机字节序和网络字节序的转换函数:#include unit16_t htons(uint16_t host16bitvalue);unit32_t htons(uin

33、t32_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.1 TCP/IP11.2.1 TCP/IP网络应用网络应用 int socket(int domain,int type,int protocol)domain:说明我们网络程序所在的主机采用的通讯协族说明我们网络程序所在的主机采用的通讯协族(AF_UNIX和和AF_INET等等)。type:

34、我们网络程序所采用的通讯协议我们网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM等等)SOCK_STREAM表明我们用表明我们用的是的是TCP协议,这样会提供按顺序的,可靠,双向,面向连接的比特协议,这样会提供按顺序的,可靠,双向,面向连接的比特流。流。SOCK_DGRAM 表明我们用的是表明我们用的是UDP协议,这样只会提供定长协议,这样只会提供定长的,不可靠,无连接的通信。的,不可靠,无连接的通信。protocol:由于我们指定了由于我们指定了type,所以这个地方我们一般只要用所以这个地方我们一般只要用0来代替来代替就可以了。就可以了。socket为网络通讯做基本的

35、准备。成功时返回文件描述符,失败时返为网络通讯做基本的准备。成功时返回文件描述符,失败时返回回-1,看,看errno可知道出错的详细情况。可知道出错的详细情况。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用 int bind(int sockfd,struct sockaddr*my_addr,int addrlen)sockfd:是由是由socket调用返回的文件描述符。调用返回的文件描述符。addrlen:是是sockaddr结构的长度。结构的长度。my_addr:是一个指向是一个指向sockaddr的指针。的指针。int listen(int sockfd,int

36、backlog)sockfd:是是bind后的文件描述符。后的文件描述符。backlog:设置请求排队的最大长度。当有多个客户端程序和服务端相设置请求排队的最大长度。当有多个客户端程序和服务端相连时连时,使用这个表示可以介入的排队长度。使用这个表示可以介入的排队长度。listen函数将函数将bind的文件描的文件描述符变为监听套接字,返回的情况和述符变为监听套接字,返回的情况和bind一样。一样。int accept(int sockfd,struct sockaddr*addr,int*addrlen)sockfd:是是listen后的文件描述符。后的文件描述符。addr,addrlen是用

37、来给客户端的程序填写的是用来给客户端的程序填写的,服务器端只要传递指针服务器端只要传递指针就可以了。就可以了。bind,listen和和accept是服务器端用的函数,是服务器端用的函数,accept调用时调用时,服务器端的程序会一直阻塞到有一个客户程序发出了连接。服务器端的程序会一直阻塞到有一个客户程序发出了连接。accept成功时返回最后的服务器端的文件描述符成功时返回最后的服务器端的文件描述符,这个时候服务器端可这个时候服务器端可以向该描述符写信息了,失败时返回以向该描述符写信息了,失败时返回-1。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用 int connec

38、t(int sockfd,struct sockaddr*serv_addr,int addrlen)sockfd是是socket返回的文件描述符。返回的文件描述符。serv_addr:储存了服务器端的连接信息,其中储存了服务器端的连接信息,其中sin_add是服务端的地是服务端的地址。址。addrlen:serv_addr的长度的长度。connect函数是客户端用来同服务端连接的。成功时返回函数是客户端用来同服务端连接的。成功时返回0,sockfd是是同服务端通讯的文件描述符,失败时返回同服务端通讯的文件描述符,失败时返回-1。ssize_t write(int fd,const void*

39、buf,size_t nbytes)write函数将函数将buf中的中的nbytes字节内容写入文件描述符字节内容写入文件描述符fd。成功时返回成功时返回写的字节数,写的字节数,失败时返回失败时返回-1。并设置。并设置errno变量,在网络程序中,当变量,在网络程序中,当我们向套接字文件描述符写时有两种可能。我们向套接字文件描述符写时有两种可能。write的返回值大于的返回值大于0,表示写了部分或者是全部的数据。表示写了部分或者是全部的数据。返回的值小于返回的值小于0,此时出现了错误此时出现了错误.我们要根据错误类型来处理。我们要根据错误类型来处理。11.2.1 TCP/IP11.2.1 TC

40、P/IP网络应用网络应用 ssize_t read(int fd,void*buf,size_t nbyte)read函数是从函数是从fd中读取内容。当读成功时,中读取内容。当读成功时,read返回实际所读的字节返回实际所读的字节数,如果返回的值是数,如果返回的值是0 表示已经读到文件的结束了,小于表示已经读到文件的结束了,小于0表示出现了表示出现了错误。错误。recv和和send函数提供了和函数提供了和read和和write差不多的功能,不过提供了第四差不多的功能,不过提供了第四个参数来控制读写操作。个参数来控制读写操作。int recv(int sockfd,void*buf,int le

41、n,int flags)int send(int sockfd,void*buf,int len,int flags)前面的三个参数和前面的三个参数和read,write一样一样,第四个参数可以是第四个参数可以是0或者是以下的组或者是以下的组合合:MSG_DONTROUTE:不查找路由表不查找路由表 MSG_OOB:接受或者发送带外数据接受或者发送带外数据 MSG_PEEK:查看数据查看数据,并不从系统缓冲区移走数据并不从系统缓冲区移走数据 MSG_WAITALL:等待所有数据等待所有数据11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用3.3.举例举例 我们将使用我们将使用

42、TCP协议提供的服务,组成一个简单的重复型的网络协议提供的服务,组成一个简单的重复型的网络时间服务器。在一台时间服务器。在一台EV44B0II系统中启动服务程序并指定服务端口。系统中启动服务程序并指定服务端口。在另外一台在另外一台EV44B0II系统中启动客户端程序并指定服务器系统中启动客户端程序并指定服务器IP地址和地址和服务端口。服务器将接收该服务,并返回服务器本地的系统时间。服务端口。服务器将接收该服务,并返回服务器本地的系统时间。本程序使用本程序使用TCP协议,可以工作在服务器或客户端状态。使用的默认协议,可以工作在服务器或客户端状态。使用的默认端口号为端口号为9988。程序流程图程序

43、流程图如图如图11-5所示所示:图11-5 流程图11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用附程序清单:附程序清单:/*TCP/IP nettime service*/#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include extern char*optarg;/*getopt*/#define COM_SERVER 1#

44、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;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;whi

45、le(c=getopt(argc,argv,sc:o:)!=-1)switch(c)case c:/*get server ip address*/memcpy(server_ip,optarg,(strlen(optarg)+1);ComStatus=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

46、(1);/*setup address and port*/sn.sin_port=_constant_htons(ComPort);sn.sin_addr.s_addr=0;if(argc 2)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)/*serv

47、er process*/if(fd_listen=socket(AF_INET,SOCK_STREAM,0)0)fprintf(stderr,ncan not 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);c

48、lose(fd_listen);exit(1);sa_len=sizeof(sn);printf(nget service request 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,packe

49、t_len)0)perror(server write);close(fd_listen);close(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(con

50、nect(fd_client,(struct sockaddr*)&sn,sa_len)0)perror(client connect);close(fd_client);exit(1);if(counter=read(fd_client,buffer,packet_len)boa c /tmp/&”命令。命令。11.2.2 web11.2.2 web服务器应用服务器应用3.3.程序说明程序说明程序说明如下程序说明如下:/*rc*/*本脚本将为本脚本将为boa建立运行的根目录,和其他运行环境建立运行的根目录,和其他运行环境*/hostname Samsung/bin/expand/etc/ra

51、mfs.img/dev/ram0mount-t proc proc/procmount-t ext2/dev/ram0/varmkdir/var/configmkdir/var/tmpmkdir/var/logmkdir/var/runmkdir/var/lockcat/etc/motdifconfig lo 127.0.0.1route add-net 127.0.0.0 netmask 255.255.255.0 lodhcpcd-p-a eth0&cd/tmpmkdir cgi_bincd/etccp index.html/tmpcp boa.conf/tmpcp mime.types/

52、tmpcp cgi_bin/*/tmp/cgi_binchmod 775/tmp/cgi_bin/*#mount-t jffs/dev/mtdblock1/var#ifconfig eth0 hw ether 00:11:22:33:44:55#ifconfig eth0 172.20.3.44#login /*cgi.c*/*本程序接收本程序接收boa传递的参数,控制数码管显示指定的数字,并返回传递的参数,控制数码管显示指定的数字,并返回网页网页*/#include#include#include cgivars.h#include htmllib.h#include template.hi

53、nt main()char*postvars=NULL;/*POST request data repository*/char*getvars=NULL;/*GET request data repository*/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=getP

54、OSTvars();else if(form_method=GET)/*In this exp,we use GET in index.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 i

55、nt*iopdata =(volatile unsigned int*)(0 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,g

56、etvars,postvars);/*display*/fflush(stdout);exit(0);11.2.2 web11.2.2 web服务器应用服务器应用4.4.运行过程运行过程(1)对程序修改后,重新编译内核并焼写烧写到对程序修改后,重新编译内核并焼写烧写到EV44B0II评估板。评估板。(2)启动启动EV44B0II评估板。确认评估板。确认EV44B0II的的IP地址。地址。(3)运行运行boa-c/tmp/&,启动,启动web服务器。服务器。(4)打开打开PC上的浏览器上的浏览器(如如IE6或或Netscape)输入输入EV44B0II的的IP作为网作为网 址,例如址,例如htt

57、p:/192.168.1.125/,这时就可以看到要测试的网页内,这时就可以看到要测试的网页内 容。容。网页内容是网页内容是/tmp/index.html文件。文件。(5)在在lamp number 文本框中,写入文本框中,写入“1”,然后点击,然后点击“display”。(6)EV44B0上的数码管显示对应数字。上的数码管显示对应数字。(7)在浏览器上显示在浏览器上显示“Demo Web Page”。11.3 11.3 音频设备应用音频设备应用 S3C44B0II包含一个包含一个IIS总线接口,它可以作为连接总线接口,它可以作为连接8位或位或16位位立体声编解码集成电路的接口,立体声编解码集

58、成电路的接口,IIS总线接口提供内置总线接口提供内置FIFO的的DMA传传送模式,可以同时接收和发送,或单独接收和发送。送模式,可以同时接收和发送,或单独接收和发送。nIIS总线接口可以发送和接收采样量化过的声音数据,它为外部的总线接口可以发送和接收采样量化过的声音数据,它为外部的CODEC芯片提供工作主时钟,数据收发时钟和左右声道选择信号。芯片提供工作主时钟,数据收发时钟和左右声道选择信号。具体的采样量化工作留给具体的采样量化工作留给CODEC芯片完成。在接收方向,芯片完成。在接收方向,CODEC将模拟声音采样量化;在发送方向,将模拟声音采样量化;在发送方向,CODEC将声音数据还原为模拟将

59、声音数据还原为模拟声音。声音。nUDA1341和和IIS的驱动程序,位于的驱动程序,位于/Linux/drivers/char目录下。它们是目录下。它们是ev44b0_sound.c、ev44b0_sound.h、l3-ev44b0.c。n音频设备文件的设备名为音频设备文件的设备名为/dev/audio。11.3.1 11.3.1 常用音频文件格式常用音频文件格式1 1.WAV文件文件(1)概述概述WAV是是Microsoft Windows本身提供的音频格式,由于本身提供的音频格式,由于Windows本身本身的影响力,这个格式已经成为了事实上的通用音频格式。的影响力,这个格式已经成为了事实上

60、的通用音频格式。(2)WAV文件的结构文件的结构n 在在Windows环境下,大部分的多媒体文件都遵循着一种结构来存放信环境下,大部分的多媒体文件都遵循着一种结构来存放信息,这种结构称为息,这种结构称为“资源互换文件格式资源互换文件格式”(Resources lnterchange File Format),简称,简称RIFF。n WAV为为WAVEFORM(波形波形)的缩写。声音文件的结构的缩写。声音文件的结构如图如图116所示所示,“RIFF”的格式辨别码为的格式辨别码为“WAVE”。n 整个文件由两个整个文件由两个chunk所组成:辨别码所组成:辨别码fmt(注意,最后一个是空白字注意,

61、最后一个是空白字符符!)及及data。在。在fmt的的chunk下包含了一个下包含了一个PCMWAVEFORMAT数数据结构,其定义如下:据结构,其定义如下:图图 11-6 WAVE文件结构文件结构11.3.1 11.3.1 常用音频文件格式常用音频文件格式 整个文件由两个整个文件由两个chunk所组成:辨别码所组成:辨别码“fmt”(注意,最后一个是注意,最后一个是空白字符空白字符!)及及“data”。在。在“fmt”的的chunk下包含了一个下包含了一个PCMWAVEFORMAT数据结构,其定义如下:数据结构,其定义如下:typedef struct pcmwaveformat-tag W

62、AVEFORMAT wf;WORD wBitsPerSample;PCMWAVEFORMAT;typedef struct waveformat-tag WORD wFormatTag;WORD nChannels;DWORD nSamplesPerSec;DWORD nAvgBytesperSec;WORD nBlockAlign;WAVEFORMAT;11.3.1 11.3.1 常用音频文件格式常用音频文件格式其意义分别为:其意义分别为:wFormatTag:记录着此声音的格式代号,例如记录着此声音的格式代号,例如WAVE_FORMAT_PCM,WAVE_F0RAM_ADPCM等等。等等。

63、nChannels:记录声音的频道数。:记录声音的频道数。nSamp1esPerSec:记录每秒取样数。:记录每秒取样数。nAvgBytesPerSec:记录每秒的数据量。:记录每秒的数据量。nBlockA1ign:记录区块的对齐单位。:记录区块的对齐单位。wBitsPerSample:记录每个取样所需的位元数。:记录每个取样所需的位元数。11.3.1 11.3.1 常用音频文件格式常用音频文件格式2.2.mp3格式格式 (1)概述概述n mp3是是Fraunhofer-IIS研究所的研究成果。研究所的研究成果。mp3是第一个实用的有损音是第一个实用的有损音频压缩编码。频压缩编码。n 衡量衡量

64、mp3文件的压缩比例通常使用比特率来表示。文件的压缩比例通常使用比特率来表示。n 由于由于mp3是世界上第一个有损压缩的编码方案,所以可以说所有的播是世界上第一个有损压缩的编码方案,所以可以说所有的播放软件都支持它,否则就根本没有生命力。在制作方面,也曾经产生放软件都支持它,否则就根本没有生命力。在制作方面,也曾经产生了许多第三方的编码工具。了许多第三方的编码工具。(2)MP3的文件结构的文件结构n MPEG音频文件没有文件头而是由很多独立的数据帧构成,每个帧都音频文件没有文件头而是由很多独立的数据帧构成,每个帧都是独立的可以被单独播放,每个帧都有自己的帧头和音频信息。是独立的可以被单独播放,

65、每个帧都有自己的帧头和音频信息。n 帧头是有帧头是有32bits(4bytes)构成,起始的构成,起始的11bit是帧同步信息。帧可以有是帧同步信息。帧可以有CRC校验信息,也可以没有。一般来说都没有校验信息,也可以没有。一般来说都没有CRC校验。校验。CRC校验信校验信息为息为16bit长,它紧跟在帧头的后面,在校验信息后就是经过压缩的音长,它紧跟在帧头的后面,在校验信息后就是经过压缩的音乐文件数据了。乐文件数据了。n MP3文件的比特率表文件的比特率表如表如表111所示所示。表表 11-1 MP3文件的比特率11.3.1 11.3.1 常用音频文件格式常用音频文件格式 MP3文件的采样率表

66、文件的采样率表如表如表112所示所示。表表 11-2 MP3文件的采样率表11.3.1 11.3.1 常用音频文件格式常用音频文件格式 MP3文件的播放模式表文件的播放模式表如表如表113所示所示。表表 11-3 MP3文件的采样率表11.3.2 11.3.2 播放播放WAVWAV文件举例文件举例1.1.程序程序 该程序由该程序由sound.c和和wave.h组成,组成,sound.c中包含了中包含了*.wave文件的处文件的处理,和理,和sound驱动的使用;驱动的使用;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_dev,fd_file;in

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!