应用程序开发课件

上传人:pu****.1 文档编号:569270899 上传时间:2024-07-28 格式:PPT 页数:98 大小:2.93MB
返回 下载 相关 举报
应用程序开发课件_第1页
第1页 / 共98页
应用程序开发课件_第2页
第2页 / 共98页
应用程序开发课件_第3页
第3页 / 共98页
应用程序开发课件_第4页
第4页 / 共98页
应用程序开发课件_第5页
第5页 / 共98页
点击查看更多>>
资源描述

《应用程序开发课件》由会员分享,可在线阅读,更多相关《应用程序开发课件(98页珍藏版)》请在金锄头文库上搜索。

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 TCP

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

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

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

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

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

7、shortc_lflag; /localmodeflagsunsignedcharc_line;/linedisciplineunsignedcharc_ccNCC;/controlcharacters;11.1.1 11.1.1 串行口主要函数介绍串行口主要函数介绍n通过对通过对c_cflag的赋值,设置波特率,字符大小,使能本地连接,使能的赋值,设置波特率,字符大小,使能本地连接,使能串行口驱动读取输入数据。串行口驱动读取输入数据。n通过设置通过设置c_iflag,控制端口对字符的输入处理过程,控制端口对字符的输入处理过程,IGNPAR符号常符号常量表示忽略奇偶性错误的字节,不对输入数据进

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

9、校验位和停止位的设置:无效验无效验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

10、.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)发送数据发送数据charbuffer1024;intLength1024;11.1.1 1

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

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

14、e#include#includeintspfd;intmain()charfname16,hd16,*rbuf;intretv,i,ncount=0;structtermiosoldtio;intrealdata=0;spfd=open(/dev/ttyS1,O_RDWR|O_NOCTTY);if(spfd0)return-1;tcgetattr(spfd,&oldtio);/保存串口的当前设置保存串口的当前设置cfmakeraw(&oldtio);cfsetispeed(&oldtio,B19200);cfsetospeed(&oldtio,B19200);tcsetattr(spfd,T

15、CSANOW,&oldtio);/选择新设置,选择新设置,TCSANOW表示设表示设置立即生效置立即生效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%dn,retv);if(retv=-1)perror(read);for(i=0;incount;i+)realdata+=(hdi-48)*

16、pow(10,ncount-i-1);printf(completereceivingthedata%dn,realdata);close(spfd);return0;11.1.2 11.1.2 串口举例串口举例发送程序发送程序writetest.c的源码如下:的源码如下:#include#include#include#include#include#include#include#includeintspfd;intmain(intargc,char*argv)charfname16,*sbuf;intsfd,retv,i;structtermiosoldtio;spfd=open(/de

17、v/ttyS0,O_RDWR|O_NOCTTY);perror(open/dev/ttyS0);if(spfd0)return-1;printf(readyforsendingdata.n);tcgetattr(spfd,&oldtio);cfmakeraw(&oldtio);cfsetispeed(&oldtio,B19200);cfsetospeed(&oldtio,B19200);tcsetattr(spfd,TCSANOW,&oldtio);fname0=1;fname1=2;fname2=3;fname3=0;sbuf=(char*)malloc(4);strncpy(sbuf,fn

18、ame,4);retv=write(spfd,sbuf,4);if(retv=-1)perror(write);printf(thenumberofcharsentis%dn,retv);close(spfd);return0;11.1.2 11.1.2 串口举例串口举例本例程实现:本例程实现:在发送端发送数字在发送端发送数字123123,在接收端接收,在接收端接收并显示接收到的数据。并显示接收到的数据。这里请同学们这里请同学们注意注意的是:的是:发送方按字符发送数据,接收方将接收的字发送方按字符发送数据,接收方将接收的字符相应的符相应的asciiascii值与字符值与字符0 0所对应的所对应

19、的asciiascii值相减,值相减,最终得到实际的十进制数值。最终得到实际的十进制数值。11.2 网络应用11.2.1 TCP/IP网络应用以太网技术作为当前局域网的主流技术,可以提供从以太网技术作为当前局域网的主流技术,可以提供从10Mbit/s,100Mbit/s到到1000Mbit/s的物理带宽,以及比较好的抗干扰性、比较大的物理带宽,以及比较好的抗干扰性、比较大的网络半径和比较低系统维护费用;同时在不同速率以太网之间保持的网络半径和比较低系统维护费用;同时在不同速率以太网之间保持比较好的前向兼容性,所以在系统升级时很方便。比较好的前向兼容性,所以在系统升级时很方便。图11-1 以太网

20、电路结构图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)数据的封装与分用数据的封装与分用数据的封装数据的封装用户数据从应用层逐级传送到链路层,每经过一层都要被该层的协议用户数据从应用层逐级传送到链路层,每经过一层都要被该层的协议进行一定的封装、标识和改造,就是给这个数据增加一些头部信息进行一定的封装、标识和改造,就是给这个数据增加一些头部信息(或尾部信息或尾部信息)。数据封装过程数据封装过程如图如图11-3所示。所示。图 11-3 数据的封装过程11.2.1 TCP/IP11.2.1 TCP/IP网络应用

23、网络应用数据的分用数据的分用(解包解包)在接收端接收这些数据的时候,经过拆分的数据要重新组合,并且去在接收端接收这些数据的时候,经过拆分的数据要重新组合,并且去掉各层加上的头部信息,把数据还原。掉各层加上的头部信息,把数据还原。(3)客户客户服务器模型服务器模型目前大多数网络应用程序在编写时都采用客户目前大多数网络应用程序在编写时都采用客户服务器模型,假设服务器模型,假设端是客户,另一端是服务器,让服务器提供给客户一定的服务内容。端是客户,另一端是服务器,让服务器提供给客户一定的服务内容。并发型交互并发型交互在并发型交互模式下,程度的主要运作步骤如下:在并发型交互模式下,程度的主要运作步骤如下

