文件读取问题

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

5金钱
现在使用RT的文件管理,想从SD卡读取文件,挂载都没有问题
3 E0 N& Y' p) x* F. ?但是使用open函数时好像有点不太对
% I5 Y, x7 n7 v' n6 f/ G
  1. void pic(char *path): w: M4 O* w" G) E
  2. {# X! U: M6 }4 q$ l, c) }1 A
  3. <p style="line-height: 30px; text-indent: 2em;">int fd;
    7 \5 i; _: _" t. r3 G
  4.        fd = open(path,O_RDONLY);- s" [3 F2 l6 r9 n0 F# Z0 X5 R$ y
  5.        if(fd>=0)
    ! j  _/ |7 {$ G
  6.        {) T$ V* j( G! I* `1 _% H- B
  7.                fstat(fd,&file_state);
    ) E7 A# B% [5 _
  8.                hMem = GUI_ALLOC_AllocZero(512*1024);
    + G" i9 j! d0 U. y. [. J4 x- B
  9.                buf = GUI_ALLOC_h2p(hMem);
      A0 a# |& K& U" I: D
  10.                read(fd,buf,file_state.st_size);: o: _0 k' B" J. h" S1 @
  11.                close(fd);
    ! a9 I8 J+ ~6 K3 i
  12.                GUI_DrawStreamedBitmapAuto(buf,100,100);/ F" W' {$ v# n* r  |
  13.                GUI_ALLOC_Free(hMem);  F+ {: M/ _4 j/ t
  14.       }</p>}
复制代码
开始执行open时fd的值一直为0xFFFF,当循环执行好多次后fd才会变成正常的序号,4 F, p! z8 r& ~5 q. W
我试着open之前加一些延时,这样可以第一次执行open后 fd值就是正确的
0 p1 _  G6 Z% P# p+ V- I. d. A
$ ]0 k: h& X6 e/ \/ g4 L我想问一下,是我的程序问题,还是这个函数有问题,3 q$ q6 C0 y0 L% B9 Q$ l
不知道有没有遇到过这种问题的大哥
/ I6 k; a( X# L- J" N

使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-5-9 18:06:03 | 显示全部楼层
按照你的描述  猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成
使用道具 举报 回复
发表于 2019-5-9 18:45:50 | 显示全部楼层
从这几个方面查找问题:
: x9 Q0 i. X0 v1,文件系统什么时候初始化的,& L" N1 K1 @$ Q3 l6 u6 `+ z
2,什么时候SD卡挂载的文件系统0 Q9 e4 W' m3 n& C+ p' m
3,你什么时候使用open打开的文件
使用道具 举报 回复
发表于 2019-5-9 22:39:08 | 显示全部楼层
jhb 发表于 2019-5-9 18:062 S9 w1 u4 {5 Y
按照你的描述  猜测原因可能是在你读取的时候文件 文件系统还没有挂载完成 ...
# \/ {' L$ \) q
谢谢,我觉得应该是,
$ P+ I# g1 N) I7 T7 Q6 K. s
  1. INIT_APP_EXPORT(stm32_sdcard_mount);
复制代码

6 {1 f, X! u$ _9 \- c- x回头把初始化提前一些试试
使用道具 举报 回复
发表于 2019-5-9 22:40:03 | 显示全部楼层
whj467467222 发表于 2019-5-9 18:45
1 D4 T* i5 ^0 k; k. }8 V  t从这几个方面查找问题:
$ ]1 S7 s2 {$ i, o/ |1,文件系统什么时候初始化的,
; H' U0 f5 W/ A4 a. u/ G2,什么时候SD卡挂载的文件系统
1 C6 @( @7 }; h$ W
好的,谢谢。
使用道具 举报 回复
发表于 2019-5-9 22:49:19 | 显示全部楼层
刚注意到SD挂载程序,是先延时再挂载
$ E% |5 D. B( b4 O1 h
  1. void sd_mount(void *parameter)
    * T4 g1 a  Y! c
  2. {: T1 L! [. O" {1 \* R
  3.     while (1)
    " U- _5 \0 ~7 P% k( x
  4.     {& p' P% f3 M8 c& c- v; b. Q
  5.         rt_thread_mdelay(500);
    1 Q" x( R: s! a' {
  6.         if(rt_device_find("sd0") != RT_NULL). y: o. V1 B$ s
  7.         {
    * N* M; t9 U! D
  8.             if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK)+ A! G' w5 T; {: L4 I$ B
  9.             {
    ( p- K( P9 m2 M1 P5 Z3 E6 y
  10.                 LOG_I("sd card mount to '/'");/ d4 c  t9 I& a2 H/ }9 C
  11.                 break;; L- E3 U2 D  S  E4 q
  12.             }% Y/ |8 s! R, B3 |/ ~
  13.             else
    , A8 Z% [3 _* b! x6 S  ]4 W. l- L! Y! y
  14.             {6 }# y' d$ I: E/ s
  15.                 LOG_W("sd card mount to '/' failed!");
    $ o' W) ?6 V7 u5 x4 w9 W
  16.             }
    . r3 e: G) I9 l
  17.         }  M$ a4 t0 I4 p' ?& o
  18.     }
    . W$ Y4 x; r" O( j3 ?
  19. }
复制代码
; K4 `0 q% G1 W0 o" I9 X. \0 i
我想先挂载再使用延时函数试试吧
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

Powered by RT-Thread

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