
100分 请教关于VC6.0对磁盘扇区读写的问题
我们用单片机在不带文件系统的SD卡的第十个扇区写了些数据,用PC机读取SD卡的第十个扇区却不是那些数据,程序如下,我想知道单片机指的第十扇区和PC机指的第十扇区是不是同一...
我们用单片机在不带文件系统的SD卡的第十个扇区写了些数据,用PC机读取SD卡的第十个扇区却不是那些数据,程序如下,我想知道单片机指的第十扇区和PC机指的第十扇区是不是同一个扇区,如果不是该如何解决,希望能够有针对性的回答不要复制大篇幅的文章,谢谢
BOOL CSDDlg::ReadSectors(char bDrive, DWORD dwStartSector, WORD wSectors, LPBYTE lpSectBuff)
{
char devName[] = "\\\\.\\A:";
devName[4] =bDrive;
HANDLE hDev=CreateFile(devName, GENERIC_READ, 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=ReadFile(hDev,lpSectBuff,512*wSectors,&dwCB,NULL);
CloseHandle(hDev);
return bRet;
}
金毛狮王2007 说的我听得不是很明白,“读取SD卡的扇区0到buf”怎么读啊,用我那个函数可以吗?
我已经发现用我的这个读取扇区的函数读取的是逻辑扇区,和SD卡的实际物理扇区相差63,也就是说用我的这个函数读取0扇区时,实际上读的是SD卡的物理扇区63,我该如何才能访问到SD卡的物理0扇区呢,有些晕了 展开
BOOL CSDDlg::ReadSectors(char bDrive, DWORD dwStartSector, WORD wSectors, LPBYTE lpSectBuff)
{
char devName[] = "\\\\.\\A:";
devName[4] =bDrive;
HANDLE hDev=CreateFile(devName, GENERIC_READ, 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=ReadFile(hDev,lpSectBuff,512*wSectors,&dwCB,NULL);
CloseHandle(hDev);
return bRet;
}
金毛狮王2007 说的我听得不是很明白,“读取SD卡的扇区0到buf”怎么读啊,用我那个函数可以吗?
我已经发现用我的这个读取扇区的函数读取的是逻辑扇区,和SD卡的实际物理扇区相差63,也就是说用我的这个函数读取0扇区时,实际上读的是SD卡的物理扇区63,我该如何才能访问到SD卡的物理0扇区呢,有些晕了 展开
展开全部
即使SD卡没有文件系统,也可以有分区。也就是说在sd盘的开始出会有分区表。
读取SD卡的扇区0到buf。如果buf[0]不是0xEB或者0xE9,说明这是一个分区表。buf[454]开始的四个byte是该分区前的扇区数。例如63表示在这个分区前有63个扇区,那么这个分区的第一个扇区就是扇区63。buf[458]开始的四个byte是该分区的扇区数。例如7990000,不是这个分区有7990000个扇区。那么这个分区的块地址就是63~7990063。
一个设备可以最多有四个分区,其他三个分区的相关数据是在buf[470]/buf[474],buf[486]/buf[490],buf[502]/buf[506]。
注意,读取buf的时候检查最好两位,应该是55AA。
你只贴出了一段代码,看的不是很清楚,理论上是行的。我手上没单片机,有块ARM,大家一起切磋啊
读取SD卡的扇区0到buf。如果buf[0]不是0xEB或者0xE9,说明这是一个分区表。buf[454]开始的四个byte是该分区前的扇区数。例如63表示在这个分区前有63个扇区,那么这个分区的第一个扇区就是扇区63。buf[458]开始的四个byte是该分区的扇区数。例如7990000,不是这个分区有7990000个扇区。那么这个分区的块地址就是63~7990063。
一个设备可以最多有四个分区,其他三个分区的相关数据是在buf[470]/buf[474],buf[486]/buf[490],buf[502]/buf[506]。
注意,读取buf的时候检查最好两位,应该是55AA。
你只贴出了一段代码,看的不是很清楚,理论上是行的。我手上没单片机,有块ARM,大家一起切磋啊
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询