24、:等待一个客户请求的到来;等待一个客户请求的到来;生成一个新的进程或者任务来处理这个客户请求,同时这里还可以生成一个新的进程或者任务来处理这个客户请求,同时这里还可以接收其他客户的请求。处理结束后,终止这个进程。接收其他客户的请求。处理结束后,终止这个进程。反馈客户端;反馈客户端;等待新的客户请求的到来并进行下一次服务,如此循环运作。等待新的客户请求的到来并进行下一次服务,如此循环运作。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用重复型交互重复型交互重复型交互摸式下,程序的的主要运作步骤如下:重复型交互摸式下,程序的的主要运作步骤如下:等待一个客户请求的到来;等待一个客

25、户请求的到来;处理客户的请求,对客户进行服务;处理客户的请求,对客户进行服务;给客户反馈信息,服务结束;给客户反馈信息,服务结束;等待下一个请求到来,如此循环。等待下一个请求到来,如此循环。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用2. 2. TCP套接字套接字Linux系统的套接字是一个通用的网络编程接口。系统的套接字是一个通用的网络编程接口。TCP协议就是通协议就是通过套接字来实现连接的建立的,这里将就这个过程具体化并对其内过套接字来实现连接的建立的,这里将就这个过程具体化并对其内部的函数进行必要的说明。部的函数进行必要的说明。(1)套接字地址结构套接字地址结构在

26、头文件在头文件中定义了以下结构来保持套接字函数调中定义了以下结构来保持套接字函数调用参数的一致性。用参数的一致性。structsockaddrunsignedshortsa_family;/地址类型,格式为地址类型,格式为AF_xxxcharsa_data14;/14字节的协议地字节的协议地址址 ;11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用其中的其中的sa_family为套接字的协议簇地址类型,为套接字的协议簇地址类型,TCP/IP的协议对于的协议对于IPv4地址类型为地址类型为AF_INET。sa_data中存储具体的协议地址,不同的中存储具体的协议地址,不同的协议

27、簇有不同的地址格式。但一般编程中并不直接针对此数据结构操协议簇有不同的地址格式。但一般编程中并不直接针对此数据结构操作,而是使用另一个与作,而是使用另一个与sockaddr等价的数据结构等价的数据结构sockaddr_in(在在netinet/in.h中定义中定义):structsockaddr_inunsignedshortintsin_len;/*IPv4地址长度地址长度*/shortintsin_family;/*地址类型地址类型*/unsignedshortintsin_port;/*存储端口号存储端口号*/structin_addrsin_addr;/*存储存储IP地址地址*/uns

28、ignedcharsin_zero8;/*空字节空字节*/;11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用在编程中大多数是使用在编程中大多数是使用sockaddr_in这个结构来设置获取地址信息。这个结构来设置获取地址信息。sin_family指协议族,在指协议族,在TCP套接字编程中只能是套接字编程中只能是AF_INET;sin_port存储端口号存储端口号(使用网络字节顺序使用网络字节顺序),数据类型是一个,数据类型是一个16位的无符号整数位的无符号整数类型;类型;sin_addr存储存储IP地址,地址,IP地址使用地址使用in_addr这个数据结构:这个数据结构:s

29、tructin_addrunsignedlongs_addr;s_addr按照网络字节顺序存储按照网络字节顺序存储IP地址;地址;sin_zero是为了让是为了让sockaddr与与sockaddr_in两个数据结构保持大小相同而保留的空字节。两个数据结构保持大小相同而保留的空字节。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用设置地址信息实例设置地址信息实例(IPv4)structsockaddr_inmysock;/*设置设置sockaddr_in的结构体变量的结构体变量mysock*/mysock.sin_family=AF_INET;/*TCP地址结构地址结构*/

30、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位保留字节位保留字节*/注意:注意: 如果如果mysock.sin_addr.s_addr=INADDR_ANY,则不指定,则不指定IP地址地址( (用于用于Server程序程序) )。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用(2)TCP客户

31、客户-服务器通信模型服务器通信模型TCP客户客户-服务器通信过程服务器通信过程如图如图11-4所示。所示。图 11-4 TCP客户-服务器通信过程11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用(3)socket主要函数主要函数强制类型转换函数的调用强制类型转换函数的调用:将指向于特定协议的套接口地址结构的指针类型将指向于特定协议的套接口地址结构的指针类型-指向通用套接指向通用套接口地址结构的指针。口地址结构的指针。intconnect(int,structsockaddr*,socklen_t)structsockaddr-inservaddr;connect(sockf

32、d,(sturctsockaddr*)&servaddr,sizeof(servaddr);11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用主机字节序和网络字节序的转换函数:主机字节序和网络字节序的转换函数:#includeunit16_thtons(uint16_thost16bitvalue);unit32_thtons(uint32_thost32bitvalue);unit16_tntohs(uint16_tnet16bitvalue);unit32_tntohs(uint32_tnet32bitvalue);h:hostn:networks:short(16bit

33、s)l:long(32bits)11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用intsocket(intdomain,inttype,intprotocol)domain:说明我们网络程序所在的主机采用的通讯协族说明我们网络程序所在的主机采用的通讯协族(AF_UNIX和和AF_INET等等)。type:我们网络程序所采用的通讯协议我们网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM等等)SOCK_STREAM表明我们用的是表明我们用的是TCP协议,这样会提供按顺序的,可协议,这样会提供按顺序的,可靠,双向,面向连接的比特流。靠,双向,面向连接的比特流

