string an Funktion übergeben - speicheroptimierte Programmierung

Hallo Leute,

derzeit habe ich folgendes Problem an meinem Projekt:

Hier ein kurzer Überblick:
Ich verwende den Arduino MINI ATMega328 und will einer Funktion im Hauptprogramm einen String übergeben damit dann im Unterprogramm etwas passiert.
Genau genommen soll dieser String dann über eine SoftwareSerial Schnittstelle ( in meinem Fall heißt sie Scada ) an ein anderes Computerprogramm (Scada Programm ) geschickt werden.

Da mein System schon nahezu fertig programmmiert ist, und das ganze Projekt fast 3000 Codezeilen verschlang, bin ich mit dem verfügbaren RAM derzeit nur mehr auf 358byte (freeMemory() - liefert mir das zurück )

Ich habe den Code so umgesetzt.

void loop()
{
    //do some other work here
    sendToScada("this text should be send to a scada system");
}



void sendToScada(char* sMessageToSend)
{
   Scada.listen();
   Scada.print("V"); // Messageheader
   for(int i=0;i<strlen(sMessageToSend);i++)
       Scada.print(sMessageToSend[i]);
   Scada.print("\n");
   XBee.listen(); //set to other serial active
}

Was mache ich da falsch? Mit dieser Funktion scheitre ich, denn nach einpaar aufrufen startet mein Arduino neu, d.h ich vermute dass der Speicher rasant gegen 0 geht und dann einen Neustart verursacht.

lg
Dieter

hi,

verwende das F-makro:

sendToScada(F(“this text should be send to a scada system”));

dann wird der text im flash abgelegt.

gruß stefan

Hi,

verwende ich es so wie du es geschrieben hast:
sendToScada(F(“this text should be send to a scada system”));
erhalte ich diesen Fehler
error: cannot convert ‘const __FlashStringHelper*’ to ‘char*’ for argument ‘1’ to ‘void sendToScada(char*)’

lasse ich das sendToScada(“this text should be send to a scada system”); und ändere nur in der Funktion auf das Makro um

void sendToScada(char* sMessageToSend)
{
   Scada.listen();
   Scada.print(F("V")); // Messageheader
   for(int i=0;i<strlen(sMessageToSend);i++)
       Scada.print(F(sMessageToSend[i]));
   Scada.print(F("\n"));
   XBee.listen(); //set to other serial active
}

dann krieg ich leider diesen fehler:

error: initializer fails to determine size of '__c’

lg

Dieter

Hast du eine Enercon WKA?

maverick1509:
Hast du eine Enercon WKA?

Ne ich war zwar beruflich auf einer schon mal oben in der Gondel aber nein habe keine lol

Schau auf meinen Blog, dort findest du was ich baue!

Na ja war eine Frage, weil das Überwachungsprogramm der Firma Enercon Scada heißt.

maverick1509:
Na ja war eine Frage, weil das Überwachungsprogramm der Firma Enercon Scada heißt.

Schau mal hier....

Hallo Leute,

hat keiner eine Idee?

ids2001:
verwende ich es so wie du es geschrieben hast:
sendToScada(F(“this text should be send to a scada system”));
erhalte ich diesen Fehler
error: cannot convert ‘const __FlashStringHelper*’ to ‘char*’ for argument ‘1’ to ‘void sendToScada(char*)’

lasse ich das sendToScada(“this text should be send to a scada system”); und ändere nur in der Funktion auf das Makro um

void sendToScada(char* sMessageToSend)

{
  Scada.listen();
  Scada.print(F(“V”)); // Messageheader
  for(int i=0;i<strlen(sMessageToSend);i++)
      Scada.print(F(sMessageToSend[i]));
  Scada.print(F("\n"));
  XBee.listen(); //set to other serial active
}




dann krieg ich leider diesen fehler:

**error: initializer fails to determine size of '__c'**

Das F() Makro istr zwar gut, wenn man konstanten Text nicht unnötig in den RAM kopieren will, aber so geht's sicher nicht .

void sendToScada(char* sMessageToSend) {
   ...
   Scada.print(F(sMessageToSend[i]));
}

Deine Funktion müsste schon als
void sendToScada(const __FlashStringHelper* msg); // rahmt msg mit 'V' und '\n' ein ...deklariert sein
und entsprechend aufgerufen werden.

Da SoftwareSerial (Scada) von Print abgeleitet ist, sollte doch einfach Scada.print(msg); funktionieren.