智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 23445|回复: 13
打印 上一主题 下一主题

SD卡多扇区读写与PC读取SD卡扇区数据

  [复制链接]

21

主题

277

帖子

0

精华

版主

Rank: 9Rank: 9Rank: 9

积分
5728
威望
2165
贡献
1155
兑换币
609
注册时间
2009-3-1
在线时间
1204 小时
跳转到指定楼层
1#
发表于 2012-4-11 13:03:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 vic_hong 于 2012-4-11 13:07 编辑

        有人问我关于PC机读SD卡扇区的资料,我就顺便发个帖子吧。
        我觉得文件系统始终是在SD卡基本读写操作上再加上一层包装,速度绝对不会比直接读写扇区快的,但是慢多少我也没测过。
        对于单片机读写SD卡已经有很多资料了,也比较简单。不过SD卡读写也是有窍门的。现有的大部分SD卡读写函数,都是单扇区读写的。而读写的主要时间大部分消耗在读写命令上,如果调用循环读写,会比较慢。实际上SD卡有一个多扇区读写命令,可以提高读写效率。可以参考以下网址:

        回到PC读SD卡扇区的问题。其实网上资料也很多,也比较简单。通过 WriteSectors实现扇区写入,ReadSectors实现扇区读取。这里使用Visual C++6.0。
        BOOL WriteSectors(BYTE bDrive, unsigned long dwStartSector, unsigned long wSectors, LPBYTE lpSectBuff)
       第一个参数bDrive是硬盘号。假如你的电脑只有一个硬盘(注意与分区不一样,一个硬盘有多个分区),那么你的第一个移动硬盘号就是1。   稍微调试一下就知道了。
       第二个参数dwStartSector是起始扇区号
       第三个参数wSectors是读取的扇区数
       第四个参数lpSectBuff是数据存储指针。比如 BYTE *bBuf=new BYTE[1000]; 第四个参数可以放bBuf,需要注意的是分配的空间大小,至少应该是 wSectors*512个byte。
BOOL ReadSectors(BYTE bDrive, unsigned long dwStartSector, unsigned long wSectors, LPBYTE lpSectBuff)
这是读取函数,参数与WriteSectors是一样的。
      还需要注意的是sd卡要以移动硬盘方式接入PC,此方法不适用于笔记本电脑上自带读卡器。还有PC机上也尽量多扇区读写,就是wSectors尽量大。尽量少用循环读取,你可以看到很明显的差距。
      下面是两个函数的具体实现:
BOOL WriteSectors(BYTE bDrive, unsigned long dwStartSector, unsigned long wSectors, LPBYTE lpSectBuff) {
// 对磁盘扇区数据的写入
if(bDrive==0)return 0;//还是保护一下好。。写到自己硬盘上就。。。
char devName[] = "\\\\.\\PHYSICALDRIVE2";//硬盘号,注意和分区不一样
devName[strlen(devName)-1]=bDrive+'0';
HANDLE hDev = CreateFile(devName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE) return 0;
SetFilePointer(hDev, 512 * dwStartSector, 0, FILE_BEGIN);
DWORD dwCB;
BOOL bRet = WriteFile(hDev, lpSectBuff, 512 * wSectors, &dwCB, NULL);
CloseHandle(hDev);
return bRet;
}

BOOL ReadSectors(BYTE bDrive, unsigned long dwStartSector, unsigned long wSectors, LPBYTE lpSectBuff){
// 对磁盘扇区数据的读取
if (bDrive == 0) return 0;
char devName[] = "\\\\.\\PHYSICALDRIVE2";
devName[strlen(devName)-1]=bDrive+'0';
HANDLE hDev = CreateFile(devName, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE) return 0;
long pointer;
long phigh;
pointer = dwStartSector;
pointer = pointer<<9;
phigh = pointer>>32;
SetFilePointer(hDev,(unsigned long)pointer,&phigh,FILE_BEGIN);
//SetFilePointer(hDev, 512 * dwStartSector, ((unsigned long)512 * dwStartSector)>>32, FILE_BEGIN);
DWORD dwCB;
BOOL bRet = ReadFile(hDev, lpSectBuff, 512 * wSectors, &dwCB, NULL);
CloseHandle(hDev);
return bRet;
}
                                                                                                                                           2012-4-11 by vizone

59

主题

1029

帖子

0

精华

版主

有什么需帮助的?

