有没有大佬帮我看看这是怎么回事,关于sd库
<h3>以下是完整代码:</h3><p> </p><p><i>#include<SD.h></i></p><p><i>#include<SPI.h></i></p><p><i>#include<String.h></i></p><p><i>unsigned long fileLength=0;//文件长度</i></p><p><i>unsigned long poipos=0;//文件指针位置</i></p><p><i>File file;</i></p><p><i>String matchPinyin(String);</i></p><p><i>String search(String,unsigned long,unsigned long);</i></p><p><i>void setup() {</i></p><p><i> // put your setup code here, to run once:</i></p><p><i> Serial.begin(115200);</i></p><p><i> Serial.println(SD.begin(SPI_HALF_SPEED, 4));</i></p><p><i> File file=SD.open("1.txt",FILE_READ);</i></p><p><i> fileLength=file.available();</i></p><p><i> file.close();</i></p><p><i> Serial.println("汉字");</i></p><p><i> Serial.println(matchPinyin("a "));</i></p><p><i> Serial.println(matchPinyin("zuo "));</i></p><p><i> Serial.println(matchPinyin("hao "));</i></p><p><i> Serial.println("done");</i></p><p><i>}</i></p><p><i>String matchPinyin(String val)</i></p><p><i>{</i></p><p><i> return search(val,0,fileLength);</i></p><p><i>}</i></p><p><i>String search(String val,unsigned long a,unsigned long b)//传递原值,首位,末位,识别位数</i></p><p><i>{</i></p><p><i> char word=0;//缓存所取</i></p><p><i> int sub=0;//比较下标</i></p><p><i> File file=SD.open("1.txt",FILE_READ);</i></p><p><i> unsigned long mid=a/2+b/2;</i></p><p><i> Serial.print(a);</i></p><p><i> Serial.print(",");</i></p><p><i> Serial.print(b);</i></p><p><i> Serial.print(":");</i></p><p><i> Serial.println(mid);</i></p><p><i> if((b-a)<2)</i></p><p><i> {</i></p><p><i> return "";</i></p><p><i> }</i></p><p><i> //Serial.println("front find");</i></p><p><i> file.seek(mid);</i></p><p><i> while(file.peek()!=10/*不是换行*/)//连续向上查询</i></p><p><i> {</i></p><p><i> /*Serial.print(" ");</i></p><p><i> Serial.print(mid);</i></p><p><i> Serial.print(" ");</i></p><p><i> Serial.println(file.peek());*/</i></p><p><i> mid--;</i></p><p><i> file.seek(mid);</i></p><p><i> }</i></p><p><i> //Serial.println("back find");</i></p><p><i> poipos=mid;</i></p><p><i> while(file.peek()!=9/*不是空格*/)//连续向下查询</i></p><p><i> {</i></p><p><i> /*Serial.print(" ");</i></p><p><i> Serial.print(file.peek());</i></p><p><i> Serial.print(" ");</i></p><p><i> Serial.println(char(file.peek()));*/</i></p><p><i> file.seek(++poipos);</i></p><p><i> }</i></p><p><i> while(file.seek(++poipos),(word=file.peek())!='\r'/*不是回车*/)//依次比较</i></p><p><i> {</i></p><p><i> /*Serial.print(" ");</i></p><p><i> Serial.print(char(val));</i></p><p><i> Serial.print("==");</i></p><p><i> Serial.print(char(word));*/</i></p><p><i> if(val==word)</i></p><p><i> {</i></p><p><i> sub++;</i></p><p><i> }</i></p><p><i> else if(word>val)//从前寻找</i></p><p><i> {</i></p><p><i> Serial.println("front");</i></p><p><i> yield();</i></p><p><i> file.close();</i></p><p><i> return(search(val,a,(a+b)/2));</i></p><p><i> }</i></p><p><i> else if(word<val)//从后寻找</i></p><p><i> {</i></p><p><i> Serial.println("back");</i></p><p><i> yield();</i></p><p><i> file.close();</i></p><p><i> return(search(val,(a+b)/2,b));</i></p><p><i> }</i></p><p><i> }</i></p><p><i> //此次选择正确</i></p><p><i> String ret="";</i></p><p><i> file.seek(++mid);</i></p><p><i> while(file.peek()!=9)</i></p><p><i> {</i></p><p><i> ret+=char(file.read());</i></p><p><i> }</i></p><p><i> file.close();</i></p><p><i> return ret;</i></p><p><i>}</i></p><p><i>void loop() {</i></p><p><i> // put your main code here, to run repeatedly:</i></p><p><i> </i></p><p><i>}</i></p><p> </p><h3>想做一个从SD卡里的文件用拼音查询汉字的程序,但是<i>File file=SD.open("1.txt",FILE_READ); </i>这一句只能写到递归函数里,写到初始化里在递归函数里就不能操作文件了,是什么情况?怎么改进呢?</h3><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><figure class="image"><img></figure><p> </p><p> </p><p> </p><p> </p><h3> </h3><h3>以下是打开的文件(部分)</h3><p> </p><p> </p><p> </p><figure class="image"><img></figure> 补两张图片试试这样
#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 == word)
{
sub++;
}
else if (word > val)
{
Serial.println("front");
yield();
file.close();
return (search(val, a, (a + b) / 2, file));
}
else if (word < val)
{
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()
{
}
DFEDU 发表于 2024-4-1 17:56
试试这样
#include
#include
问题解决了,谢谢!但是file是全局变量,为什么在初始化里赋值不可以? 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就变成了函数内部的局部变量,不再是你之前定义的那个全局变量了。
页:
[1]