从SD读取有点大的.txt时,Arduino巨型崩溃

时间:2015-04-23 23:54:14

标签: arduino gsm arduino-ide

我有一个带有SD盾牌和GSM盾牌的Arduino超级巨星。我正在尝试从SD卡上的文本文件向200个号码发送一个短信,但每次我尝试发送超过100个号码时,Arduino都会重新启动。当我尝试发送到70个号码时,它不会崩溃。我一次只读一个号码,所以我不明白这个问题。我是Arduino编程的新手。

请帮助我这是一场锦标赛。这是代码:

#include <avr/pgmspace.h>
#include <SPI.h>
#include <SD.h>
#include <GSM.h>

#define PINNUMBER ""
GSM gsmAccess;
GSM_SMS sms;



// GSM
boolean notConnected;
//char input;
//byte input2;
//char txtContent[200];
byte i = 1;
byte f = 0;
boolean sendit;
//char senderNumber[11];
const String stopp PROGMEM = "Stopp";


//SD
char numbers[11];
//char nmbr;
int l = 0;

//Optimizing
const char q PROGMEM = '\xe5'; // å
const char w PROGMEM = '\xe4'; // ä
const char e PROGMEM = '\xf6'; // ö
const char r PROGMEM = '\xc5'; // Å
const char t PROGMEM = '\xc4'; // Ä
const char y PROGMEM = '\xd6'; // Ö

void setup() {
//  txtContent[0] = '\0';
  i = 0;
  pinMode(53, OUTPUT);
  Serial.begin(115200);
  //    Serial.begin(4800);
  Serial.println(F("Connecting to GSM..."));
  notConnected = true;
  while (notConnected) {
    if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
      notConnected = false;
    }
    else {
      Serial.println(F("Not Connected"));
      delay(1000);
    }
  }
  Serial.println(F("GSM Ready"));
  if (!SD.begin(4)) {
    Serial.println(F("Error with SD card"));
    return;
  }
  Serial.println(F("SD Ready"));
  delay(1000);
  Serial.println(F("Write your sms and end it with * and press Send"));
  Serial.flush();
}

void loop() {
  char txtContent[300];
  if (Serial.available() > 0 && !sendit) {
    byte input2;
    input2 = (int)Serial.read();
    txtContent[i] = (char)input2;
    if (txtContent[i] == '{') {
      txtContent[i] = q;
    }
    else if (txtContent[i] == '}') {
      txtContent[i] = w;
    }
    else if (txtContent[i] == '|') {
      txtContent[i] = e;
    }
    else if (txtContent[i] == '[') {
      txtContent[i] = r;
    }
    else if (txtContent[i] == ']') {
      txtContent[i] = t;
    }
    else if (txtContent[i] == ';') {
      txtContent[i] = y;
    }
    i++;
    if (input2 == '*') {
      // Remove the * from text.
      for (int j = 0; j < sizeof(txtContent); j++) {
        if (txtContent[j] == '*') {
          txtContent[j] = '\0';
          //Serial.println(txtContent);
        }
      }
      sendit = true;
      Serial.flush();
    }
    else {
      sendit = false;
      Serial.flush();
    }
  }
  else if (sendit && txtContent[0] != '\0') {
    int txtCount = 0;
    //    else if(sendit){
    Serial.println(F("Sending please wait..."));
//    Serial.flush();
    File myFile;
    myFile = SD.open("numbers.txt");
    char input;
    if (myFile) {
//      if (myFile.available()) {
        while(myFile.available()){
        input = (char)myFile.read();
        if (input == ',') {
          sms.beginSMS(numbers);
          sms.print(txtContent);
//          sms.beginSMS("0704941025");
//          sms.print("yo");
          delay(30);
          sms.endSMS();
          delay(30);

          Serial.println(numbers);
          Serial.flush();
          //            Serial.flush();
          for (int j = 0; j < sizeof(numbers); j++) {
            if (numbers[i] != '\0') {
              numbers[j] = '\0';
            }
          }
          f = 0;
        }
        else {
          numbers[f] = input;
          f++;
        }
        }
      myFile.close();
      Serial.println(F("All texts have been sent."));
      Serial.flush();
    } else {
      Serial.println(F("error opening numbers.txt"));
    }
    for (int j = 0; j < sizeof(txtContent); j++) { // Clear text
      txtContent[j] = '\0';
    }
    i = 0;
    sendit = false;
  }
  else {
    //  delay(1000);
    if (sms.available()) {
      char senderNumber[11];
      sms.remoteNumber(senderNumber, 11);
      if (sms.peek() == 'S') {
        Serial.print(F("Detta nummer har skickat Stopp: "));
        Serial.println(senderNumber);
      }
      sms.flush();
      Serial.flush();
      //    sendit = false;
    }
  }
}

1 个答案:

答案 0 :(得分:0)

Arduino对我来说是一个奇怪的理由,但如果这有点像C,那么我冒险说sizeof(numbers)可能会返回44,因为你要求字节大小,这可能意味着你当numbers[43]长度为11时,for循环将迭代到numbers[]。请考虑改为:

for (int j = 0; j < sizeof(numbers)/sizeof(numbers[0]); j++) {

在此代码中检查数组大小的所有其他时间也是如此。 另外,请仔细检查您的文本文件,以确保它以您预期的格式编写:11个数字,然后是逗号,没有例外。您可能应该尝试在点击逗号前确定f是否超过11位数,并在显示错误消息时“优雅地失败”。