34、。SOCK_DGRAM表明我们用的是表明我们用的是UDP协议,这样只会提供定长的,不可靠,无连接的通信。协议,这样只会提供定长的,不可靠,无连接的通信。protocol:由于我们指定了由于我们指定了type,所以这个地方我们一般只要用所以这个地方我们一般只要用0来代替来代替就可以了。就可以了。socket为网络通讯做基本的准备。成功时返回文件描述符,失败时返为网络通讯做基本的准备。成功时返回文件描述符,失败时返回回-1,看,看errno可知道出错的详细情况。可知道出错的详细情况。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用intbind(intsockfd,struct

35、sockaddr*my_addr,intaddrlen)sockfd:是由是由socket调用返回的文件描述符。调用返回的文件描述符。addrlen:是是sockaddr结构的长度。结构的长度。my_addr:是一个指向是一个指向sockaddr的指针。的指针。intlisten(intsockfd,intbacklog)sockfd:是是bind后的文件描述符。后的文件描述符。backlog:设置请求排队的最大长度。当有多个客户端程序和服务端相设置请求排队的最大长度。当有多个客户端程序和服务端相连时连时,使用这个表示可以介入的排队长度。使用这个表示可以介入的排队长度。listen函数将函数将

36、bind的文件的文件描述符变为监听套接字,返回的情况和描述符变为监听套接字,返回的情况和bind一样。一样。intaccept(intsockfd,structsockaddr*addr,int*addrlen)sockfd:是是listen后的文件描述符。后的文件描述符。addr,addrlen是用来给客户端的程序填写的是用来给客户端的程序填写的,服务器端只要传递指针服务器端只要传递指针就可以了。就可以了。bind,listen和和accept是服务器端用的函数,是服务器端用的函数,accept调用时调用时,服务器端的程序会一直阻塞到有一个客户程序发出了连接。服务器端的程序会一直阻塞到有一个

37、客户程序发出了连接。accept成功时返回最后的服务器端的文件描述符成功时返回最后的服务器端的文件描述符,这个时候服务器端可这个时候服务器端可以向该描述符写信息了,失败时返回以向该描述符写信息了,失败时返回-1。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen)sockfd是是socket返回的文件描述符。返回的文件描述符。serv_addr:储存了服务器端的连接信息,其中储存了服务器端的连接信息,其中sin_add是服务端的地址。是服务端的地址。addrlen:

38、serv_addr的长度的长度。connect函数是客户端用来同服务端连接的。成功时返回函数是客户端用来同服务端连接的。成功时返回0,sockfd是是同服务端通讯的文件描述符,失败时返回同服务端通讯的文件描述符,失败时返回-1。ssize_twrite(intfd,constvoid*buf,size_tnbytes)write函数将函数将buf中的中的nbytes字节内容写入文件描述符字节内容写入文件描述符fd。成功时返回成功时返回写的字节数,写的字节数,失败时返回失败时返回-1。并设置。并设置errno变量,在网络程序中,当变量,在网络程序中,当我们向套接字文件描述符写时有两种可能。我们向

39、套接字文件描述符写时有两种可能。write的返回值大于的返回值大于0,表示写了部分或者是全部的数据。表示写了部分或者是全部的数据。返回的值小于返回的值小于0,此时出现了错误此时出现了错误.我们要根据错误类型来处理。我们要根据错误类型来处理。11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用ssize_tread(intfd,void*buf,size_tnbyte)read函数是从函数是从fd中读取内容。当读成功时,中读取内容。当读成功时,read返回实际所读的字节返回实际所读的字节数,如果返回的值是数,如果返回的值是0表示已经读到文件的结束了,小于表示已经读到文件的结束了,

40、小于0表示出现了表示出现了错误。错误。recv和和send函数提供了和函数提供了和read和和write差不多的功能,不过提供了第四差不多的功能,不过提供了第四个参数来控制读写操作。个参数来控制读写操作。intrecv(intsockfd,void*buf,intlen,intflags)intsend(intsockfd,void*buf,intlen,intflags)前面的三个参数和前面的三个参数和read,write一样一样,第四个参数可以是第四个参数可以是0或者是以下的或者是以下的组合组合:MSG_DONTROUTE:不查找路由表不查找路由表MSG_OOB:接受或者发送带外数据接受或

41、者发送带外数据MSG_PEEK:查看数据查看数据,并不从系统缓冲区移走数据并不从系统缓冲区移走数据MSG_WAITALL:等待所有数据等待所有数据11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用3.3.举例举例我们将使用我们将使用TCP协议提供的服务,组成一个简单的重复型的网络协议提供的服务,组成一个简单的重复型的网络时间服务器。在一台时间服务器。在一台EV44B0II系统中启动服务程序并指定服务端口。系统中启动服务程序并指定服务端口。在另外一台在另外一台EV44B0II系统中启动客户端程序并指定服务器系统中启动客户端程序并指定服务器IP地址和服地址和服务端口。服务器将接收

42、该服务,并返回服务器本地的系统时间。务端口。服务器将接收该服务,并返回服务器本地的系统时间。本程序使用本程序使用TCP协议,可以工作在服务器或客户端状态。使用的默认协议,可以工作在服务器或客户端状态。使用的默认端口号为端口号为9988。程序流程图程序流程图如图如图11-5所示所示:图11-5 流程图11.2.1 TCP/IP11.2.1 TCP/IP网络应用网络应用附程序清单:附程序清单:/*TCP/IPnettimeservice*/#include#include#include#include#include#include#include#include#include#include

43、#include#include#include#include#include#include#include#include#includeexternchar*optarg;/*getopt*/#defineCOM_SERVER1#defineCOM_CLIENT2intComStatus;#definePORT_NUMBER0x1000shortComPort;intmain(intargc,char*argv)intfd_listen,fd_client,fd_service;charserver_ip64;intport;structsockaddr_insn=AF_INET;in

