文件读取问题

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

5金钱
现在使用RT的文件管理,想从SD卡读取文件,挂载都没有问题+ D5 H0 f$ L) p
但是使用open函数时好像有点不太对. U! ]. [2 S! E* a/ v- T
  1. void pic(char *path)! v  `9 m- b- d: J1 k! D4 V
  2. {9 B: w4 ^! ]6 s. @9 W
  3. <p style="line-height: 30px; text-indent: 2em;">int fd;3 Q4 k8 b( i: r. M) N" A
  4.        fd = open(path,O_RDONLY);
    ! l' i0 G2 v) _1 j  Q2 `
  5.        if(fd>=0)
    / @# e" \4 X1 n: D
  6.        {4 W5 N( ]3 x$ v$ R& h" _; [) \
  7.                fstat(fd,&file_state);
    9 Q( _9 e8 Q1 s  |+ `9 ?
  8.                hMem = GUI_ALLOC_AllocZero(512*1024);
    % H7 z1 N- F1 d% O- k" F  o
  9.                buf = GUI_ALLOC_h2p(hMem);8 u0 M$ O- u( E
  10.                read(fd,buf,file_state.st_size);0 y. b" i4 e. f4 Z5 H, W, l
  11.                close(fd);% q5 V; M, N. G& v3 Y
  12.                GUI_DrawStreamedBitmapAuto(buf,100,100);
    5 b- ^9 @6 K. M& J
  13.                GUI_ALLOC_Free(hMem);5 s, @5 m7 F3 T. T$ W6 N
  14.       }</p>}
复制代码
开始执行open时fd的值一直为0xFFFF,当循环执行好多次后fd才会变成正常的序号,
9 ?# f3 ]% K0 Y% i& E+ K我试着open之前加一些延时,这样可以第一次执行open后 fd值就是正确的
& e$ ~' n2 g$ [5 ?3 M6 S) ]- m9 U7 _) ?' U' P8 A
我想问一下,是我的程序问题,还是这个函数有问题,9 h  j8 l9 Q0 K/ x$ {
不知道有没有遇到过这种问题的大哥) m& |; E8 J9 |2 [; G+ j+ t4 K

使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-5-9 18:06:03 | 显示全部楼层
按照你的描述  猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成
使用道具 举报 回复
发表于 2019-5-9 18:45:50 | 显示全部楼层
从这几个方面查找问题:7 D$ P: J' ~  s0 q
1,文件系统什么时候初始化的,
9 l! r% p9 k/ W. l: I1 L+ y9 z- R2,什么时候SD卡挂载的文件系统
0 Z! A3 ]8 _  T! {$ C  \3,你什么时候使用open打开的文件
使用道具 举报 回复
发表于 2019-5-9 22:39:08 | 显示全部楼层
jhb 发表于 2019-5-9 18:06
# E- I  O7 r# F- F# ^+ c按照你的描述  猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成 ...
. b, ^3 P8 W6 N3 t
谢谢,我觉得应该是,2 w) D7 h  h, J$ [- ?
  1. INIT_APP_EXPORT(stm32_sdcard_mount);
复制代码
6 C% y  o$ [7 I4 i9 ^
回头把初始化提前一些试试
使用道具 举报 回复
发表于 2019-5-9 22:40:03 | 显示全部楼层
whj467467222 发表于 2019-5-9 18:451 a2 \2 W: t; T* e
从这几个方面查找问题:
5 s; r, r; Y9 t+ \4 \+ B$ j3 e3 i1,文件系统什么时候初始化的,
5 t/ q- k, w+ e; u8 J  G2,什么时候SD卡挂载的文件系统

2 S0 u& a4 D* Z* E5 O/ o" Q好的,谢谢。
使用道具 举报 回复
发表于 2019-5-9 22:49:19 | 显示全部楼层
刚注意到SD挂载程序,是先延时再挂载! M( e6 ]' w- u, w/ u1 i# P8 b
  1. void sd_mount(void *parameter)
    8 l, g3 q/ Y+ e3 p, T
  2. {8 C9 S# q2 s1 X# x
  3.     while (1)/ f( p, |% H: l
  4.     {
    % @+ z, z7 |9 x
  5.         rt_thread_mdelay(500);
    / }' o/ x" \" Y/ U- V
  6.         if(rt_device_find("sd0") != RT_NULL)
    3 j2 k& F8 h7 I3 A- o* c
  7.         {
    " b5 ^# m; n6 V5 [) U9 |7 c2 x
  8.             if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK)( y& M  b4 n5 z3 S9 l7 [$ H% B
  9.             {: g/ k" _8 q4 u: l9 s4 B+ @: `
  10.                 LOG_I("sd card mount to '/'");4 H+ f2 }. r: ~. y. g8 {* b' `4 W& B
  11.                 break;+ I. y, }2 ]9 L9 V
  12.             }
    . _5 C" N- m* P! t5 v  q. g; w
  13.             else0 K& Q) {; C& ~1 W+ f
  14.             {
    1 Z. _& i* L6 U3 k" |" e
  15.                 LOG_W("sd card mount to '/' failed!");
    0 `1 [6 I% m! ^7 v' I$ K
  16.             }# y& C0 E# l. ?- Y+ P
  17.         }
    # z3 p0 c( F/ l' D
  18.     }
    2 s1 a0 {3 C+ j
  19. }
复制代码
9 {! f  s- ?! L7 E2 ~
我想先挂载再使用延时函数试试吧
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区  

© 2013-2017 上海睿赛德电子科技有限公司 沪ICP备13014002号-1

Powered by RT-Thread

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