[STM32MP2] 【STM32MP257学习笔记】3.基础文件操作

[复制链接]
366|0
yuyy1989 发表于 2025-9-10 21:14 | 显示全部楼层 |阅读模式
在Linux中所有的设备都是作为文件存在的,因此要操作对应的外设需要先学习文件操作
基本的文件操作会用到open/read/write/lseek/close这几个方法
  1. int open (const char *__path, int __oflag, .../* mode_t mode */)
需要#include <fcntl.h>,用来打开文件,如果打开成功会返回一个非负的值作为文件描述符,之后的read write lseek close都要用到这个值
char *__path:文件路径
int __oflag:打开文件方式,常用的有O_RDONLY(只读), O_WRONLY(只写 ),O_RDWR(读写),O_CREAT (创建),O_TRUNC(截断)
mode_t mode:当__oflag有O_CREAT时用于指定新创建的文件的权限

  1. ssize_t read(int fd, void buf[.count], size_t count)
需要#include <unistd.h>,用来从打开的文件中读出指定长度的数据,读取成功会返回实际读取的数据长度
int fd:文件描述符
void buf[.count]:用于接收读取数据
size_t count:需要读取的长度

  1. ssize_t write(int fd, const void buf[.count], size_t count)
需要#include <unistd.h>,用来向打开的文件中写入指定长度的数据,写入成功后返回实际写入的数据长度
int fd:文件描述符
void buf[.count]:要写入的数据
size_t count:写入的数据长度

  1. off_t lseek(int fd, off_t offset, int whence)
需要#include <unistd.h>,用来重新定位读取写入的位置
int fd:文件描述符
off_t offset:偏移量
int whence:偏移参考点,SEEK_SET(相对于文件开始的位置),SEEK_CUR(相对于当前的位置),SEEK_END(相对于文件末尾)

  1. int close(int fd)
需要#include <unistd.h>,用来关闭打开的文件
int fd:文件描述符

接下来写个简单的程序来演示一下
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5. #include <errno.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #include <stdlib.h>

  9. #define BUF_SIZE 1024
  10. //file_test 1.txt 4 abcdefgh
  11. int main(int argc,char **argv)
  12. {
  13.     int fd,len;
  14.     char buf[BUF_SIZE];
  15.     memset(buf,0,BUF_SIZE);
  16.     if(argc < 2)
  17.     {
  18.         printf("need file path\n");
  19.         return -1;
  20.     }
  21.     fd = open(argv[1],O_RDWR|O_CREAT,S_IRUSR|S_IWUSR);
  22.     if (fd < 0)
  23.     {
  24.         perror("open file error");
  25.     }
  26.     else
  27.     {
  28.         printf("open file: %s\n",argv[1]);
  29.         do
  30.         {
  31.             len = read(fd,buf,BUF_SIZE);
  32.             if(len > 0)
  33.             {
  34.                 printf("read %d bytes\n",len);
  35.                 printf("%s\n",buf);
  36.             }
  37.         }while (len > 0);
  38.         if(argc == 4)
  39.         {
  40.             printf("write at %d\n",atoi(argv[2]));
  41.             lseek(fd,atoi(argv[2]),SEEK_SET);
  42.             write(fd,argv[3],strlen(argv[3]));
  43.         }
  44.     }
  45.     close(fd);
  46.     printf("\n");
  47.     return 0;
  48. }
这段代码可以在Ubuntu上用GCC编译运行和在Arm开发板上的效果是一样的
屏幕截图 2025-09-08 203938.png 屏幕截图 2025-09-08 204951.png

您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:同飞软件研发工程师
简介:制冷系统单片机软件开发,使用PID控制温度

168

主题

826

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部