文件读取问题

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

5金钱
现在使用RT的文件管理,想从SD卡读取文件,挂载都没有问题: J  ]1 U0 a3 f" ^
但是使用open函数时好像有点不太对
2 k' O" r- [2 P( @& i3 i  \0 b. c
  1. void pic(char *path)
    # z" {( w* H$ Z4 b# o* c
  2. {# f' y7 b& c. {; r3 I
  3. <p style="line-height: 30px; text-indent: 2em;">int fd;
    ( R  K& L; ?( b2 U# m$ s9 u
  4.        fd = open(path,O_RDONLY);
    ) s5 w- L% m/ ^9 G$ H4 |! F& H3 X
  5.        if(fd>=0)$ |. _7 @& k) {7 G0 f+ R0 |9 y/ H1 d6 V
  6.        {
    + O# D0 c" r& P' j- X4 f8 a
  7.                fstat(fd,&file_state);
    - ~. E! G* c* v( W, x( Z2 j
  8.                hMem = GUI_ALLOC_AllocZero(512*1024);
    1 l0 i" @% _3 d! R5 G  c
  9.                buf = GUI_ALLOC_h2p(hMem);# {) S: x% Y& t$ f, p4 f: D
  10.                read(fd,buf,file_state.st_size);: l* t' b% r, d" o. [' q3 `
  11.                close(fd);! @" {1 Y  G2 u# {( G. Y
  12.                GUI_DrawStreamedBitmapAuto(buf,100,100);+ t4 F7 n( ?) G+ e; U. }
  13.                GUI_ALLOC_Free(hMem);3 W9 b. D9 {, i- h( _. Q( s
  14.       }</p>}
复制代码
开始执行open时fd的值一直为0xFFFF,当循环执行好多次后fd才会变成正常的序号,/ m$ m3 A# f$ J& B/ B* Q
我试着open之前加一些延时,这样可以第一次执行open后 fd值就是正确的
* ?# m- {. Y( j7 d
* m, Q; a( z2 R我想问一下,是我的程序问题,还是这个函数有问题,
$ s# W' m" H! U$ D6 P9 d不知道有没有遇到过这种问题的大哥
' X% [7 d1 k' c- K6 j

最佳答案

查看完整内容

按照你的描述 猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-5-9 15:09:24 | 显示全部楼层
按照你的描述  猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成
使用道具 举报 回复
发表于 2019-5-9 18:45:50 | 显示全部楼层
从这几个方面查找问题:
& z0 a2 V9 j( }& l* ~1,文件系统什么时候初始化的,( f# ]* o. K( S! L; E
2,什么时候SD卡挂载的文件系统
8 }! [1 r. F' a) P/ `, I& C3,你什么时候使用open打开的文件
使用道具 举报 回复
发表于 2019-5-9 22:39:08 | 显示全部楼层
jhb 发表于 2019-5-9 18:06& o( \% N8 r' x0 Q( O: b+ ~
按照你的描述  猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成 ...

% W; z2 c1 n+ }  L谢谢,我觉得应该是,
; |3 P, z0 L/ ~1 A1 D# w$ Q7 {
  1. INIT_APP_EXPORT(stm32_sdcard_mount);
复制代码
' ]: P4 O9 X2 m; }$ c
回头把初始化提前一些试试
使用道具 举报 回复
发表于 2019-5-9 22:40:03 | 显示全部楼层
whj467467222 发表于 2019-5-9 18:45& A- p* Q' ~& Q
从这几个方面查找问题:, E! J, j3 p- r( G7 f# n* u
1,文件系统什么时候初始化的,
7 o" S3 L5 |) h8 x+ h2,什么时候SD卡挂载的文件系统

7 z6 O3 ^% f% y1 a1 D好的,谢谢。
使用道具 举报 回复
发表于 2019-5-9 22:49:19 | 显示全部楼层
刚注意到SD挂载程序,是先延时再挂载7 N) H; X" E/ W! Y3 p, V; ]
  1. void sd_mount(void *parameter)
    , e0 ]4 ~+ I4 R4 I
  2. {
    % t( l4 G/ O% G3 r% D& }* r4 x  S5 ^
  3.     while (1)% n+ ^9 e3 e9 ]/ Q
  4.     {& ?2 S4 R$ I+ z' W+ {( g
  5.         rt_thread_mdelay(500);
    ( P+ r( Q9 f5 ~7 z9 v1 V: [/ R
  6.         if(rt_device_find("sd0") != RT_NULL)9 Z& N) X8 i* n# r7 a2 B
  7.         {5 i. w7 I+ m/ k# O7 W
  8.             if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK)) g' ?( s* x4 p$ x. x+ O/ U
  9.             {. A8 z6 S+ G- J, G/ N) s
  10.                 LOG_I("sd card mount to '/'");: x. A  C1 H7 m( @
  11.                 break;
    ; ?  q0 c( l$ L+ e0 }1 d
  12.             }
    ! ^1 b% R5 i7 u& S- L9 S" J
  13.             else0 F9 f/ n8 S: G- F! \
  14.             {
    5 W0 D2 b( T. W, j/ |
  15.                 LOG_W("sd card mount to '/' failed!");
    - ^# a3 i8 C. }# D$ z% i! F. t, r% \0 x
  16.             }
    9 |; w) @6 @. O3 J% t
  17.         }, h9 I9 p: I2 F
  18.     }
    7 Z9 N2 L: @6 Z' m5 X" N+ `1 I" g
  19. }
复制代码

, A3 j; X- c( \! Q我想先挂载再使用延时函数试试吧
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

Powered by RT-Thread

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