writefile()调用成功,但是实际写入字节数是0,高手请教!!

suzhbruce 2010-07-05 03:13:58
环境: wince6.0 R3 + s3c6410 + ARM11
问题: 应用程序做SD卡(1GB)读写时,调用writefile(hdevice,&sg_req,sizeof(SG_REQ),&actwrite,NULL)
返回0x00000001即调用成功,但是实际写入字节数actwrite为0 ?

另外,试着用DeviceIoControl写入数据,可是只能单块写入成功,即SG_REQ结构体中sectors的数目只有设置为1   时函数成功返回(应用中pbuffer设为8192);DeviceIoControl(hdevice,IOCTL_DISK_WRITE,&sg_req,sizeof(SG_REQ),NULL,0,&actwrite,NULL); sectors的数目设置2,3,4...16即多块写入时都失败,GetLastError()为0x00000017或是0x0000001f ?

更糟糕的是用CreatFile(L"\\Storage Card\VOL:", , , ,)打开SD卡,再用DeviceIoControl()写入数据时,
总是返回失败.错误码0x00000057, ,请问各位指教? 
...全文
1271 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
当我遇上-你 2011-03-29
  • 打赏
  • 举报
回复
DeviceIoControl()中接受参数的方式和返回的方式要在应用中相对应的才可以,LZ好好看下驱动怎么做的
andy83364865 2011-03-29
  • 打赏
  • 举报
回复
我读SD卡时也是这样,用writefile函数而输入的长度是sizeof(buffer),然后writefile返回值是0,用getlasterror()函数来获取,错误码是87,然后我吧输入的长度改为512(固定值),结果就可以输入了。。
阿振 2010-11-03
  • 打赏
  • 举报
回复
我现在也遇到这样的问题,不过我敢保证的是,在mobile下可以用的代码在winCE下失败。
jison924 2010-10-09
  • 打赏
  • 举报
回复
需要答案,顶起
别问了 2010-09-14
  • 打赏
  • 举报
回复
楼主可以先拷贝一个文件到Storage card中看是否正常,判断sd卡驱动有没有问题?
另外,在把CreateFile的写文件的路径改为FLASH,判断CreateFile有没有问题。
alexwang81 2010-09-11
  • 打赏
  • 举报
回复
楼主的搞定了吗?
johnson-ji 2010-07-08
  • 打赏
  • 举报
回复
不会也要 顶顶
suzhbruce 2010-07-08
  • 打赏
  • 举报
回复
贴上我的代码:
//hDevice = CreatFile(L"DSK2:",GENERIC_READ | GENERIC_WRITE,

// FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,

// OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

hDevice = CreatFile(L"\\Storage Card\\VOL:",GENERIC_READ | GENERIC_WRITE,

FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,

OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if( INVALID_HANDLE_VALUE == hDevce | NULL == hDevice)

{
printf(“CreatFile failed!\r\n");
return -1;
}

BYTE pBuffer[8192] = {0};
static const byte cmd[5] = {0x2A,0X4D,0x4D,0x43,0x2A};
DWORD st;
unsigned long output = 0;
memcpy(pBuffer,cmd,5);
SG_REQ sr = {4,16,1,ERROR_SUCCESS,0,{pBuffer,16*512}};

//SG_REQ sr = {4,1,1,ERROR_SUCCESS,0,{pBuffer,1*512}};

st = DeviceIoControl(hDevice,IOCTL_DISK_WRITE,&sr,sizeof
(SG_REQ),NULL,0,&output,NULL);

//st = WriteFile(hDevice,&sr,sizeof(SG_REQ),&output,NULL);

if(!st)
{
printf("IOCTL_DISK_WRITE failed",GetLastError());
return -1;
}

以上代码CreatFile(L"\\Storage Card\\VOL:",,,,)可以获得句柄,但是DeviceIoControl()返回
失败,GetLastError为0x57——参数错误,仔细检查没有参数错啊,很怪...!!
改用WriteFile()方式,同样返回失败,GetLastError为0x57.

使用CreatFile(L"DSK2:",,,,)方式也可以获得句柄,调用DeviceIoControl()只能写入单个sector
成功返回,即如上我描述的问题:多个sectors写入就失败。
再次启用WriteFile()方式,即如上我描述的问题:成功返回,但是实际写入字节数output为0.
请各位多多指教,感谢!!
AMOROUS 2010-07-08
  • 打赏
  • 举报
回复
sd驱动的写操作出错了返回了?
suzhbruce 2010-07-08
  • 打赏
  • 举报
回复
IOcode和应用中的一致,谢谢!!
Linux_lee 2010-07-08
  • 打赏
  • 举报
回复
有驱动源码的话,看看驱动中的IOcode是否和你应用中的一致
91program 2010-07-07
  • 打赏
  • 举报
回复
先拿代码来分析,如果代码没有错误,再找驱动的问题
harkspan 2010-07-07
  • 打赏
  • 举报
回复
0x00000057表示ERROR_INVALID_PARAMETER,可能某个参数不合法
suzhbruce 2010-07-07
  • 打赏
  • 举报
回复
感谢大家的关注,我的代码中实际上是CreatFile(L"\\Storage Card\\VOL:", , , ,),
以上是在贴的时候手误, 按照这种方式也是可以得到句柄的,好像有人说过它获得的是文件句柄,不是设备句柄.
harkspan 2010-07-07
  • 打赏
  • 举报
回复
楼主看下是不是这个原因:
CreatFile(L"\\Storage Card\\VOL:", , , ,)
suzhbruce 2010-07-07
  • 打赏
  • 举报
回复
请问各位有具体的解释或是方法吗?
winceARM 2010-07-05
  • 打赏
  • 举报
回复
这种情况比较多,我也碰到过,多半是你的驱动有问题,你需要在你的驱动加入打印信息,才能够知道问题所在。

19,524

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