2015-03-31 1 views
0

Я работаю над программой, которая псевдослучайно генерирует императивные предложения. Программа объединяет случайно выбранный глагол, притяжательное прилагательное и существительное для отображения окончательного предложения. Недавно я пытался перевести код из 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 или связано с каким-то буфером?

ответ

0

После некоторого необходимого отдыха я обнаружил проблему. Я хранил свои случайные целые числа в качестве значений символов.

char randSteps[3] = { 
    random(1,1041),random(1,7),random(1,979)}; 

Теперь я изменил его:

int randSteps[3] = { 
     random(1,1041),random(1,7),random(1,979)}; 

Silly меня. Вот рабочий код:

#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); 
    pinMode(10, OUTPUT); 
    SD.begin(10); 
    int randSteps[3] = {random(1,1041),random(1,7),random(1,979)}; 
    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(" "); 
     stringIndex = 0; 
     endOfLineNumber = 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; 
     }  
     } 
    } 
    } 
}