文件读取问题

发表在 文件系统学习营2019-5-9 15:09 [复制链接] 5 361

5金钱
现在使用RT的文件管理,想从SD卡读取文件,挂载都没有问题0 J' D4 h9 ]( u
但是使用open函数时好像有点不太对
  x: {& F# A# a2 e; a8 s, R5 z6 J1 T
  1. void pic(char *path)
    / m1 c& k; h. j& N" o9 }
  2. {- |- `4 b( @2 n: `/ t; e. Q! D
  3. <p style="line-height: 30px; text-indent: 2em;">int fd;' P' S3 H6 i) Y7 H% I$ E% `
  4.        fd = open(path,O_RDONLY);, K1 S- W5 [% b0 v; q
  5.        if(fd>=0). g8 g2 U' H, z& D3 w
  6.        {: ?3 d( G6 m8 \+ @$ s9 w
  7.                fstat(fd,&file_state);7 r7 ?1 v& _, y1 c' T! I
  8.                hMem = GUI_ALLOC_AllocZero(512*1024);
    # i9 ?8 c, v# g, T- j5 b
  9.                buf = GUI_ALLOC_h2p(hMem);
      s9 u( C9 \: a. x3 I. @! S, |- T
  10.                read(fd,buf,file_state.st_size);- |! X# e. N* _* x  |
  11.                close(fd);7 A! s2 T* U4 v3 N8 W* N2 G9 d; [7 I
  12.                GUI_DrawStreamedBitmapAuto(buf,100,100);
    . v% h9 N- M! N7 K
  13.                GUI_ALLOC_Free(hMem);; ^  a% R1 J; o% G
  14.       }</p>}
复制代码
开始执行open时fd的值一直为0xFFFF,当循环执行好多次后fd才会变成正常的序号,% p/ Z; }( t3 _& `2 b
我试着open之前加一些延时,这样可以第一次执行open后 fd值就是正确的
5 X9 }) s9 H4 Z' g0 c' ~6 U
% m6 A- f, o- z% D1 P# c我想问一下,是我的程序问题,还是这个函数有问题,
* N% P6 g) m# [! m% C) G( a不知道有没有遇到过这种问题的大哥
6 K! U- U6 L0 c+ _' r# `

使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-5-9 18:06:03 | 显示全部楼层
按照你的描述  猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成
使用道具 举报 回复
发表于 2019-5-9 18:45:50 | 显示全部楼层
从这几个方面查找问题:1 W5 K2 q) h5 ^
1,文件系统什么时候初始化的,
+ Z6 e% l7 w4 V2,什么时候SD卡挂载的文件系统4 T" h# s3 {6 k. U
3,你什么时候使用open打开的文件
使用道具 举报 回复
发表于 2019-5-9 22:39:08 | 显示全部楼层
jhb 发表于 2019-5-9 18:06% c; D  d5 V( b. q* E3 L8 k
按照你的描述  猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成 ...
+ O( T: w; P. x; ~" y
谢谢,我觉得应该是,( n  D6 |3 x6 u9 r
  1. INIT_APP_EXPORT(stm32_sdcard_mount);
复制代码
5 A% n7 D( h2 n/ a7 M
回头把初始化提前一些试试
使用道具 举报 回复
发表于 2019-5-9 22:40:03 | 显示全部楼层
whj467467222 发表于 2019-5-9 18:45
2 e% x" _5 x4 \! c# Y从这几个方面查找问题:
5 s- W1 l3 [0 Y0 m# Q! C1,文件系统什么时候初始化的,( y& q. }+ E( }# W6 |
2,什么时候SD卡挂载的文件系统

* J. X2 T1 z& y/ t' U# P9 |6 e好的,谢谢。
使用道具 举报 回复
发表于 2019-5-9 22:49:19 | 显示全部楼层
刚注意到SD挂载程序,是先延时再挂载
1 j! f6 ]" A" y. t" w: w* R
  1. void sd_mount(void *parameter)/ j4 d0 W) b4 y6 k3 }
  2. {
    4 D$ I6 p. c0 |: z
  3.     while (1)& G5 {: u" _: v; L
  4.     {
    - [3 S; I: ]. H) e; |
  5.         rt_thread_mdelay(500);
    3 o1 M4 k/ S0 X; C9 {1 m8 z; {
  6.         if(rt_device_find("sd0") != RT_NULL)1 t; E  Y: j% Y" g& v
  7.         {
    3 H  Q! X8 M6 A7 e! R1 D# @) z
  8.             if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK)
    3 c4 K9 W9 f9 W7 n# ^
  9.             {# a: O- K6 |3 C; m/ _# g, V
  10.                 LOG_I("sd card mount to '/'");6 \( r$ s6 a8 _1 a
  11.                 break;
    7 H! l& R0 n# l- o* K7 g
  12.             }
    * G; r7 j/ e* _7 Q- i# I
  13.             else
    & X# b! `1 j5 z+ W" o! b7 ]
  14.             {
    ; X# g. h1 n% X& ^7 M9 N
  15.                 LOG_W("sd card mount to '/' failed!");$ [# s; s0 B. Q, K# K' s
  16.             }
    : L* y, s/ E8 A1 M2 c0 P* e
  17.         }
    % V1 R+ t+ L( t1 h
  18.     }
    # A+ p6 J! q0 S' ]
  19. }
复制代码

! z; F) F- \6 h$ c  u, }我想先挂载再使用延时函数试试吧
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表