Arduino:从 SD 卡中检索字符时的奇怪行为
Arduino: Strange behavior while retrieving characters from SD card
我一直在研究一个伪运行domly 生成祈使句的程序。该程序结合了 运行domly 选择的动词、所有格形容词和名词,以显示最终句子。我最近一直在尝试 t运行 将代码从 Processing 转移到 Arduino,并且我 运行 变成了今天的一些 st运行ge 行为。到目前为止,这是我的代码:
#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] = '[=10=]';
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] = '[=10=]';
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*/)};
这只是为了在我调试代码时加快启动时间。
至于 st运行ge 行为,程序有时会打印一个完整的短语,如:
"abide my arithmetic"
其他时候它会打印如下内容:
"1oomylenddotde his 1oopergesstive"
此行为可以只影响动词、名词或两者。当它影响动词时,它总是读作“1oomylenddotde”,而当它影响名词时,它读作“1oopergessive”。只有当我强制程序尝试读取超过文本文件中的单词总数时,所有格形容词才会生效:
char randSteps[3] = {1,9,1};
此时形容词读作“1heir”。但是,当程序试图读取 "verb.txt" 或 "noun.txt" 上超过 200 个单词时,通常会出现此问题:
char randSteps[3] = {200,1,200};
尽管我在 "verb.txt" 和 "noun.txt" 中有超过两百个单词。这是否与 SRAM 有关,是否与 endOfLineNumber
的大小有关,或者是否与某种缓冲区有关?
经过一些急需的休息后,我发现了这个问题。
我将我的随机整数存储为字符值。
char randSteps[3] = {
random(1,1041),random(1,7),random(1,979)};
我现在改成:
int randSteps[3] = {
random(1,1041),random(1,7),random(1,979)};
傻我。这是工作代码:
#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] = '[=12=]';
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] = '[=12=]';
break;
}
else {
stringIndex = 0;
}
}
}
}
}
我一直在研究一个伪运行domly 生成祈使句的程序。该程序结合了 运行domly 选择的动词、所有格形容词和名词,以显示最终句子。我最近一直在尝试 t运行 将代码从 Processing 转移到 Arduino,并且我 运行 变成了今天的一些 st运行ge 行为。到目前为止,这是我的代码:
#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] = '[=10=]';
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] = '[=10=]';
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*/)};
这只是为了在我调试代码时加快启动时间。
至于 st运行ge 行为,程序有时会打印一个完整的短语,如:
"abide my arithmetic"
其他时候它会打印如下内容:
"1oomylenddotde his 1oopergesstive"
此行为可以只影响动词、名词或两者。当它影响动词时,它总是读作“1oomylenddotde”,而当它影响名词时,它读作“1oopergessive”。只有当我强制程序尝试读取超过文本文件中的单词总数时,所有格形容词才会生效:
char randSteps[3] = {1,9,1};
此时形容词读作“1heir”。但是,当程序试图读取 "verb.txt" 或 "noun.txt" 上超过 200 个单词时,通常会出现此问题:
char randSteps[3] = {200,1,200};
尽管我在 "verb.txt" 和 "noun.txt" 中有超过两百个单词。这是否与 SRAM 有关,是否与 endOfLineNumber
的大小有关,或者是否与某种缓冲区有关?
经过一些急需的休息后,我发现了这个问题。 我将我的随机整数存储为字符值。
char randSteps[3] = {
random(1,1041),random(1,7),random(1,979)};
我现在改成:
int randSteps[3] = {
random(1,1041),random(1,7),random(1,979)};
傻我。这是工作代码:
#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] = '[=12=]';
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] = '[=12=]';
break;
}
else {
stringIndex = 0;
}
}
}
}
}