您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第11章应用程序开发-哈尔滨理工大学电子邮件系统
第11章应用程序开发本章主要内容a)串口应用程序的编写方法。b)TCP/IP协议以及Socket的编写方法。c)基于uClinux音频接口的应用程序的编写方法。d)键盘和LCD的应用程序的编写方法。e)汉字音乐点播程序的编写实例。第十一章目录1.串口应用程序串口主要函数介绍串口举例2.网络应用TCP/IP网络应用Web服务器应用3音频设备应用常用音频文件格式播放WAV文件举例4键盘及LCD显示应用LCD介绍键盘实现5汉字音乐点播应用第十一章目录1.串口应用程序串口主要函数介绍串口举例2.网络应用TCP/IP网络应用Web服务器应用3音频设备应用常用音频文件格式播放WAV文件举例4键盘及LCD显示应用LCD介绍键盘实现3音频设备应用本章从一个针对运行在S3C44B0X上的uClinux操作系统进行应用程序的开发入手,给出Windows操作系统平台上使用HitoolforuClinux等工具开发的多种应用程序。本章主要介绍了:a)串口应用程序的编写方法。b)TCP/IP协议以及Socket的编写方法。c)基于uClinux音频接口的应用程序的编写方法。d)键盘和LCD的应用程序的编写方法。e)汉字音乐点播程序的编写实例。11.1串口应用程序S3C44B0X提供2个UART收发器,对它们可以操作在中断方式或DMA方式。它们内置波特率发生器,波特率发生器的时钟源为S3C44B0X的系统使用,所以最高速率可达115.2Kbps。二个串口有单独的波特率发生器,接收、发送和控制单元,支持红外方式的传送和接收。同时,在S3C44B0X串口的接收器和发送器中都有16字节的FIFO,FIFO可以有效的降低接收器和发送器对CPU的中断频率,提高发送和接收的效率。串口设备的可配置参数包括波特率,起始位数量,数据位数量,停止位数量和流量控制协议。在Linux操作系统中,设备驱动是以主设备号为主,每个设备都有唯一的主设备号和从设备号。11.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==fd){perror(提示错误!);}11.1.1串行口主要函数介绍2.设置串口最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置如下structtermios结构体的各成员值:structtermios{unsignedshortc_iflag;//输入模式标志unsignedshortc_oflag;//输出模式标志unsignedshortc_cflag;//控制模式标志unsignedshortc_lflag;//localmodeflagsunsignedcharc_line;//linedisciplineunsignedcharc_cc[NCC];//controlcharacters};11.1.1串行口主要函数介绍通过对c_cflag的赋值,设置波特率,字符大小,使能本地连接,使能串行口驱动读取输入数据。通过设置c_iflag,控制端口对字符的输入处理过程,IGNPAR符号常量表示忽略奇偶性错误的字节,不对输入数据进行任何校验,ICRNL将回车符映射为换行符。这里就只考虑常见的一些设置:(1)波特率设置:下面是修改波特率的代码:structtermiosOpt;tcgetattr(fd,&Opt);cfsetispeed(&Opt,B19200);//设置为19200Bpscfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);11.1.1串行口主要函数介绍(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|=~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串行口主要函数介绍⑤设置停止位1位:options.c_cflag&=~CSTOPB;2位:options.c_cflag|=CSTOPB;需要注意的是:如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(RawMode)方式来通讯。设置方式如下:options.c_lflag&=~(ICANON|ECHO|ECHOE|ISIG);//Inputoptions.c_oflag&=~OPOST;//Output3.读写串口设置好串口之后,读写串口就很容易,把串口当作文件读写就可以了。(1)发送数据charbuffer[1024];intLength=1024;11.1.1串行口主要函数介绍intnByte;nByte=write(fd,buffer,Length)(2)读取串口数据使用文件操作read函数读取,如果设置为原始模式(RawMode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。可以使用操作文件的函数来实现异步读取,如fcntl,或者select等来操作。charbuff[1024];intLen=1024;intreadByte=read(fd,buff,Len);4.关闭串口关闭串口就是关闭文件。close(fd);11.1.2串口举例假设接收程序readtest.c运行在装有标准Linux的PC机上,发送程序writetest.c运行在目标板S3C44B0X上,两台设备的串口通过交叉线连接在一起。接收程序readtest.c的源码如下:#includestdio.h#includestring.h#includemalloc.h#includesys/types.h#includesys/stat.h#includefcntl.h#includeunistd.h#includetermios.h#includeerrno.h#includemath.hintspfd;intmain(){charfname[16],hd[16],*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,TCSANOW,&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%d\n,retv);if(retv==-1)perror(read);}for(i=0;incount;i++){realdata+=(hd[i]-48)*pow(10,ncount-i-1);}printf(completereceivingthedata%d\n,realdata);close(spfd);return0;}11.1.2串口举例发送程序writetest.c的源码如下:#includestdio.h#includestring.h#includemalloc.h#includesys/types.h#includesys/stat.h#includefcntl.h#includeunistd.h#includetermios.hintspfd;intmain(intargc,char*argv[]){charfname[16],*sbuf;intsfd,retv,i;structtermiosoldtio;spfd=open(/dev/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);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串口举例本例程实现:在发送端发送数字123,在接收端接收并显示接收到的数据。这里请同学们注意的是:发送方按字符发送数据,接收方将接收的字符相应的ascii值与字符0所对应的ascii值相减,最终得到实际的十进制数值。11.2网络应用11.2.1TCP/IP网络应用以太网技术作为当前局域网的主流技术,可以提供从10Mbit/s,100Mbit/s到1000Mbit/s的物理带宽,以及比较好的抗干扰性、比较大的网络半径和比较低系统维护费用;同时在不同速率以太网之间保持比较好的前向兼容性,所以在系统升级时很方便。图11-1以太网电路结构图11.2.1TCP/IP网络应用1.网络基础(1)TCP/IP协议分层模型在实际操作中接触到的通常只是网络系统的最高层——应用层的用户界面。实际上要进行网际的数据传送,需要经过如下的步骤:①需要发送的数据如E-mail、web页等,通过用户界面由应用程序传送到应用程序的数据发送缓冲区,并设置好与下一层连接的参数等待发送。②数据做好传输前的准备工作,进入传输层。传输层主要负责为两台主机上的应用程序提供端口到端口的通信。③然后进入网络层的范畴。这里主要处理数据分组在网络中的活动,例如分组的选路。④当然最终数据还是要靠物理层的电磁波或光导纤维来传输。⑤在接收的一方是相反的过程,数据从最底层一直到应用层还原为用户可以识别的信息,这一切都是由上面的协议来规范的。11.2
本文标题:第11章应用程序开发-哈尔滨理工大学电子邮件系统
链接地址:https://www.777doc.com/doc-78075 .html