极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 521|回复: 1

求助,关于arduino SD卡,能帮我看看程序吗,谢谢!

[复制链接]
发表于 2024-3-31 20:11:30 | 显示全部楼层 |阅读模式
想做一个从SD卡里的文件用拼音查询汉字的程序,但是File file=SD.open("1.txt",FILE_READ); 这一句只能写到递归函数里,写到初始化里在递归函数里就不能操作文件了,是什么情况?怎么改进呢?

以下是全部代码:
  1. #include<SD.h>

  2. #include<SPI.h>

  3. #include<String.h>

  4. unsigned long fileLength=0;//文件长度

  5. unsigned long poipos=0;//文件指针位置

  6. File file;

  7. String matchPinyin(String);

  8. String search(String,unsigned long,unsigned long);

  9. void setup() {

  10.   // put your setup code here, to run once:

  11.   Serial.begin(115200);

  12.   Serial.println(SD.begin(SPI_HALF_SPEED, 4));

  13.   File file=SD.open("1.txt",FILE_READ);

  14.   fileLength=file.available();

  15.   file.close();

  16.   Serial.println("汉字");

  17.   Serial.println(matchPinyin("a "));

  18.   Serial.println(matchPinyin("zuo "));

  19.   Serial.println(matchPinyin("hao "));

  20.   Serial.println("done");

  21. }

  22. String matchPinyin(String val)

  23. {

  24.   return search(val,0,fileLength);

  25. }

  26. String search(String val,unsigned long a,unsigned long b)//传递原值,首位,末位,识别位数

  27. {

  28.   char word=0;//缓存所取

  29.   int sub=0;//比较下标

  30.   File file=SD.open("1.txt",FILE_READ);

  31.   unsigned long mid=a/2+b/2;

  32.   Serial.print(a);

  33.   Serial.print(",");

  34.   Serial.print(b);

  35.   Serial.print(":");

  36.   Serial.println(mid);

  37.   if((b-a)<2)

  38.   {

  39.     return "";

  40.   }

  41.   //Serial.println("front find");

  42.   file.seek(mid);

  43.   while(file.peek()!=10/*不是换行*/)//连续向上查询

  44.   {

  45.     /*Serial.print("    ");

  46.     Serial.print(mid);

  47.     Serial.print(" ");

  48.     Serial.println(file.peek());*/

  49.     mid--;

  50.     file.seek(mid);

  51.   }

  52.   //Serial.println("back find");

  53.   poipos=mid;

  54.   while(file.peek()!=9/*不是空格*/)//连续向下查询

  55.   {

  56.     /*Serial.print("    ");

  57.     Serial.print(file.peek());

  58.     Serial.print(" ");

  59.     Serial.println(char(file.peek()));*/

  60.     file.seek(++poipos);

  61.   }

  62.   while(file.seek(++poipos),(word=file.peek())!='\r'/*不是回车*/)//依次比较

  63.   {

  64.     /*Serial.print("   ");

  65.     Serial.print(char(val[sub]));

  66.     Serial.print("==");

  67.     Serial.print(char(word));*/

  68.     if(val[sub]==word)

  69.     {

  70.       sub++;

  71.     }

  72.     else if(word>val[sub])//从前寻找

  73.     {

  74.       Serial.println("front");

  75.       yield();

  76.       file.close();

  77.       return(search(val,a,(a+b)/2));

  78.     }

  79.     else if(word<val[sub])//从后寻找

  80.     {

  81.       Serial.println("back");

  82.       yield();

  83.       file.close();

  84.       return(search(val,(a+b)/2,b));

  85.     }

  86.   }

  87.   //此次选择正确

  88.   String ret="";

  89.   file.seek(++mid);

  90.   while(file.peek()!=9)

  91.   {

  92.     ret+=char(file.read());

  93.   }

  94.   file.close();

  95.   return ret;

  96. }

  97. void loop() {

  98.   // put your main code here, to run repeatedly:

  99.   

  100. }

复制代码




以下是代码高亮的图片,和需要打开的文件:




回复

使用道具 举报

 楼主| 发表于 2024-3-31 20:13:46 | 显示全部楼层
以下是代码高亮的图片,和需要打开的文件:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-30 01:24 , Processed in 0.049083 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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