44、tsa_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)casec:/*getserveripaddress*/memcpy(server_ip,optarg,(strlen(optarg)+1);ComStatus=COM_CLIENT;break;cases:/*opendebugflag*/ComStatus=COM_SERVER;break;caseo:C

45、omPort=atoi(optarg);break;default:/*printusage*/fprintf(stderr,Usage:%s-c|-s-pn,argv0);exit(1);/*setupaddressandport*/sn.sin_port=_constant_htons(ComPort);sn.sin_addr.s_addr=0;if(argc2)fprintf(stderr,nargvtoolessn);exit(1);/*allocmemfordatabuffer*/packet_len=256;buffer=malloc(packet_len);if(buffer0)

46、fprintf(stderr,nmallocbuffererrorn);exit(1);if(ComStatus=COM_SERVER)/*serverprocess*/if(fd_listen= socket(AF_INET,SOCK_STREAM,0)0)fprintf(stderr,ncannotopenserversocket,exitn);exit(1);if(bind(fd_listen,(structsockaddr*)&sn,sizeof(sn)0)fprintf(stderr,ncannotbinserver,socket,exitn);close(fd_listen);ex

47、it(1);if(listen(fd_listen,1)0)fprintf(stderr,listenfailed,exit);close(fd_listen);exit(1);sa_len=sizeof(sn);printf(ngetservicerequestfrom%sn,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_service0)perror(

48、acceptfailed);exit(1);elseif(write(fd_service,buffer,packet_len)0)perror(serverwrite);close(fd_listen);close(fd_service);exit(1);printf(ncurrenttime%dsn,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

49、.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)boac/tmp/&”命令。命令。11.2.2 web11.2.2 web服务器应用服务器应用3. 3. 程序说明程序说明程序说明如下程序说明如下:/*rc*/*本脚本将为本脚本将为boa建立运行的根目录,和其他运行环境建

50、立运行的根目录,和其他运行环境*/hostnameSamsung/bin/expand/etc/ramfs.img/dev/ram0mount-tprocproc/procmount-text2/dev/ram0/varmkdir/var/configmkdir/var/tmpmkdir/var/logmkdir/var/runmkdir/var/lockcat/etc/motdifconfiglo127.0.0.1routeadd-net127.0.0.0netmask255.255.255.0lodhcpcd-p-aeth0&cd/tmpmkdircgi_bincd/etccpindex.

51、html/tmpcpboa.conf/tmpcpmime.types/tmpcpcgi_bin/*/tmp/cgi_binchmod775/tmp/cgi_bin/*#mount-tjffs/dev/mtdblock1/var#ifconfigeth0hwether00:11:22:33:44:55#ifconfigeth0172.20.3.44#login/*cgi.c*/*本程序接收本程序接收boa传递的参数,控制数码管显示指定的数字,并返回传递的参数,控制数码管显示指定的数字,并返回网页网页*/#include#include#includecgivars.h#includehtmlli

52、b.h#includetemplate.hintmain()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

53、=getPOSTvars();elseif(form_method=GET)/*Inthisexp,weuseGETinindex.html*/getvars=getGETvars();if(getvars)inti=0;while(getvarsi)if(strcmp(getvarsi,LampNum)=0)/*getwhichnumberison*/*controlreg*/staticvolatileunsignedint*iopmod=(volatileunsignedint*)(0x3ff5000);staticvolatileunsignedint*iopdata=(volatil

54、eunsignedint*)(0x3ff5008);intlampnum=0;lampnum=strtoul(getvarsi+1,NULL,0);/*lightnumber*/iopmod0=0x000000ff;iopdata0=(lampnum);break;i+=2;/*writewebpagetostdout*/htmlHeader(DemoWebPage);htmlBody();template_page(postvars,form_method);htmlFooter();cleanUp(form_method,getvars,postvars);/*display*/fflus

55、h(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作为网作为网址,例如址,例如http:/192.168.1.125/,这时就可以看到要测试的网页内

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

57、模式,可以同时接收和发送,或单独接收和发送。送模式,可以同时接收和发送,或单独接收和发送。IIS总线接口可以发送和接收采样量化过的声音数据,它为外部的总线接口可以发送和接收采样量化过的声音数据,它为外部的CODEC芯片提供工作主时钟,数据收发时钟和左右声道选择信号。芯片提供工作主时钟,数据收发时钟和左右声道选择信号。具体的采样量化工作留给具体的采样量化工作留给CODEC芯片完成。在接收方向,芯片完成。在接收方向,CODEC将将模拟声音采样量化;在发送方向,模拟声音采样量化;在发送方向,CODEC将声音数据还原为模拟声将声音数据还原为模拟声音。音。UDA1341和和IIS的驱动程序,位于的驱动程

58、序,位于/Linux/drivers/char目录下。它们目录下。它们是是ev44b0_sound.c、ev44b0_sound.h、l3-ev44b0.c。音频设备文件的设备名为音频设备文件的设备名为/dev/audio。11.3.1 11.3.1 常用音频文件格式常用音频文件格式1 1. . WAV文件文件(1)概述概述WAV是是MicrosoftWindows本身提供的音频格式,由于本身提供的音频格式,由于Windows本身的本身的影响力,这个格式已经成为了事实上的通用音频格式。影响力,这个格式已经成为了事实上的通用音频格式。(2)WAV文件的结构文件的结构在在Windows环境下,大部

59、分的多媒体文件都遵循着一种结构来存放信环境下,大部分的多媒体文件都遵循着一种结构来存放信息,这种结构称为息,这种结构称为“资源互换文件格式资源互换文件格式”(ResourceslnterchangeFileFormat),简称,简称RIFF。WAV为为WAVEFORM(波形波形)的缩写。声音文件的结构的缩写。声音文件的结构如图如图116所示所示,“RIFF”的格式辨别码为的格式辨别码为“WAVE”。整个文件由两个整个文件由两个chunk所组成:辨别码所组成:辨别码fmt(注意,最后一个是空白字注意,最后一个是空白字符符!)及及data。在。在fmt的的chunk下包含了一个下包含了一个PCMW

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

61、structwaveformat-tagWORDwFormatTag;WORDnChannels;DWORDnSamplesPerSec;DWORDnAvgBytesperSec;WORDnBlockAlign;WAVEFORMAT;11.3.1 11.3.1 常用音频文件格式常用音频文件格式其意义分别为:其意义分别为:wFormatTag:记录着此声音的格式代号,例如记录着此声音的格式代号,例如WAVE_FORMAT_PCM,WAVE_F0RAM_ADPCM等等。等等。nChannels:记录声音的频道数。:记录声音的频道数。nSamp1esPerSec:记录每秒取样数。:记录每秒取样数。n

62、AvgBytesPerSec:记录每秒的数据量。:记录每秒的数据量。nBlockA1ign:记录区块的对齐单位。:记录区块的对齐单位。wBitsPerSample:记录每个取样所需的位元数。:记录每个取样所需的位元数。11.3.1 11.3.1 常用音频文件格式常用音频文件格式2. 2. mp3格式格式(1)概述概述mp3是是Fraunhofer-IIS研究所的研究成果。研究所的研究成果。mp3是第一个实用的有损音是第一个实用的有损音频压缩编码。频压缩编码。衡量衡量mp3文件的压缩比例通常使用比特率来表示。文件的压缩比例通常使用比特率来表示。由于由于mp3是世界上第一个有损压缩的编码方案,所以

63、可以说所有的播是世界上第一个有损压缩的编码方案,所以可以说所有的播放软件都支持它,否则就根本没有生命力。在制作方面,也曾经产生放软件都支持它,否则就根本没有生命力。在制作方面,也曾经产生了许多第三方的编码工具。了许多第三方的编码工具。(2)MP3的文件结构的文件结构MPEG音频文件没有文件头而是由很多独立的数据帧构成,每个帧都音频文件没有文件头而是由很多独立的数据帧构成,每个帧都是独立的可以被单独播放,每个帧都有自己的帧头和音频信息。是独立的可以被单独播放,每个帧都有自己的帧头和音频信息。帧头是有帧头是有32bits(4bytes)构成,起始的构成,起始的11bit是帧同步信息。帧可以有是帧同

64、步信息。帧可以有CRC校验信息,也可以没有。一般来说都没有校验信息,也可以没有。一般来说都没有CRC校验。校验。CRC校验信校验信息为息为16bit长,它紧跟在帧头的后面,在校验信息后就是经过压缩的音长,它紧跟在帧头的后面,在校验信息后就是经过压缩的音乐文件数据了。乐文件数据了。MP3文件的比特率表文件的比特率表如表如表111所示所示。表表 11-1 MP3文件的比特率11.3.1 11.3.1 常用音频文件格式常用音频文件格式MP3文件的采样率表文件的采样率表如表如表112所示所示。表表 11-2 MP3文件的采样率表11.3.1 11.3.1 常用音频文件格式常用音频文件格式MP3文件的播

65、放模式表文件的播放模式表如表如表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#includewave.h#defineWAVEFILE/bin/tes

66、t.wav#defineAUDIOBUFLEN4096/*4Kbytesbuffer*/staticunsignedintbufferAUDIOBUFLEN/4;intmain(void)intfd_dev,fd_file;intresult,len,i;structwave_s*wave_head;structaudio_mixmix;char*buf=(char*)buffer;charctl_buf100;fprintf(stderr,nttWelcometoMICETEKWorldnNowdoingsoundtest.nn);fprintf(stderr,Openaudiodevice

67、:/dev/audion);if(-1=(fd_dev=open(/dev/audio,O_WRONLY)fprintf(stderr,Failedtoopenaudiodevicen);return0;fprintf(stderr,Openwavefile:%sn,WAVEFILE);if(-1=(fd_file=open(WAVEFILE,O_RDONLY)fprintf(stderr,Failedtoopen/bin/test.wavefilen);return0;result=read(fd_file,buf,sizeof(structwave_s);if(resultformat0!

68、=R)|(wave_head-format1!=I)|(wave_head-format2!=F)|(wave_head-format3!=F)fprintf(stderr,Fileformat(1)error.n);return0;printf(Filelength=%dn,wave_head-file_length);wave_head-format27=0;if(strcmp(wave_head-format2,WAVEfmt)!=0)fprintf(stderr,Fileformat(2)error.n);return0;printf(Channels=%dn,wave_head-nC

69、hannels);printf(IOctrlChannelsn);sprintf(ctl_buf,%d,wave_head-nChannels);ioctl(fd_dev,SNDCTL_DSP_CHANNELS,ctl_buf);printf(SamplesPerSec=%dn,wave_head-nSamplesPerSec);printf(IOctrlSamplesPerSecn);sprintf(ctl_buf,%d,wave_head-nSamplesPerSec);ioctl(fd_dev,SNDCTL_DSP_SPEED,ctl_buf);printf(AvgBytesPerSec

70、=%dn,wave_head-nAvgBytesPerSec);printf(BlockAlign=%dn,wave_head-nBlockAlign);printf(BitsPerSample=%dn,wave_head-wBitsPerSample);if(wave_head-format30!=d)|(wave_head-format31!=a)|(wave_head-format32!=t)|(wave_head-format33!=a)fprintf(stderr,Fileformat(3)isUnknown.n);elsefprintf(stderr,Fileformat(3)is

71、data.n);printf(TotalDataBytes=%dn,wave_head-nDataBytes);len=wave_head-nDataBytes;/*realaudiolength*/while(len)unsignedintlength,ret;if(lenAUDIOBUFLEN)length=AUDIOBUFLEN;elselength=len;result=read(fd_file,buf,length);if(result0)printf(ReadFileerror.n);return0;ret=wriate(fd_dev,buf,result);if(ret0)pri

72、ntf(WriteAudioerror.n);return0;len-=result;close(fd_file);printf(CloseWaveFile:%sn,WAVEFILE);close(fd_dev);printf(ClosedeviceFile:/dev/audion);/*Recordtest*/fprintf(stderr,OpenaudiodeviceforRecordn);if(-1=(fd_dev=open(/dev/audio,O_RDONLY)fprintf(stderr,Failedtoopenaudiodevicen);return0;buf=malloc(60

73、0000);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);

74、if(-1=(fd_dev=open(/dev/audio,O_WRONLY)fprintf(stderr,Failedtoopenaudiodevicen);free(buf);return0;memset(&mix,0,sizeof(structaudio_mix);/*SetallMaximumonBassandTreble*/mix.mode=3;/*testBass*/for(i=0;i15;i+)fprintf(stderr,BassBoost+n);mix.BassBoost+;ioctl(fd_dev,0x4d00,&mix);write(fd_dev,buf,600000);

75、sleep(4);mix.BassBoost=0;/*resetBass*/*testmute,muteis1bits!*/for(i=0;i2;i+)fprintf(stderr,mute+n);mix.mute+;ioctl(fd_dev,0x4d00,&mix);write(fd_dev,buf,600000);sleep(4);/*testTreble*/for(i=0;i4;i+)fprintf(stderr,Treble+n);amix.Treble+;ioctl(fd_dev,0x4d00,&mix);write(fd_dev,buf,600000);sleep(4);mix.T

76、reble=0;/*resetTreble*/*Testvolume*/for(i=0;ifile_length=600000+44;wave_head-nDataBytes=600000;if(write(fd_file,(char*)wave_head,sizeof(structwave_s)!=sizeof(structwave_s)fprintf(stderr,Failedtowritefile/var/tmp/rec.wavn);free(buf);close(fd_dev);close(fd_file);return0;if(write(fd_file,buf,600000)!=6

77、00000)fprintf(stderr,Failedtowritefile/var/tmp/rec.wavn);free(buf);close(fd_dev);close(fd_file);return0;close(fd_file);fprintf(stderr,SavefileOKn);free(buf); close(fd_dev);return1;11.3.2 11.3.2 播放播放WAVWAV文件举例文件举例2. 2. 运行过程运行过程(1)首先配置首先配置HitoolforARMuClinux,使其以,使其以MDB方式调试。方式调试。(2)将本程序的可执行文件及将本程序的可执行文

78、件及Test.wav文件下载到评估板并运行。首文件下载到评估板并运行。首先将同一目录下的先将同一目录下的Test.wav文件播放出来,然后进行文件播放出来,然后进行3秒的录音。秒的录音。11.4 键盘及LCD显示应用 11.4.1 LCD介绍1. 1. 概述概述n长期以来,常见的掌上电脑长期以来,常见的掌上电脑(PDA)等小型手持式设备上,由于硬件条件等小型手持式设备上,由于硬件条件的限制,我们看到的显示器件通常是单色的限制,我们看到的显示器件通常是单色LCD,用户界面也非常简单,用户界面也非常简单,几乎看不到几乎看不到PC机上美观整齐的图形界面(机上美观整齐的图形界面(GUI)支持因为早期嵌

79、入式)支持因为早期嵌入式处理器的速度有限,在处理图形和多媒体数据方面显得力不从心。处理器的速度有限,在处理图形和多媒体数据方面显得力不从心。n随着高性能嵌入式处理器的普及和硬件成本的不断降低,尤其是随着高性能嵌入式处理器的普及和硬件成本的不断降低,尤其是AFM系列处理器的推出,嵌入式系统的功能也越来越强。系列处理器的推出,嵌入式系统的功能也越来越强。n在多媒体应用的推动下,彩色在多媒体应用的推动下,彩色LCD也越来越多地应用到了嵌入式系统也越来越多地应用到了嵌入式系统中,如新一代掌上电脑中,如新一代掌上电脑PDA多采用多采用TFl显示器件,支持彩色图形界面,显示器件,支持彩色图形界面,图片显示

80、和视频媒体播放。图片显示和视频媒体播放。nLCD控制器的功能是产生显示驱动信号,驱动控制器的功能是产生显示驱动信号,驱动LCD显示器。显示器。用户只需用户只需要通过读写一系列的寄存器,完成配制和显示控制。要通过读写一系列的寄存器,完成配制和显示控制。n在本例中,笔者采用的是夏普在本例中,笔者采用的是夏普LQ035Q2DD54TFT,显示模块,在,显示模块,在240320分辨率下可提供分辨率下可提供16位彩色显示。位彩色显示。11.4.1 LCD11.4.1 LCD介绍介绍2. 2. Linux的帧缓冲设备的帧缓冲设备l帧缓冲帧缓冲(Framebuffer)是是Linux伪显示设备提供的一个接口

81、,把显存抽伪显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。区进行读写操作。l帧缓冲驱动的应用广泛,在帧缓冲驱动的应用广泛,在Linux的桌面系统中,的桌面系统中,XWindows服务器就服务器就是利用帧缓冲进行窗口的绘制。是利用帧缓冲进行窗口的绘制。l帧缓冲设备对应的设备文件为帧缓冲设备对应的设备文件为/dev/fb*如果系统有多个显示卡,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达下还可支持多个帧缓冲设备,最多可达3外,分别为外,分别为/dev/fb

82、0-/dev/fb31,而,而/dev/fb为当前缺省的帧缓冲设备。为当前缺省的帧缓冲设备。l帧缓冲设备为标准字符设备,主设备号为帧缓冲设备为标准字符设备,主设备号为29,次设备号则从,次设备号则从0到到310分分别对应别对应/dev/fb0-dev/fb3l。11.4.1 LCD11.4.1 LCD介绍介绍通过通过/dev/fb,应用程序的操作主要有这几种,应用程序的操作主要有这几种:读写读写(read/write)/dev/fb相当于读泻屏幕缓冲区。例如用相当于读泻屏幕缓冲区。例如用cp/dev/fb0tmp命令可将当前命令可将当前屏幕的内容拷贝到一个文件中,而命令屏幕的内容拷贝到一个文件

83、中,而命令cptmp/dev/fb0则将图形文则将图形文件件tmp显示在屏幕上。显示在屏幕上。映射映射MAP操作操作对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。地址访问屏幕缓冲区,在屏幕上绘图了。I/O控制对于帧缓冲设备控制对于帧缓冲设备对设备文件的对设备文件的ioctl操作可读取设置显示设备及屏幕的参数,如分辨率,操作可读取设置显示设备及屏幕的参数,如分辨率,显示

84、颜色数,屏幕大小等等。显示颜色数,屏幕大小等等。ioctl的操作是由底层的驱动程序来完成的操作是由底层的驱动程序来完成的。的。11.4.1 LCD11.4.1 LCD介绍介绍在应用程序中,操作在应用程序中,操作/dev/fb的一般步骤如下:的一般步骤如下:打开打开/dev/fb设备文件。设备文件。用用ioctrl躁作取得当前显示屏幕的参数,如屏幕分辨率,每个像素点躁作取得当前显示屏幕的参数,如屏幕分辨率,每个像素点的比特数。根据屏幕参数可计算屏幕缓冲区的大小。的比特数。根据屏幕参数可计算屏幕缓冲区的大小。将屏幕缓冲区映射到用户空间。将屏幕缓冲区映射到用户空间。映射后就可以直接读写屏幕缓冲区,进

85、行绘图和图片显示了。映射后就可以直接读写屏幕缓冲区,进行绘图和图片显示了。11.4.1 LCD11.4.1 LCD介绍介绍典型程序段如下:典型程序段如下:#includeintmain()intfbfd=0structfbv_ar_screeninfofovinfostructfb_fix_screeninfoofinfolongintscreensize=0/*打开设备文件打开设备文件*/fbfd=open(“/dev/fb0”;O_RONLY);/*取得屏幕相关参数取得屏幕相关参数*/11.4.1 LCD11.4.1 LCD介绍介绍ioctl(fbfdFBIOGET_FSCREENINFO

86、&finfo);ioctl(fbfdFBIOGET_VSCREENINFO&vinfo);/*计算屏幕缓冲区大小计算屏幕缓冲区大小*/screensizevinfo-xres*vinfo-yres*vinfo-bits_per_pixel/8/*映射屏幕缓冲区到用户地址空间映射屏幕缓冲区到用户地址空间*/fbp=(char*)mmap(0,screensize,PFOT_READ|PFOT_WRITE,MAP_SHAREDfbfd,0);/*下面可以通过下面可以通过fb指针读写缓冲区指针读写缓冲区*/*部分省略部分省略*/11.4.1 LCD11.4.1 LCD介绍介绍输入码是为了使输入设备将

87、汉字输入到计算机而专门编制的一种代码。输入码是为了使输入设备将汉字输入到计算机而专门编制的一种代码。常见的有国标码,区位码,拼音码和五笔字型等。常见的有国标码,区位码,拼音码和五笔字型等。国标码和区位码是专业人员使用的一种汉字编码,它是以数字代码来国标码和区位码是专业人员使用的一种汉字编码,它是以数字代码来区别每个汉字的。区别每个汉字的。拼音码是最容易学校的一种,但它的重码太多,检字太慢。拼音码是最容易学校的一种,但它的重码太多,检字太慢。五笔字型则是以结构来区分每个汉字,它的重码烧,是目前推广的一五笔字型则是以结构来区分每个汉字,它的重码烧,是目前推广的一种比较简单,易学,易记的的输入码。种

88、比较简单,易学,易记的的输入码。区位码是将区位码是将GB2312-80方案种的字符按其位置划分为方案种的字符按其位置划分为9494个区,每个区个区,每个区94个字符。区的编号是从个字符。区的编号是从194194,区内字符编号也是从,区内字符编号也是从194。机内码是指机器内部处理和存储汉字的一种代码。常用的一种汉字机机内码是指机器内部处理和存储汉字的一种代码。常用的一种汉字机内码是用两个字节表示一个汉字。内码是用两个字节表示一个汉字。11.4.1 LCD11.4.1 LCD介绍介绍汉字的显示一般是汉字的显示一般是1616的点阵的点阵因此一个汉字需要因此一个汉字需要16232个字节个字节来存储字

89、模,在嵌入式系统设计中实现汉字的显示有两种方案。来存储字模,在嵌入式系统设计中实现汉字的显示有两种方案。F第一种是使用通用汉字字库,这中方案适合于在应用中要大量显示不第一种是使用通用汉字字库,这中方案适合于在应用中要大量显示不同的汉字同的汉字.因此可以把整个汉字字库放入内存中,这种方案是以浪费因此可以把整个汉字字库放入内存中,这种方案是以浪费内存为代价的,因为内存为代价的,因为1616点阵的汉字字库一般在点阵的汉字字库一般在260KB左右。左右。F第二种方案是设计一个具有少量常用汉字的简单汉字字库这个方案适第二种方案是设计一个具有少量常用汉字的简单汉字字库这个方案适合于应用种用到少量汉字的字库

90、,但必须借助汉字点阵提取软件制作合于应用种用到少量汉字的字库,但必须借助汉字点阵提取软件制作一个含有能用到的汉字的简单字库。一个含有能用到的汉字的简单字库。11.4.1 LCD介绍第一种解决方案第一种解决方案在第一种方案种汉字点阵信息提取的代码实现在第一种方案种汉字点阵信息提取的代码实现:intfp;unsignedcharData32;unsignedcharqh,wh;unsignedintoffset;fp=open(/var/tmp/HZK16,0); /打开汉字字库打开汉字字库。qh=*(s)-0xa0;/计算要显示汉字的区号计算要显示汉字的区号wh=*(s+1)-0xa0;/计算要

91、显示汉字的区内号计算要显示汉字的区内号offset=(94*(qh-1)+(wh-1)*32;/计算要显示汉字在字库中的偏移计算要显示汉字在字库中的偏移量量lseek(fp,offset,SEEK_SET);/移动文件指针移动文件指针read(fp,Data,32);/读取汉字点阵信息读取汉字点阵信息close(fp);执行完后执行完后Data32数组种存放汉字的点阵信息。数组种存放汉字的点阵信息。第二种解决方案第二种解决方案第二种方案的汉字显示的代码实现第二种方案的汉字显示的代码实现:构造简单汉字字库其结构如下:构造简单汉字字库其结构如下:structHZ_Table_StructintCo

92、de;unsignedcharData132;conststructHZ_Table_StructHZ_Table=/*嵌嵌*/0,0x00,0x80,0x31,0x84,0x30,0x84,0x3F,0xFC,0x3F,0xFC,0x33,0x20,0x33,0x7E,0x7F,0xFE,0x33,0xC6,0x3F,0x10,0x3F,0x30,0x33,0x38,0x3F,0x28,0x3F,0x6C,0x33,0xC6,0x00,0x02,;整型整型Code是汉字在这个简单字库中的序号,以便查看和显示。是汉字在这个简单字库中的序号,以便查看和显示。数组数组Data32是按行存放汉字的点

93、阵信息。是按行存放汉字的点阵信息。11.4.2 11.4.2 键盘实现键盘实现参见参见5.4.1节键盘编程节键盘编程11.5 11.5 汉字音乐点播应用汉字音乐点播应用包括包括LCD汉字显示、汉字显示、WAV文件播放、文件播放、键盘识别部分,其中键盘识别部分,其中LCD汉字显示、汉字显示、WAV文件播放采用在设备驱动之上编程,而文件播放采用在设备驱动之上编程,而16键盘识别比较简单,采用直接操纵方式。键盘识别比较简单,采用直接操纵方式。程序如下:程序如下:/*LCD定义部分定义部分*/#include#include#include#include#include#include#includ

94、e#include#defineSCREEN_X240#defineLCD_XDIM(SCREEN_X/4)#defineLCD_YDIM64intfd;unsignedcharbuffer4800;/*键盘定义变量和端键盘定义变量和端*/#definerpg(*(volatileunsigned*)0x01d20044)#definerpf(*(volatileunsigned*)0x01d20038)#definerpgc(*(volatileunsigned*)0x01d20040)#definepupg(*(volatileunsigned*)0x01d20048)#definerPC

95、ONF(*(volatileunsigned*)0x1d20034)#definerPDATF(*(volatileunsigned*)0x1d20038)#definerPUPF(*(volatileunsigned*)0x1d2003c)#definerPCONG(*(volatileunsigned*)0x1d20040)#definerPDATG(*(volatileunsigned*)0x1d20044)#definerPUPG(*(volatileunsigned*)0x1d20048)#definerWTCON(*(volatileunsigned*)0x1d30000)#def

96、inerWTDAT(*(volatileunsigned*)0x1d30004)#definerWTCNT(*(volatileunsigned*)0x1d30008)#defineMCLK(40000000)staticintdelayLoopCount=400;/*播放函数的定义部分播放函数的定义部分*/#include#include#include#include#include#include#defineSIOC_OUT0x20000000#defineSIOC_IN0x40000000#defineSIOC_INOUT (SIOC_IN|SIOC_OUT)#defineSIOCP

97、ARM_MASK0x1fff#define_SIOWR(x,y,t)(int)(SIOC_INOUT|(sizeof(t)&SIOCPARM_MASK)16)|(x8)|y)#defineSNDCTL_DSP_CHANNELS_SIOWR(P,6,int)#defineSNDCTL_DSP_SPEED_SIOWR(P,2,int)#defineAUDIOBUFLEN4096主程序略主程序略(见课本见课本P357)11.6 11.6 本章小结本章小结串口应用程序的编写方法;串口应用程序的编写方法;TCP/IP协议以及协议以及Socket的编写方法;的编写方法;基于基于uClinux音频接口的应用程序的开发音频接口的应用程序的开发;键盘和键盘和LCD的应用程序的开发。的应用程序的开发。给出了一个汉字音乐点播程序,说明了具给出了一个汉字音乐点播程序,说明了具体应用程序的编写方法。体应用程序的编写方法。练习题练习题:1.简述串口应用常用的接口函数及使用方法。简述串口应用常用的接口函数及使用方法。2.uClinux下的下的web服务器的工作原理。服务器的工作原理。3.试编写一个播放试编写一个播放mp3文件的应用程序。文件的应用程序。4.LCD的字符显示原理。的字符显示原理。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号