嵌入式Linux文件处理与串口通信

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/* 调用函数write(),将buf的内容写到 指定的文件描述符文件中 */
• • • • • • • • • int write_file(int fd) { int i,size,len; char *buf="Hello! I'm writing to this file!"; len = strlen(buf); size = write( fd, buf, len); printf("Write:%s\n",buf); return 0; }
/* 在主函数中调用各功能模块 */
• • • • • • • • int main(void) { int fd; fd=open_file(); write_file(fd); read_file(fd); exit_file(fd); }
打开文件
写入数据
读取数据 关闭文件
/* 建立新文件aabb.c,并指定 读写操作权限*/
/*
• • • • • • •
关闭文件 */
int exit_file(int fd) { close(fd); printf("Close aabb.c\n"); exit(0); }
6.2 嵌入式Linux串口通信技术
6.2.1 嵌入式Linux串口通信基础
1、串口通信的工作原理
• 所谓“串口通信”是指外设和计算机间使 用一根数据信号线(另外需要地线),数据在 一根数据信号线上一位一位地进行传输, 每一位数据都占据一个固定的时间长度。 • 在串口传输中,发送方为了告诉接收方, 新的数据字节分组到达,在每一个数据字 节分组前面有一个起始位(通常是0),为 了让接收方知道字节已经结束,在每一个 数据字节分组后面有一个停止位(通常是 1)。接收方一旦检测到停止位,接收方会 一直等待,直到下一个开始位。
3、lseek函数
• lseek函数用于将文件指针定位到相应的 位置,以进行读写操作。 • 调用lseek函数所需要的头文件: 位置基点: SEEK_SET:文件开头 • #include <unistd.h> SEEK_CUR:当前位置 SEEK_END:文件尾部 • #include <sys/types.h> 位移量 文件描述符 • 其函数原型为: • off_t lseek(int fd, off_t offset, int whence); • 函数返回值为文件指针的新位置,若返回 -1则出错。
6.1.1
文件描述符及文件处理
• 1、文件及文件描述符 • 通常,一个进程启动时,要打开3个文件: 标准输入、标准输出和标准错误处理。 • 标准输入的文件描述符是 0,标准输出是 1, 标准错误处理是 2。在POSIX中定义了 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 来代替 0、1、2。这三 个符号常量的定义位于头文件 unistd.h中。
4、示例
• 【例6-2】创建一新文件,然后对此文件进 行读写操作。 • 设计思路与分析: • (1)创建新文件 • (2)将指定内容写进文件 • (3)读取文件内容 • (4)关闭文件
设计思路与分析:
• (1)创建新文件 • 假设要创建新的文件“aabb.c‖,并将其保 存到/tmp目录之下,即其路径为 “/tmp/aabb.c‖ 文件拥有者、同组用户、
教材:嵌入式系统设计与应用 作者:张思民 出版:清华大学出版社
第6章 嵌入式Linux 文件处理与串口通信
第6章 嵌入式Linux 文件处理与串口通信
• 6.1 嵌入式Linux 的文件处理
• • • • • • • 6.1.1 6.1.2 6.1.3 文件描述符及文件处理 open函数和close函数 read函数、write函数和lseek函数
【例6-1】用可读写方式 新建(打开)一个文件。
/* file_open.c */ #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h>
buf为字符串
• 然后调用write()函数 : • write( fd, buf, len);
设计思路与分析:
• (3)读取文件内容 • 假设要读文件中的前10个字符,我们首先 要调用lseek()函数将文件指针移到文件起 始处: • lseek( fd, 0, SEEK_SET ); buf为字符数组
6.1.1
文件描述符及文件处理
• 1、文件及文件描述符 • 由于在Linux下设备和目录都看作是文件, 因此,Linux中的文件有4种类型:普通文 件、目录文件、链接文件和设备文件。 • Linux的内核利用文件描述符访问文件。 • 文件描述符是非负整数。 • 当打开一个现存文件或新建一个文件时, 内核会向进程返回一个文件描述符。当读 写文件时,也需要使用文件描述符来指定 待读写的文件。
2、write函数
• write函数用于向打开的文件实现写入数据 的操作。写操作的位置从文件位置开始。 指定读取数 据大小 • 调用write函数所需要的头文件: 存放数据缓 • #include <unistd.h> 冲区(数组) 文件描述符 • 其函数原型为: • ssize_t write(int fd, void *buf, size_t count); • 函数返回值为已写入数据的字节数,若返 回-1则出错。
/* 调用函数lseek(),将文件指针移到文件起 始处,并读文件中的10个字符 */
• • • • • • • • • • int read_file(int fd) { char buf_r[10]; buf_r[10] = '\0'; int size; lseek( fd, 0, SEEK_SET ); size = read( fd, buf_r, 10); printf("read from file:%s\n",buf_r); return 0; }
• • • • • • • •
int open_file() { int fd; fd = open("/tmp/aabb.c", O_CREAT | O_TRUNC | O_RDWR,0666 ); printf("open file: aabb.c , fd= %d\n",fd); return (fd); }
3、文件处理
• Linux系统的文件处理,主要是指进行打开 文件、读文件、写文件及关闭文件等I/O操 作。大多数情况下,只需用到5个函数: open、read、write、lseek 和close。 • 这几个函数不需要经过缓冲就能立即执行, 因此,被称之为不带缓存的I/O操作,即每 一个函数都只调用内核中的一个系统调用。
2、close函数
• close函数用于关闭一个打开的文件,所需 要的头文件为: • #include <unistd.h> • 其函数为: • int close(int fd); • 函数返回值:若成功为0,若出错为-1。 • 关闭文件函数close的参数fd为文件描述符。
3、示例
• • • • • • • 【例6-1】用可读写方式新建(打开)一个文件。 文件读写权限的表示: 数字0表示无权限, 数字1表示可执行, 数字2表示写权限, 数字4表示读权限。 常用数字求和来表示多权限的组合。 例:文件的可读写权限可以用数字0600表示。
必要的 头文件
【例6-1】用可读写方式 新建(打开)一个文件。
int main(void) { int fd; //声明文件描述符 fd = open(―open_test.c‖, O_CREAT | O_TRUNC | O_RDWR, 0600);
调用open函数,以可读写 的方式打开,注意多个选 项用“|‖符号分隔
• 再调用read( )函数将其ຫໍສະໝຸດ Baidu出来: • write( fd, buf, len);
设计思路与分析:
• (4)关闭文件 • 文件使用完毕后,将其关闭,这是一个良 好的编程习惯。 • close( fd);
实现上述功能的完整程序如下:
• • • • • • • • • /*file_rw.c*/ #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #define MAXSIZE
2、系统调用
• 所谓系统调用是指操作系统提供给用户程 序调用的一组“特殊”接口,用户程序可 以通过这组“特殊”接口来获得操作系统 内核提供的服务。 • 例如用户可以通过进程控制相关的系统调 用来创建进程、实现进程调度、进程管理 等。
2、系统调用
• Linux 为了保护内核空间,将程序的运行空间分 为内核空间和用户空间,它们在逻辑上是相互隔 离的。 • 用户进程在通常情况下不允许访问内核数据,也 无法使用内核函数,它们只能在用户空间操作用 户数据,调用用户空间的函数。 • 当用户空间的进程需要获得一定的系统服务(调 用内核空间程序),操作系统就利用系统提供给 用户的“特殊接口”——系统调用,用户进程进 入内核空间。 • 进行系统调用时,程序运行空间需要从用户空间 进入内核空间,处理完后再返回到用户空间。
fd为文件描述符
• 则: • fd = open("/tmp/aabb.c", O_CREAT | O_TRUNC | O_RDWR,0666 );
不同组用户均具有读和写 的权限,则该文件的权限 为666
设计思路与分析:
• (2)将指定内容写进文件 • 调用write()函数,将一段文本内容写到文 件中,需要使用strlen( )函数来检测字符串 长度: • len = strlen(buf);
# open_arm open file:open_test.c filedes = 3
6.1.3 read函数、write函数和 lseek函数
1、read函数
• read函数从打开的文件中读取数据。 指定读取数 据大小 • 调用read函数所需要的头文件: 存放数据缓 # include <unistd.h> 冲区(数组) 文件描述符 • 其函数原型为: • ssize_t read(int fd, void *buf, size_t count); • 函数返回值为读到数据的字节数,若返回 值为0,则已经到达文件尾,若返回-1则为 出错。
【例6-1】用可读写方式 新建(打开)一个文件。
printf("open file:open_test.c filedes = %d\n ", fd);
close(fd);
}
关闭文件
使用交叉编译方法,宿主机上用 arm-linux-gcc命令编译程序: • # arm-linux-gcc –o open_arm file_open.c • 将编译好的Linux执行程序open_arm 下载到目标板上运行
6.1.2
open函数和close函数
1、open函数
• open函数用于打开或创建文件。 • 调用open函数所需要的头文件如下: #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> • 其函数为: • int open(const char *pathname, int oflag, int perms ) ; • 函数返回值:若文件打开成功则返回文件 描述符,若出错则返回-1。
• 6.2 嵌入式Linux串口通信技术
6.2.1 嵌入式Linux串口通信基础 6.2.2 嵌入式Linux串口设置详解 6.2.3 RS232C标准 6.2.4 串口驱动程序的编写
6.1嵌入式Linux的文件处理
6.1嵌入式Linux的文件处理
• 由于嵌入式 Linux 是经 Linux 裁减而来的, 它的系统调用及用户编程接口 API 与 Linux基本上是一致的。
相关文档
最新文档