OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4810|回复: 5

我想把c936以bin文件的形式放进sd卡里,然后就有问题了

[复制链接]

47

主题

255

帖子

1

精华

高级会员

Rank: 4

积分
641
金钱
641
注册时间
2012-11-3
在线时间
6 小时
发表于 2013-6-5 23:44:53 | 显示全部楼层 |阅读模式

以下是我修改的函数            

WCHAR ff_convert (WCHAR src,UINT dir)
{
 //const WCHAR *p;//typedef unsigned short WCHAR;
 WCHAR c;    //typedef unsigned short WCHAR;
 int i, n, li, hi;
 FIL f_u2gb;
 FILINFO finfo1;
 WCHAR t[2];
 u32 gbk2uni_offset=0;

 UINT br1;
 u8 buffer[4];
 //u16 table[2];

 if(f_open(&f_u2gb,"c936.bin",FA_READ)==0)//打开c936.bin
  printf("f_open_c936.bin_ok\r\n");//返回成功打开文件标志
 else
  printf("f_open_c936.bin_error\r\n");//返回成功打开文件标志
 if(f_stat("c936.bin", &finfo1)==0) //能够获取c936.bin的大小
  printf("c936.bin_size%d\r\n",finfo1.fsize);//返回文件的大小byte

 if (src < 0x80)/* ASCII集 不用转换*/
 { 
  c = src;
 }
 else
 {
  if (dir)/* OEMCP to unicode */
  {
   gbk2uni_offset=finfo1.fsize/2;  
  }
  else/* Unicode to OEMCP */
  {
   gbk2uni_offset=0;  
  }
  hi=finfo1.fsize/2;//对半开.
  hi =hi / 4 - 1;
  li = 0;
  for (n = 16; n; n--)
  {
   i = li + (hi - li) / 2;
   f_read(&f_u2gb, buffer, sizeof(buffer),&br1);

   t[0]=(buffer[1]<<8)+buffer[0];
   t[1]=(buffer[3]<<8)+buffer[2];

   if (src == t[0]) break;
   if (src > t[0])
    li = i;
   else
    hi = i;
  }
  c = n ? t[1] : 0;
 }
 f_close(&f_u2gb);  //不论是打开,还是新建文件,一定记得关闭
 return c;
}

我主函数就干了些这个,把q.txt 的信息读回来,然后进行显示。

 res = f_stat("q.txt", &finfo); //读取 folder 目录下 newname.txt 文件的信息
 if( res )
  printf("q.txt err : %d\r\n", res);
 else
 {
  printf("q.txt size : %lu\r\n",finfo.fsize);
  printf("fdate : %d\r\n",finfo.fdate);
  printf("ftime : %d\r\n",finfo.ftime);
  printf("fattrib : %d\r\n",finfo.fattrib);
 }   这是主函数的东西


 

然后我屏蔽上面红色的部分,主函数执行正常,返回q.txt 正确的信息,当不屏蔽红色部分,那么程序就会卡死,卡死在

if(f_open(&f_u2gb,"c936.bin",FA_READ)==0)//打开c936.bin

这里

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

47

主题

255

帖子

1

精华

高级会员

Rank: 4

积分
641
金钱
641
注册时间
2012-11-3
在线时间
6 小时
 楼主| 发表于 2013-6-5 23:45:24 | 显示全部楼层
回复【楼主位】liyanchao153:
---------------------------------
色盲。。。
回复 支持 反对

使用道具 举报

47

主题

255

帖子

1

精华

高级会员

Rank: 4

积分
641
金钱
641
注册时间
2012-11-3
在线时间
6 小时
 楼主| 发表于 2013-6-6 00:03:20 | 显示全部楼层

   if(f_open(&f_u2gb,"c936.bin",FA_READ)==0)//打开c936.bin
  printf("f_open_c936.bin_ok\r\n");//返回成功打开文件标志
 else
  printf("f_open_c936.bin_error\r\n");//返回成功打开文件标志
 if(f_stat("c936.bin", &finfo1)==0) //能够获取c936.bin的大小
  printf("c936.bin_size%d\r\n",finfo1.fsize);//返回文件的大小byte


 

把这几句话放在主函数里面居然就好了,不要放在WCHAR ff_convert (WCHAR src,UINT dir)这里面,也不知道为啥子?接着检查

回复 支持 反对

使用道具 举报

47

主题

255

帖子

1

精华

高级会员

Rank: 4

积分
641
金钱
641
注册时间
2012-11-3
在线时间
6 小时
 楼主| 发表于 2013-6-6 00:10:00 | 显示全部楼层
回复【3楼】liyanchao153:
---------------------------------
但是操作文件名  是汉字的就不行了 res = f_stat("哈哈哈.txt", &finfo);   返回错误值res =6;
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-6 00:27:26 | 显示全部楼层
请先验证你的UNIGBK转换码表,是否真的起到作用了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

47

主题

255

帖子

1

精华

高级会员

Rank: 4

积分
641
金钱
641
注册时间
2012-11-3
在线时间
6 小时
 楼主| 发表于 2013-6-6 00:38:58 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
好了   是我这个函数WCHAR ff_convert (WCHAR src,UINT dir)的这个 f_read(&f_u2gb, buffer, sizeof(buffer),&br1);没处理对,地址没有偏移,很感谢原子哥的例程。

应该改成这两句   
f_lseek(&f_u2gb,i*4+gbk2uni_offset);
f_read(&f_u2gb,buffer,4,&br1);
整理好了  会传上来的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-19 02:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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