[SOLVED]str.toCharArray(copy, 50) : 'str' does not name a type

Hallo zusammen,
Ich arbeite gerade an einem Seriellen Chat mit dem ich vom Computer aus über den Arduino eine beliebige SMS senden kann.
Ich zerbreche mir schon lange den Kopf wegen diesem Fehler:

'str' does not name a type

Und das ist mein aktueller Code:

### Send SMS messages
1. This example is used to test DFRobot_SIM808 GPS/GPRS/GSM Shield's send SMS func.
2. Open the SIM808_SendSMS example or copy these code to your project
3. Replace the phoneNumber:#define PHONE_NUMBER  "187******39"    
4. Download and dial the function switch to Arduino, and enjoy it

create on 2016/09/23, version: 1.0
by jason
*/
#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>

//Mobile phone number,need to change
#define PHONE_NUMBER  "+491623497654"

#define MESSAGE_LENGTH 160
char message[MESSAGE_LENGTH];
int messageIndex = 0;

char phone[16];
char datetime[24];

char copy[50];
char rx_byte = 0;
String str = "";

str.toCharArray(copy, 50); // the error
 
//The content of messages sent


#define PIN_TX    10
#define PIN_RX    11
SoftwareSerial mySerial(PIN_TX,PIN_RX);
DFRobot_SIM808 sim808(&mySerial);//Connect RX,TX,PWR,

void setup() {
  mySerial.begin(9600);
  Serial.begin(9600);

//******** Initialize sim808 module *************
  while(!sim808.init()) {
      delay(1000);
      Serial.print("Sim808 init error\r\n");
  }  
  Serial.println("Sim808 init success");
  }

void loop() {
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();       // get the character
    
    if (rx_byte != '\n') {
      // a character of the string was received
      str += rx_byte;
    }
    else {
      Serial.println("Start to send message ...");

  //******** define phone number and text **********
  Serial.println(str);
  sim808.sendSMS(PHONE_NUMBER,copy);

   //*********** Detecting unread SMS ************************
   messageIndex = sim808.isSMSunread();
    Serial.print("messageIndex: ");
    Serial.println(messageIndex);
    
    

   //*********** At least, there is one UNREAD SMS ***********
   if (messageIndex > 0) { 
      sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);
                 
      //***********In order not to full SIM Memory, is better to delete it**********
      sim808.deleteSMS(messageIndex);
      Serial.print("From number: ");
      Serial.println(phone);  
      Serial.print("Datetime: ");
      Serial.println(datetime);        
      Serial.print("Recieved Message: ");
      Serial.println(message);   
   }
 }
} 
}

Kann mir bitte jemand helfen?
Ich freue mich auf Antworten.

str.toCharArray(copy, 50); // the error

Was willst Du damit bezwecken? Das ist eine ausführbare Anweisung, de muss innerhalb einer Funktion stehen.

  1. Du kannst keine Methode/Funktion außerhalb einer Funktion ausführen
    2. Die Zeile ist auch inhaltlich falsch. Schau Dir die Referenz dazu an.
    Verlesen.

Gruß Tommy

MicroBahner:

str.toCharArray(copy, 50); // the error

Was willst Du damit bezwecken?

Als ich früher char* für str benutzt habe, bekam ich am Ende einen komischen Text als SMS.

Wenn Du den copy-Array weglässt, str als char str[50] deklarierst (magic number wären aber besser zu vermeiden) und dann noch einen Index einführst, kannst Du die empfangenen Zeichen direkt in den Character-Array schreiben. Danach kannst Du mit str genauso weiterarbeiten wie jetzt mit copy.

int index = 0;
...
 str[index]= rx_byte;
  index++;
  // Prüfung und Behandlung Index-Überlauf
  ...
  // Prüfung auf String-Ende - dann den C-String mit einer 0 abschließen.
  str[index] = '\0';

Versuche mal dies:

  //******** define phone number and text **********
  Serial.println(str);
  str.toCharArray(copy, 50); // the error
  sim808.sendSMS(PHONE_NUMBER,copy);

Irgendwo sollte str auch mal geleert werden.

Dann setze #4 um.

Die eigentliche Frage bei sowas ist fast immer "wieso kopiert man das überhaupt in ein char Array"? In aller Regel ist das überflüssig. Das braucht man nur wenn man schreibend auf das String Objekt zugreifen will. Meistens geht es aber nur um einen reinen Lese-Zugriff um ein String Objekt an eine Methode zu übergeben die einen C String (char*) möchste

Dafür gibt es c_str():

Dass da "konvertiert" auf der Seite steht ist genaugenommen falsch. Man bekommt einfach direkt einen konstanten Zeiger auf das interne Array zurück. Umgewandelt oder kopiert wird da nichts. Weshalb es besser als toCharArray() ist

Das Problem ist gelöst!
Hier der neue Code:

/*
### Send SMS messages
1. This example is used to test DFRobot_SIM808 GPS/GPRS/GSM Shield's send SMS func.
2. Open the SIM808_SendSMS example or copy these code to your project
3. Replace the phoneNumber:#define PHONE_NUMBER  "187******39"    
4. Download and dial the function switch to Arduino, and enjoy it

create on 2016/09/23, version: 1.0
by jason
*/
#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>

//Mobile phone number,need to change
#define PHONE_NUMBER  "+491627537482"

#define MESSAGE_LENGTH 160
char message[MESSAGE_LENGTH];
int messageIndex = 0;

char phone[16];
char datetime[24];

char copy[50];
char rx_byte = 0;
String str = "";

 
//The content of messages sent


#define PIN_TX    10
#define PIN_RX    11
SoftwareSerial mySerial(PIN_TX,PIN_RX);
DFRobot_SIM808 sim808(&mySerial);//Connect RX,TX,PWR,

void setup() {
  mySerial.begin(9600);
  Serial.begin(9600);

  

//******** Initialize sim808 module *************
  while(!sim808.init()) {
      delay(1000);
      Serial.print("Sim808 init error\r\n");
  }  
  Serial.println("Sim808 init success");
  }

void loop() {
  str.toCharArray(copy, 50);
  if (Serial.available() > 0) {    // is a character available?
    rx_byte = Serial.read();       // get the character
    
    if (rx_byte != '\n') {
      // a character of the string was received
      str += rx_byte;
    }
    else {
      Serial.println("Start to send message ...");

  //******** define phone number and text **********
  Serial.println(str);
  sim808.sendSMS(PHONE_NUMBER,copy);
  str.remove(0, 50); // damit die Nachrichten nicht zu einer großen SMS werden
      //*********** At least, there is one UNREAD SMS ***********
      Serial.println("checking index...");
  
   
    //*********** Detecting unread SMS ************************
   messageIndex = sim808.isSMSunread();
   Serial.println(messageIndex);
    if(messageIndex > 0)
  {
     sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);
                 
      //***********In order not to full SIM Memory, is better to delete it**********
      sim808.deleteSMS(messageIndex);
      Serial.print("From number: ");
      Serial.println(phone);  
      Serial.print("Datetime: ");
      Serial.println(datetime);        
      Serial.print("Recieved Message: ");
      Serial.println(message);
      sim808.deleteSMS(messageIndex);   
   }
}
    }
    }

Aber trotzdem danke für die Hilfsbereitschaft.

Schön - dass das Problem gelöst ist.

Tu Dir und uns bitte noch einen Gefallen: Drücke einmal STRG-T in der Arduino-IDE bevor Du Code postest.
Bei sowas bekomme ich immer Pickel:

  }
}
    }
    }

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.