文件读取问题

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

5金钱
现在使用RT的文件管理,想从SD卡读取文件,挂载都没有问题
4 @2 a! g% y4 j) B* }但是使用open函数时好像有点不太对- D! a/ E3 U1 Q' V5 e8 [* G
  1. void pic(char *path)
    ! j0 r* V+ e8 Q/ f1 B
  2. {
    - P( b2 @# e' Z; w
  3. <p style="line-height: 30px; text-indent: 2em;">int fd;& s) W: \2 [/ N
  4.        fd = open(path,O_RDONLY);) w6 i% L6 z) b' C  O
  5.        if(fd>=0)" A5 a/ ~5 f0 ~! R* w, d
  6.        {6 M5 D3 g6 S, J0 O5 G
  7.                fstat(fd,&file_state);
    " [, R# a1 x6 n0 [& F7 s# w
  8.                hMem = GUI_ALLOC_AllocZero(512*1024);& R$ |/ o6 u* ~7 G/ G' J! T
  9.                buf = GUI_ALLOC_h2p(hMem);
    " Q6 m# ]  |, _
  10.                read(fd,buf,file_state.st_size);  S4 H4 s: z% w7 A) Y7 l
  11.                close(fd);3 p9 m+ a# U3 w0 m3 S+ m
  12.                GUI_DrawStreamedBitmapAuto(buf,100,100);
    % O& D! A& j/ r4 V7 l" j
  13.                GUI_ALLOC_Free(hMem);) a9 Y* {: f( @9 B" S! h8 F7 D" R$ `; z
  14.       }</p>}
复制代码
开始执行open时fd的值一直为0xFFFF,当循环执行好多次后fd才会变成正常的序号,: }2 U' z" w7 ^1 T, s
我试着open之前加一些延时,这样可以第一次执行open后 fd值就是正确的
8 x# M2 M% N# s! `7 d. j# X. u+ |( V8 s3 g, Q
我想问一下,是我的程序问题,还是这个函数有问题,8 j5 w( c3 \$ g6 \  M9 V
不知道有没有遇到过这种问题的大哥
) x8 q5 I9 S7 ^2 X, J+ o0 i

使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-5-9 22:49:19 | 显示全部楼层
刚注意到SD挂载程序,是先延时再挂载
8 g: A& n% p) }* t# F7 ?$ l
  1. void sd_mount(void *parameter)% _( w# C& A' G' E9 e, f! |2 ]
  2. {/ x, K  x% n5 D; E
  3.     while (1)% x1 D5 V. a  ]" N
  4.     {
    ( D+ Y9 J. P; C; t% k
  5.         rt_thread_mdelay(500);, X+ _* M, r- d: M# ?
  6.         if(rt_device_find("sd0") != RT_NULL)
    3 `" p' v6 U7 c8 s, K" F
  7.         {
    8 p* p7 b) p. k( `1 a5 k
  8.             if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK)
    2 F3 [3 J! B6 h. s" u6 `* `: r6 J! g
  9.             {7 p& X( Y2 h  S/ |5 H0 y
  10.                 LOG_I("sd card mount to '/'");  v, {% ^+ X$ N% }9 B
  11.                 break;
    ) I: f/ I, M/ N: S1 P* g' y
  12.             }- ~" f6 c4 f1 h* ]. W
  13.             else
    % ?8 |3 e, C, O6 j6 a1 q* W
  14.             {* r9 H- E* r! x- I
  15.                 LOG_W("sd card mount to '/' failed!");
    ) ?+ m, l( b5 \! Q1 L& r
  16.             }$ B# S0 D0 h& @6 S
  17.         }
    1 R0 ]' m' h- ]) o+ x+ ^
  18.     }; ~0 \' ^8 X2 f; s2 j' ^$ Q
  19. }
复制代码
; n& e! E  m# Z( H. L0 C
我想先挂载再使用延时函数试试吧
使用道具 举报 回复
发表于 2019-5-9 22:40:03 | 显示全部楼层
whj467467222 发表于 2019-5-9 18:453 [3 D6 m3 _# M! l  W
从这几个方面查找问题:
4 c* }1 y1 o0 s1,文件系统什么时候初始化的,, y2 F0 `( u0 N4 D5 |- K
2,什么时候SD卡挂载的文件系统

" _4 C9 }- u; _! f/ U8 Y好的,谢谢。
使用道具 举报 回复
发表于 2019-5-9 22:39:08 | 显示全部楼层
jhb 发表于 2019-5-9 18:06# q* o4 s& V; d; E0 I
按照你的描述  猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成 ...
2 P1 ~- @6 e) ]5 B  Y0 n* H
谢谢,我觉得应该是,$ ?7 Y+ y7 p+ X8 f- r
  1. INIT_APP_EXPORT(stm32_sdcard_mount);
复制代码

* A0 a; G6 h! _回头把初始化提前一些试试
使用道具 举报 回复
发表于 2019-5-9 18:45:50 | 显示全部楼层
从这几个方面查找问题:
# ?: d! u! o) a. h1,文件系统什么时候初始化的,
$ ?! h3 Q. b- q8 Z: v2,什么时候SD卡挂载的文件系统
0 E$ ?' U0 J% i" v; J* J- y3,你什么时候使用open打开的文件
使用道具 举报 回复
发表于 2019-5-9 18:06:03 | 显示全部楼层
按照你的描述  猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

Powered by RT-Thread

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