operator 发表于 2024-3-31 20:11:30

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

想做一个从SD卡里的文件用拼音查询汉字的程序,但是File file=SD.open("1.txt",FILE_READ); 这一句只能写到递归函数里,写到初始化里在递归函数里就不能操作文件了,是什么情况?怎么改进呢?

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

#include<SPI.h>

#include<String.h>

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

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

File file;

String matchPinyin(String);

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

void setup() {

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

Serial.begin(115200);

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

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

fileLength=file.available();

file.close();

Serial.println("汉字");

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

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

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

Serial.println("done");

}

String matchPinyin(String val)

{

return search(val,0,fileLength);

}

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

{

char word=0;//缓存所取

int sub=0;//比较下标

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

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

Serial.print(a);

Serial.print(",");

Serial.print(b);

Serial.print(":");

Serial.println(mid);

if((b-a)<2)

{

    return "";

}

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

file.seek(mid);

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

{

    /*Serial.print("    ");

    Serial.print(mid);

    Serial.print(" ");

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

    mid--;

    file.seek(mid);

}

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

poipos=mid;

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

{

    /*Serial.print("    ");

    Serial.print(file.peek());

    Serial.print(" ");

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

    file.seek(++poipos);

}

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

{

    /*Serial.print("   ");

    Serial.print(char(val));

    Serial.print("==");

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

    if(val==word)

    {

      sub++;

    }

    else if(word>val)//从前寻找

    {

      Serial.println("front");

      yield();

      file.close();

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

    }

    else if(word<val)//从后寻找

    {

      Serial.println("back");

      yield();

      file.close();

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

    }

}

//此次选择正确

String ret="";

file.seek(++mid);

while(file.peek()!=9)

{

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

}

file.close();

return ret;

}

void loop() {

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



}





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



operator 发表于 2024-3-31 20:13:46

以下是代码高亮的图片,和需要打开的文件:
页: [1]
查看完整版本: 求助,关于arduino SD卡,能帮我看看程序吗,谢谢!