1、Linux应用程序设计,Linux文件编程,Linux文件编程有两种方法 Linux系统调用 C语言库函数,内核空间和用户空间,为了更好地保护内核空间,将程序的运行空间分为内核空间和用户空间,分别运行在不同的级别上,逻辑上是相互隔离。用户进程在通常情况下不允许访问内核数据,他们只能在用户空间操作,调用用户空间的函数;,系统调用,所谓系统调用是指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务;在有些情况下,用户空间的进程需要获得一定的系统服务,这时操作系统就必须利用系统提供给用户的“特殊接口” 。进行系统调用时,程序运行空间需要从用户空
2、间进入内核空间,处理完后在返回到用户空间。,用户编程接口(API),系统调用并不是直接与程序员进行交互,它仅仅是一个通过软中断机制向内核提交请求,以获取内核服务的接口。在实际使用中,程序员调用的通常是用户编程接口-API,并不是所有的函数都一一对应一个系统调用,有时,一个API函数会需要几个系统调用来共同完成函数的功能,甚至还有一些API函数不需要调用相应的系统调用(它所完成的不是内核提供的服务)。,在Linux中,用户编程接口(API)遵循了在UNIX中最流行的应用编程界面标准POSIX标准。,系统调用-创建,系统调用-创建,系统调用-创建,Linux文件及文件描述符,系统调用-打开,系统调
3、用-打开,系统调用-打开,系统调用-打开,系统调用-打开,系统调用读,系统调用读,系统调用定位,系统调用定位,系统调用-访问判断,系统调用-访问判断,综合实例,实例要求: 使用open等文件访问系统调用编写应用程序,该应用程序实现文 件的复制功能。功能描述: 该程序通过从待拷贝的文件中逐步读出数据到缓冲区,再把缓冲区的数据逐个写入到新创建的文件中,完成对原文件的拷贝工作。,库函数,库函数文件创建和打开,库函数文件创建和打开,库函数文件创建和打开,库函数读,库函数写,库函数读字符,库函数读字符,库函数格式化读,库函数格式化写,库函数定位,路径获取,路径获取,目录创建,时间类型,时间获取,时间转化
4、,时间保存,时间获取,时间显示,时间显示,获取时间,延时执行,嵌入式Linux设备文件I/O操作实例,文件的I/O操作通常包括打开文件、关闭文件、读写文件、定位文件、給文件上锁等。具体的操作函数包括open()、close()、read()、write()、lseek()、fcntl()等;对字符设备文件的使用通常采用I/O操作方式;串口为一典型的字符设备。,用户常见的数据通信的基本方式可分为并行通信与串行通信两种。 并行通信是指利用多条数据传输线将一个数据的多个bits同时传送。它的特点是传输速度快,适用于短距离通信,应用于要求传输速度较高的场合。 串行通信是指利用一条传输线将数据一位位地顺
5、序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。,串口设备概述,串口是计算机一种常用的接口,常用的串口有RS-232、R-S422、RS-485、TTL接口等,它们的区别主要体现在传输信号的电平上,数据格式都是一致的,即对于软件编程没有区别,普通PC机提供RS-232接口。遵循串口通信标准,该标准规定采用一个DB25的连接器或DB9的连接器(目前的计算机大多采用DB9连接器),其中DB9连接器(公头) 。,计算机RS-232串口连接器,1:DCD(载波检测)。用于通知计算机其处于在线状态。 2:RXD(接收数据)。此引脚用于接收外部设
6、备送来的数据; 3:TXD(发送数据)。此引脚将计算机的数据发送给外部设备; 4:DTR。数据终端就绪; 5:GND。逻辑地。 6:DSR。数据准备就绪; 7:RTS。请求发送; 8:CTS。清除发送; 9:RI。通知计算机有呼叫进来。,S3C2410X 内部具有2个独立的UART控制器,每个控制器都可以工作在Interrupt(中断)模式或者DMA(直接内存访问)模式。同时,每个UART均具有16字节的FIFO(先入先出缓存),支持的最高波特率可达到230.4Kbps。UART的操作主要可分为以下几个部分:数据发送、数据接收、产生中断、产生波特率、Loopback模式、红外模式以及自动流控模
7、式。,串口设备设置,设置串口中最基本的包括波特率设置,校验位和停止位设置。串口的设置主要是设置struct termios结构体的各成员值 。includestruct termio unsigned short c_iflag; /* 输入模式标志 */unsigned short c_oflag; /* 输出模式标志 */unsigned short c_cflag; /* 控制模式标志*/unsigned short c_lflag; /*本地模式标志 */unsigned char c_line; /* line discipline */unsigned char c_ccNCC;/
8、* control characters */;,串口配置函数示例,int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop) struct termio newtio,oldtio;if ( tcgetattr( fd, /数据位的位掩码设置switch( nBits ). /设置数据宽度switch( nEvent )/设置奇偶校验位,switch( nSpeed ) /*设置波特率*/if( nStop = = 1 ) newtio.c_cflag ,串口设备的使用,在添加串口驱动模块并配置完串口的相关属性后,就可以
9、对串口进行打开、读写操作了。它所使用的函数和普通文件读写的函数一样,都是open()、write()和read()。串口与普通文件的区别只是串口是一个终端设备,因此在函数的具体参数的选择时会有一些区别。,打开串口fd = open( “/dev/ttyS0“, O_RDWR|O_NOCTTY|O_NDELAY); 参数:O_NOCTTY标志用于通知Linux系统,这个程序不会成为对应这个端口的控制终端。如果没有指定这个标志,那么任何一个输入(诸如键盘中止信号等)都将会影响用户的进程。O_NDELAY标志通知Linux系统,这个程序不关心DCD信号线所处的状态(端口的另一端是否激活或者停止)。如
10、果用户指定了这个标志,则进程将会一直处在睡眠状态,直到DCD 信号线被激活。,完整的打开串口的函数示例,int open_port(int fd,int comport) char *dev=“/dev/ttyS0“,“/dev/ttyS1“,“/dev/ttyS2“;long vdisable;if (comport=1) /如果选择打开串口1 fd = open( “/dev/ttyS0“, O_RDWR|O_NOCTTY|O_NDELAY);if (fd = =-1) /打开串口1失败 printf(“Cant Open Serial Port“);return(-1);else if(
11、comport=2) /串口2 fd = open( “/dev/ttyS1“, O_RDWR|O_NOCTTY|O_NDELAY);if (fd = =-1) printf(“Cant Open Serial Port“);return(-1); ,else if (comport=3) /串口3 fd = open( “/dev/ttyS2“, O_RDWR|O_NOCTTY|O_NDELAY);if (fd = = -1) printf(“Cant Open Serial Port“);return(-1);/*恢复串口为阻塞状态*/if(fcntl(fd, F_SETFL, 0)0)
12、printf(“fcntl failed!n“);else printf(“fcntl=%dn“,fcntl(fd, F_SETFL,0);/*测试是否为终端设备*/if(isatty(STDIN_FILENO)=0) printf(“standard input is not a terminal devicen“);else printf(“isatty success!n“);printf(“fd-open=%dn“,fd);return fd; ,读写串口,读写串口操作和读写普通文件一样,使用read()、write()函数即可。 write(fd,buff,8);read(fd,buff,8);,串口操作完整示例,完整的串口操作包括串口打开、串口参数设置、串口读写等,具体程序示例参见如下程序清单:【清单8.5】【清单8.6】【清单8.7】,