2024-3-31 12:18:55 [显示全部楼层]
189浏览
查看: 189|回复: 4

[求助] 有没有大佬帮我看看这是怎么回事,关于sd库

[复制链接]

以下是完整代码:

 

#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[sub]));

    Serial.print("==");

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

    if(val[sub]==word)

    {

      sub++;

    }

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

    {

      Serial.println("front");

      yield();

      file.close();

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

    }

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

    {

      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:

  

}

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

以下是打开的文件(部分)

 

 

 

operator  学徒
 楼主|

发表于 2024-3-31 12:42:59

补两张图片
有没有大佬帮我看看这是怎么回事,关于sd库图2有没有大佬帮我看看这是怎么回事,关于sd库图1

回复

使用道具 举报

DFEDU  高级技师

发表于 2024-4-1 17:56:08

试试这样
#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, File &);

void setup()
{
  Serial.begin(115200);
  Serial.println(SD.begin(SPI_HALF_SPEED, 4));

  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)
{
  file = SD.open("1.txt", FILE_READ);
  return search(val, 0, fileLength, file);
}

String search(String val, unsigned long a, unsigned long b, File &file)
{
  char word = 0;      //缓存所取
  int sub = 0;        //比较下标
  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 "";
  }

  file.seek(mid);
  while (file.peek() != 10)
  {
    mid--;
    file.seek(mid);
  }

  poipos = mid;
  while (file.peek() != 9)
  {
    file.seek(++poipos);
  }

  while ((file.seek(++poipos), (word = file.peek())) != '\r')
  {
    if (val[sub] == word)
    {
      sub++;
    }
    else if (word > val[sub])
    {
      Serial.println("front");
      yield();
      file.close();
      return (search(val, a, (a + b) / 2, file));
    }
    else if (word < val[sub])
    {
      Serial.println("back");
      yield();
      file.close();
      return (search(val, (a + b) / 2, b, file));
    }
  }

  String ret = "";
  file.seek(++mid);
  while (file.peek() != 9)
  {
    ret += char(file.read());
  }
  return ret;
}

void loop()
{
}
回复

使用道具 举报

operator  学徒
 楼主|

发表于 2024-4-2 22:56:06

DFEDU 发表于 2024-4-1 17:56
试试这样
#include
#include

问题解决了,谢谢!但是file是全局变量,为什么在初始化里赋值不可以?
回复

使用道具 举报

开在边缘  初级技匠

发表于 2024-4-8 12:33:07

operator 发表于 2024-4-2 22:56
问题解决了,谢谢!但是file是全局变量,为什么在初始化里赋值不可以?

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);



String search(String val,unsigned long a,unsigned long b)//传递原值,首位,末位,识别位数
{
  char word=0;//缓存所取
  int sub=0;//比较下标
  File file=SD.open("1.txt",FILE_READ);


因为你在函数里面又重新定义了一次file,所以函数里面的file就变成了函数内部的局部变量,不再是你之前定义的那个全局变量了。
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail