Я работаю над программой, которая псевдослучайно генерирует императивные предложения. Программа объединяет случайно выбранный глагол, притяжательное прилагательное и существительное для отображения окончательного предложения. Недавно я пытался перевести код из Processing в Arduino, и сегодня я столкнулся с каким-то странным поведением. Вот мой код до сих пор:Arduino: Странное поведение при извлечении символов с SD-карты
#include <SD.h>
int ByteReceived;
int stepToLoad = 1;
int endOfLineNumber = 0;
int stringIndex = 0;
int fileNumber = 0;
File configFile;
char inputString [20];
char inputChar;
String file [3] = {
"verb.txt","adject.txt","noun.txt"};
void setup() {
Serial.begin(9600);
char randSteps[3] = {
random(1,1041),random(1,7),random(1,979)};
pinMode(10, OUTPUT);
SD.begin(10);
for(fileNumber = 0; fileNumber < 3; fileNumber++){
char filename[file[fileNumber].length()+1];
file[fileNumber].toCharArray(filename, sizeof(filename));
if(!SD.exists('\''+filename+'\''))
{
stepToLoad = randSteps[fileNumber];
configFile = SD.open(filename);
getStepData();
Serial.print(inputString);
Serial.print(" ");
endOfLineNumber = 0;
stringIndex = 0;
inputString[0] = '\0';
configFile.close();
}
}
}
void loop() {
if (Serial.available() > 0)
{
ByteReceived = Serial.read();
if(ByteReceived == '1')
{
setup();
}
}
}
void getStepData(){
if (configFile) {
while (configFile.available()) {
inputChar = configFile.read();
if (inputChar != ' '){
inputString[stringIndex] = inputChar;
stringIndex++;
}
else {
endOfLineNumber++;
if (endOfLineNumber == stepToLoad){
inputString[stringIndex] = '\0';
break;
}
else {
stringIndex = 0;
}
}
}
}
}
Я в настоящее время реализует несколько магических чисел в месте максимального количество слов для текстовых файлов: char randSteps[3] = {random(1,1041/*Total words in verb.txt*/),random(1,7/*Total words in adject.txt*/),random(1,979/*total words in noun.txt*/)};
Это только ускорить время загрузки, пока я отладки код. Что касается странного поведения, программа иногда печатать полную фразу, как:
"abide my arithmetic"
Другие времена он печатает что-то вроде:
"1oomylenddotde his 1oopergesstive"
Это поведение может повлиять только глагол, только существительное, или оба. Когда он воздействует на глагол, он всегда читает «1oomylenddotde», и когда он воздействует на существительное, он читает «1oopergesstive». Притяжательное прилагательное действует только в том случае, если я заставляю программу пробовать и читать прошлое от общего количества слов в текстовом файле: char randSteps[3] = {1,9,1};
, после чего прилагательное читает «1heir». Однако проблема обычно возникает, когда программа пытается прочитать более двухсот слов на «verb.txt» или «noun.txt»: char randSteps[3] = {200,1,200};
, хотя у меня более двухсот слов в «verb.txt» и «существительное .текст". Связано ли это с SRAM, связано ли это с размером endOfLineNumber
или связано с каким-то буфером?