Rank: 9Rank: 9Rank: 9

积分
15163

热心会员奖章论坛元老奖章优秀会员奖章在线王奖章

威望
11088
贡献
1415
兑换币
1728
注册时间
2011-12-18
在线时间
1330 小时
2#
发表于 2012-4-11 13:35:39 | 只看该作者
好贴,顶了。
回复 支持 反对

使用道具 举报

21

主题

242

帖子

0

精华

版主

Rank: 9Rank: 9Rank: 9

积分
21776

论坛元老奖章

威望
6392
贡献
14778
兑换币
90
注册时间
2010-12-4
在线时间
303 小时
3#
发表于 2012-4-28 18:16:29 | 只看该作者
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1439
威望
793
贡献
430
兑换币
295
注册时间
2012-1-18
在线时间
108 小时
4#
发表于 2012-10-20 21:47:34 | 只看该作者
不得不说,这是个好东西
回复 支持 反对

使用道具 举报

17

主题

346

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2686
威望
1368
贡献
610
兑换币
505
注册时间
2011-8-27
在线时间
354 小时
5#
发表于 2012-11-20 22:26:00 | 只看该作者
问一下,写多块会比写单块速度快吗?我们现在是写单块,速度在1.5ms这样一个扇区,想把时间缩短至毫秒级别,有办法吗?
回复 支持 反对

使用道具 举报

17

主题

346

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2686
威望
1368
贡献
610
兑换币
505
注册时间
2011-8-27
在线时间
354 小时
6#
发表于 2012-11-20 22:26:30 | 只看该作者
特别紧急的事情,希望帮帮忙提些意见。。目前陷入瓶颈中了
回复 支持 反对

使用道具 举报

21

主题

277

帖子

0

精华

版主

Rank: 9Rank: 9Rank: 9

积分
5728
威望
2165
贡献
1155
兑换币
609
注册时间
2009-3-1
在线时间
1204 小时
7#
 楼主| 发表于 2012-11-20 23:50:37 | 只看该作者
庞七七 发表于 2012-11-20 22:26
问一下,写多块会比写单块速度快吗?我们现在是写单块,速度在1.5ms这样一个扇区,想把时间缩短至毫秒级别, ...

以前测过XS128写普通的TF卡单块也就是那个速度。多块是会快的,因为初始化占用的时间比较长,多块可以避免一些初始化。由于XS128RAM的原因我只试过写9块,有没有1ms以内我没测过,但的确比单独写9块来得快。你用电脑端的SD卡速度测试软件试试就知道了,写的块越大速度越快。
回复 支持 反对

使用道具 举报

17

主题

346

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2686
威望
1368
贡献
610
兑换币
505
注册时间
2011-8-27
在线时间
354 小时
8#
发表于 2012-11-21 08:58:38 | 只看该作者
vic_hong 发表于 2012-11-20 23:50
以前测过XS128写普通的TF卡单块也就是那个速度。多块是会快的,因为初始化占用的时间比较长,多块可以避免 ...

我们每次程序周期只需要写4,5个数,所以写多块也很浪费了,目前我们块大小为4,速度还是没快多少。
回复 支持 反对

使用道具 举报

21

主题

277

帖子

0

精华

版主

Rank: 9Rank: 9Rank: 9

积分
5728
威望
2165
贡献
1155
兑换币
609
注册时间
2009-3-1
在线时间
1204 小时
9#
 楼主| 发表于 2012-11-21 12:32:24 | 只看该作者
庞七七 发表于 2012-11-21 08:58
我们每次程序周期只需要写4,5个数,所以写多块也很浪费了,目前我们块大小为4,速度还是没快多少。

你的块大小是4,然后竟然写了1.5ms?我写的单块的512byte的。多块的意思是在程序开始时初始化多块的设置,然后写一个扇区,写一个扇区。。最后设置结束就行了。而单块的意思是初始化,写数据,结束。这中间必然浪费很多时间。可以在RAM上把数存起来,存够512byte后一次性写入,用多块的方式写,应该少于1.5ms。
回复 支持 反对

使用道具 举报

7

主题

85

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
威望
569
贡献
310
兑换币
299
注册时间
2012-10-29
在线时间
94 小时
10#
发表于 2012-12-11 10:15:36 | 只看该作者
多扇区写入,是用的 25号命令吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-26 13:24 , Processed in 0.102682 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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