文件读取问题

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

5金钱
现在使用RT的文件管理,想从SD卡读取文件,挂载都没有问题
! c% T8 @/ R9 }! V7 P1 B$ I$ K( {1 F1 ?但是使用open函数时好像有点不太对
( X! Y# c& V4 j- y  ?  X* H0 P% _0 z
  1. void pic(char *path); _. Y) t  d* N$ i
  2. {* W4 D* T- u; W: `* u- @& @! c! v
  3. <p style="line-height: 30px; text-indent: 2em;">int fd;. b0 `5 ^6 b/ g2 M7 Y
  4.        fd = open(path,O_RDONLY);4 U8 o" w& G: m
  5.        if(fd>=0)0 g5 F9 P% i- z& ^+ l3 {4 n
  6.        {
    3 v7 I. X+ P2 V4 D0 k
  7.                fstat(fd,&file_state);, q: P( u! A1 G$ u0 e/ ~  c
  8.                hMem = GUI_ALLOC_AllocZero(512*1024);
    % k3 i8 M" e6 F4 ~
  9.                buf = GUI_ALLOC_h2p(hMem);
    3 B1 e5 u: b# }- d; b- [
  10.                read(fd,buf,file_state.st_size);1 `, Y7 w6 g: d: |9 ~
  11.                close(fd);' R7 h/ p5 h* B( o
  12.                GUI_DrawStreamedBitmapAuto(buf,100,100);
    & x2 ^0 [: `; N( |, n  ~% C
  13.                GUI_ALLOC_Free(hMem);
    ; q$ i1 S" S# q5 z+ Y
  14.       }</p>}
复制代码
开始执行open时fd的值一直为0xFFFF,当循环执行好多次后fd才会变成正常的序号,( F- a$ W' g2 a) @
我试着open之前加一些延时,这样可以第一次执行open后 fd值就是正确的
# ~: o1 [: l. Z/ Q/ }2 j+ a# D3 X! u1 Q
我想问一下,是我的程序问题,还是这个函数有问题,
' f6 G) X( H/ D: X* I' g2 w不知道有没有遇到过这种问题的大哥+ a* o/ O1 x0 `. {& E2 V

最佳答案

查看完整内容

按照你的描述 猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-5-9 15:09:24 | 显示全部楼层
按照你的描述  猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成
使用道具 举报 回复
发表于 2019-5-9 18:45:50 | 显示全部楼层
从这几个方面查找问题:6 t" k- A& u$ O2 W# ?
1,文件系统什么时候初始化的,' X( ]/ l" v* g. X, I: }
2,什么时候SD卡挂载的文件系统) X' u; g% s0 o) E6 @+ E; @  A
3,你什么时候使用open打开的文件
使用道具 举报 回复
发表于 2019-5-9 22:39:08 | 显示全部楼层
jhb 发表于 2019-5-9 18:06% c( j0 |. z: a5 V- h- s
按照你的描述  猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成 ...
0 T; [; h. Z! c3 e: k+ D
谢谢,我觉得应该是,
& c: H# _0 o) ?- w  Y
  1. INIT_APP_EXPORT(stm32_sdcard_mount);
复制代码
  g! _! E/ ]$ @/ z4 y; }
回头把初始化提前一些试试
使用道具 举报 回复
发表于 2019-5-9 22:40:03 | 显示全部楼层
whj467467222 发表于 2019-5-9 18:455 A2 q) R8 e0 H% R: o
从这几个方面查找问题:
* q& ^6 M% a7 |- G# [1,文件系统什么时候初始化的,
5 Q3 Z5 o* F/ E# R2,什么时候SD卡挂载的文件系统
. [  Y0 l! P  o! D" g! V% ]1 s
好的,谢谢。
使用道具 举报 回复
发表于 2019-5-9 22:49:19 | 显示全部楼层
刚注意到SD挂载程序,是先延时再挂载7 v3 `* x$ x5 Q' g1 j
  1. void sd_mount(void *parameter)
    & P6 s# e  |* m* k9 K0 M) E, h0 h  R
  2. {+ x8 B2 R, _* g" d$ p* {
  3.     while (1)
    4 L* M" h* g+ r, s8 C' {+ @3 d" r
  4.     {' y0 I( [9 h) i5 S4 x$ K8 Z2 G
  5.         rt_thread_mdelay(500);
    % K; H+ e) ~8 q4 J
  6.         if(rt_device_find("sd0") != RT_NULL)- J6 p7 [5 A" J# C8 U7 o
  7.         {! }! c% Z3 w, r$ O6 f) x8 v0 L$ A
  8.             if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK)2 P  y# W& ^! R: J" A
  9.             {
    + \4 F3 K4 P! `1 `1 y- s4 v/ x1 d
  10.                 LOG_I("sd card mount to '/'");
    8 w6 U  O1 K4 G8 K6 g
  11.                 break;
    4 i, i& i: S$ B1 R: o
  12.             }- C6 |8 m* L  o+ n* p/ m$ {
  13.             else
    8 Y; r( N" C0 W/ v& V- g  i$ c$ W
  14.             {) o  x! |8 X" P
  15.                 LOG_W("sd card mount to '/' failed!");$ A1 P/ D! y/ a/ k( x0 k
  16.             }+ y5 z" c- d+ n( W& M( T) f" O, z
  17.         }
    5 t: e! j' y) z$ G1 v
  18.     }8 q  }8 D' F0 [4 D/ U
  19. }
复制代码
. Z4 f+ k3 j; t- `2 ?7 _
我想先挂载再使用延时函数试试吧
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  1. 7 主题
  2. 249 帖子
  3. 249 积分

Ta的主页 发消息

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

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

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

Powered by RT-Thread

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