文件读取问题

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

5金钱
现在使用RT的文件管理,想从SD卡读取文件,挂载都没有问题
% u$ P- T* w3 y: l0 T但是使用open函数时好像有点不太对
6 {0 P! f5 Z+ K! \) x1 L# P. m
  1. void pic(char *path)+ f' D6 J, Q5 v! n" e) b4 L
  2. {
    4 Q  }; t3 |" m' |
  3. <p style="line-height: 30px; text-indent: 2em;">int fd;) E; V0 Y2 Y6 E6 C/ x1 R
  4.        fd = open(path,O_RDONLY);
    , q! u3 U: S* V6 [% O& S7 S- @5 I
  5.        if(fd>=0)
    9 N! Z2 \3 {% i& ~7 i
  6.        {
    7 C* X. l1 o  x5 [  q9 p
  7.                fstat(fd,&file_state);
    % `( I4 m5 |3 t0 ?& j. i5 S
  8.                hMem = GUI_ALLOC_AllocZero(512*1024);
    + l8 f: `  \7 M& G. T& L% W) p# i9 z
  9.                buf = GUI_ALLOC_h2p(hMem);- o% Z( Q' D% O% p
  10.                read(fd,buf,file_state.st_size);
    , ^4 J8 _# V9 @: n6 Q8 W; n
  11.                close(fd);
    / @- j! k* z4 _6 E* F, [
  12.                GUI_DrawStreamedBitmapAuto(buf,100,100);
    7 c7 S+ e) M& I9 v
  13.                GUI_ALLOC_Free(hMem);
    * g0 E" _' I8 ^+ I8 D
  14.       }</p>}
复制代码
开始执行open时fd的值一直为0xFFFF,当循环执行好多次后fd才会变成正常的序号,
- g' O! K6 w* y3 _# z( |$ W我试着open之前加一些延时,这样可以第一次执行open后 fd值就是正确的* G# c  N; I1 K, p; o

- ^1 d7 G) p: y! ?我想问一下,是我的程序问题,还是这个函数有问题,
. S7 T' \  u1 S) A- Q不知道有没有遇到过这种问题的大哥
0 s: z9 K6 d8 B5 C  e  R

最佳答案

查看完整内容

按照你的描述 猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-5-9 22:49:19 | 显示全部楼层
刚注意到SD挂载程序,是先延时再挂载# W9 F; R* f9 u1 a' F
  1. void sd_mount(void *parameter)' r5 `) V3 b6 P+ H
  2. {
    " R; Q; c' h9 i9 e- |7 w4 j
  3.     while (1)0 I; m: k! D7 g
  4.     {
    & H3 a) z8 K5 e9 C# s0 C7 N
  5.         rt_thread_mdelay(500);) s0 c! H* ]& |+ B4 _2 k
  6.         if(rt_device_find("sd0") != RT_NULL)
    , r: v9 Y+ U1 q. n
  7.         {
    4 r6 f/ O& T$ Z# p/ q& g5 Q# h8 Y
  8.             if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK)! @2 x2 n+ F9 I, |2 `3 g
  9.             {
    + ]4 F0 n/ [3 j- r
  10.                 LOG_I("sd card mount to '/'");
    : ^) A5 j- s- \- ]) Y5 f0 s
  11.                 break;
    + }/ `! I7 v: I  s' o! c
  12.             }3 q* _+ n" Q* U. G. O7 W
  13.             else
    5 F9 b! h6 ~  ?# K" C
  14.             {$ t* t$ W: u1 t
  15.                 LOG_W("sd card mount to '/' failed!");) X: V: J$ F2 q
  16.             }! K$ ^$ f) T- X8 P2 b4 E( p
  17.         }  N& y/ C' \3 j
  18.     }
    4 M/ m- k5 g7 j; }
  19. }
复制代码

" x' }2 u' P0 B我想先挂载再使用延时函数试试吧
使用道具 举报 回复
发表于 2019-5-9 22:40:03 | 显示全部楼层
whj467467222 发表于 2019-5-9 18:450 T& A9 }- W- F% z
从这几个方面查找问题:5 ]& X: U# Y+ E: R4 n/ A; O
1,文件系统什么时候初始化的,! N8 F/ C% h1 u6 V6 D# w* y+ I+ ?8 C
2,什么时候SD卡挂载的文件系统

# K9 s' {% O" q$ G3 ]" q. z好的,谢谢。
使用道具 举报 回复
发表于 2019-5-9 22:39:08 | 显示全部楼层
jhb 发表于 2019-5-9 18:06& ^$ H1 z% V9 t4 ?' z; D
按照你的描述  猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成 ...
, N# P" c  @  w6 W( B9 h
谢谢,我觉得应该是,5 c# f; T2 F$ r6 U1 J( b( x
  1. INIT_APP_EXPORT(stm32_sdcard_mount);
复制代码
' B$ _$ [( B; C6 ~, _
回头把初始化提前一些试试
使用道具 举报 回复
发表于 2019-5-9 18:45:50 | 显示全部楼层
从这几个方面查找问题:
& m* H6 u/ \# S9 d6 q' Z1 v1,文件系统什么时候初始化的,
4 Q% @0 m- T/ m) @5 ^+ O) G: a, Q2,什么时候SD卡挂载的文件系统
7 A) I# j; h; d7 D* k) t+ Y2 T3,你什么时候使用open打开的文件
使用道具 举报 回复
发表于 2019-5-9 15:09:24 | 显示全部楼层
按照你的描述  猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

Powered by RT-Thread

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