Forum: Mikrocontroller und Digitale Elektronik Arduino Uno : "Selstsames" Verhalten von 2 Codes


von Chri Z. (belgariad_89)


Lesenswert?

Hallo,
ich bin komplett neu hier und hoffe, dass ihr mir weiterhelfen könnt :)
Ich habe wie der Titel schon vermerken lässt ein dubioses Verhalten von 
2 Codes.
Code 1:
Ist mein Hauptcode (hauptcode.ino) in dem ich alle Funktionen abarbeite.
Code 2:
Ist ein "Testcode (test.ino)" um eine weitere Funktion aufzubauen, 
welche dann in den Code 1 eingebaut wird.

Es geht um die Annahme eines eingehenden Telefonanrufes auf ein GSM 
SIM900 Modul mit einem Arduino UNO als Controller. Das Modul arbeitet 
mit "AT"-Befehlen. Der Testcode zur Annahme eines eingehen Telefonats 
funktioniert alleine(also in der test.ino ausgeführt). Ich nehme den 
Anruf dort nach 2s an und lege nach 10s auf.
Innerhalb des Hauptcodes wurde die Aufgabe der Annahme jedoch nicht 
ausgeführt. Auf der Fehlersuche fiel mir auf, dass der Testcode 
innerhalb des Hauptcodes überhaupt nicht ausgeführt wird. Auch dann 
nicht wenn der Hauptcode vom void setup() bis nach dem void loop () 
(keine weiteren Funktionen innerhalb des Codes) mit /* und *\ 
auskommentiert ist und der Testcode, 1 zu 1 kopiert, alleine dort steht. 
Inklusive des eigenen void setup und void loop aus der test.ino Datei.
Die Variablen sind in beiden Codes gleich.

Ich versuche das hier einmal aufzuzeigen:

**********************************
Hauptcode:
void setup()
{

}

void loop ()
{

}
**********************************


**********************************
Testcode:
void setup()
{

}

void loop ()
{

}
**********************************


**********************************
Hauptcode mit Testcode:
(Testcode)
void setup()
{

}

void loop ()
{

}





/* Hauptcode auskommentiert
void setup()
{

}

void loop ()
{

}
*\
**********************************


Vor dem void setup sind in beiden codes die gleichen Variablen etc. 
deklariert.

Ich verstehen leider nicht wieso nun der Testcode überhaupt nicht 
ausgeführt wird. Meines Erachtens nach müsste dieser ja im Hauptcode wie 
dort aufgezeigt genau so funktionieren wie in der test.ino alleine.


Ich hoffe das es verständlich erklärt wurde. Ich bin kein Experte in 
solchen Sachen und wollte jetzt nicht direkt den gesamten Code hier 
posten.


Mit freundlichen Grüßen
Belgariad_89

von devzero (Gast)


Lesenswert?

Wahrscheinlich ist der nicht gueltig auskommentiert - da muesste der 
Compiler aber meckern.

/* */  und nicht /* *\

von OMG (Gast)


Lesenswert?

Christian Z. schrieb:
> Ich versuche das hier einmal aufzuzeigen:

So bitte nicht!

Nachvollziehbaren Minimalcode bringen, sonst hilft das nichts.

Das Problem sitzt vor deinem Bildschirm, das sieht man schon
an der Überschrift des Threads.

von Chri Z. (belgariad_89)


Lesenswert?

Hey das ging ja schneller als gedacht.

Ja das habe ich mir schon gedacht. Werde das fix was basteln und hier 
hochladen.
Danke schon mal für die schnelle Reaktionszeit

von Sebastian S. (amateur)


Lesenswert?

Bitte poste beim nächsten Mal den Code, den Du auch dem Compiler zum 
Futtern gibst. Also .ino 1:1 anhängen. Außerdem werden dann Deine 
Exzesse nicht so umfangreich.
Sehr oft wird vom TO der Code nach eigenem Gusto, verkürzt, übergeben, 
was dann ein paar interessante Fehler unsichtbar macht.

Der von Dir übergebene Code sollte eigentlich Fehlermeldungen noch und 
nöcher produzieren.

Übrigens: Kommentare entweder mit "//" (Einzeilig) oder mit "/*" 
beginnen und mit "*/" abschließen. Durch so einfache Fehler kann man 
sehr interessante Fehlermeldungen produzieren.
Die zweite Form gibt es schon seit Anno "K&R".

von Peter D. (peda)


Lesenswert?

/* */ ist per default nicht nested verwendbar.
Am besten kommentiert man längeren Code so aus:
1
#if 0
2
..
3
#endif

von my2ct (Gast)


Lesenswert?

Chri Z. schrieb:
> Danke schon mal für die schnelle Reaktionszeit

Schnelle Reaktionszeit heißt: kleines d/dt(Reaktionszeit).
Was soll das für eine Größe sein.

Das ist wie "warme Temperaturen" - als ob man von einer Temperatur die 
Temperatur messen könnte.

von Chri Z. (belgariad_89)


Angehängte Dateien:

Lesenswert?

So nun mit den 3 Dateien. Hauptcode mit und ohne Testcode sowie den 
Testcode einzeln.
Vlt. hilft das ja weiter

von Stefan F. (Gast)


Lesenswert?

Wie gesagt hast du hier den Fehler gemacht, mehrzeilige Kommentare (/* 
... */) in mehrzeilige Kommentare einzubetten. Das geht nicht.

Mache es so, wie Peter in 
Beitrag "Re: Arduino Uno : "Selstsames" Verhalten von 2 Codes" empfohlen hat.

von Chri Z. (belgariad_89)


Angehängte Dateien:

Lesenswert?

Den Beitrag von Peter D habe ich eben auch gelesen, nachdem ich die 
Dateien hinzugefügt hatte. Habe ich eben natürlich auch ausprobiert, 
jedoch keine Veränderung. Der Schriftzug "Warte auf Anrufe" erscheint im 
seriellen Monitor jedoch nicht mehr.
Ich frage mich halt wo der Unterschied ist zwischen dem reinen Testcode 
und dem Hauptcode mit Testcode.

Der reine Aufbau ist ja der gleiche und der Rest des Codes ist ja 
auskommentiert (auch mit #if 0 .. #endif)

von Thomas W. (goaty)


Lesenswert?

Arduino IDE ist auch etwas sonderbar. Diese 'ino's, werden ja nur in ein 
'main.c' inkludiert. Das Ganze verschleiert das normale Bauen eines 
Binaries ziemlich.
Kann es sein daß du zwei 'ino's hast, aber nur das mit dem Namen des 
Projekts inkludiert wird ? Irgendsowas in die Richtung falscher 
Dateiname, doppelte Dateien wo nur eine sein sollte ? Weil pro Projekt 
gibt es doweit ich mich erinnere nur eine INO.

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Hallo,

schau Dir mal
1
if (statanruf == 1)

an und überlege wo im Code Du diese Variable setzt bzw. mit welchem Wert 
sie initialisiert ist.

Gruß
Frank

von Chri Z. (belgariad_89)


Lesenswert?

Ich habe der Variable extra erst nach dem "G" den Wert 1 zugewiesen, 
damit ich im seriellen Monitor den Schriftzug RING stehen habe.
Mit der 1 will ich nur einen Vergleichswert für die if-Anweisung direkt 
danach haben.
Oder habe ich deine Anmerkung falsch verstanden?

von Joachim B. (jar)


Lesenswert?

Peter D. schrieb:
> #if 0
> ..
> #endif

auch cool,

besser gefällt mir aber
1
#define MIT
2
#ifdef MIT
3
   //machs mit
4
#endif // #ifdef MIT

bei mehreren #endif wirds sonst rasch unübersichtlich welches #endif wo 
hin gehört.

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Chri Z. schrieb:
> Oder habe ich deine Anmerkung falsch verstanden?

Nein, das hast Du schon richtig verstanden. Wenn keine Ausgabe von 
"Eingehender Anruf" erfolgt, bedeutet dies, dass die Bedingung
1
if (statanruf == 1)
 nicht erfüllt wird.

Es stellt sich also die Frage, wird die Anweisung
1
if (incoming_char=='G') {
2
              delay(10);
3
              Serial.println(incoming_char);
4
              // If the message received from the shield is RING
5
              // Send ATA commands to answer the phone
6
              statanruf =1;
7
              
8
}
erreicht.

Gruß
Frank

von Chri Z. (belgariad_89)


Lesenswert?

Ja das wird sie. Das habe ich ja in dem reinen Testcode so probiert. 
Dort funktioniert ja auch alles so wie es soll. Halt nur nicht im 
Hauptcode. Was mich stutzig macht, da ja (egal auf welche weise) der 
restliche Hauptcode ausgekommentiert ist.
Dann ist es doch der gleiche Aufbau wie im Testcode.

Ein paar Beiträge höher sind die ino´s zum vergleichen angehängt.

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Chri Z. schrieb:
> Ja das wird sie. Das habe ich ja in dem reinen Testcode so probiert.

Das mag ja sein, dass es in Deinem Testcode so funktioniert. Die Frage 
ist, passiert das auch in Deinem Code "Hauptcode_mit_Testcode_2.ino"?

Zeig doch mal Deine Debugausgaben für diesen Code.

Gruß
Frank

von Stefan F. (Gast)


Lesenswert?

Es könnte hilfreich sein, einen Blick in die von Arduino zusammen 
gestrickten Quelltexte zu werfen, die der Compiler zu sehen bekommt: 
https://forum.arduino.cc/index.php?topic=163725.msg1222839#msg1222839

von 50c (Gast)


Lesenswert?

Chri Z. schrieb:
> Dann ist es doch der gleiche Aufbau wie im Testcode.

...nicht ganz! in deinem Hauptprogramm gibt es noch diese Zeilen im 
setup():
1
  if (gsm.begin(4800)){
2
  Serial.println("\nstatus=READY"); 
3
  }
4
  else Serial.println("\nstatus=IDLE");

Kommt denn noch eine der beiden Ausgaben auf deinem seriellen Terminal?

von Chri Z. (belgariad_89)


Lesenswert?

50c schrieb:

> Kommt denn noch eine der beiden Ausgaben auf deinem seriellen Terminal?

Ja davon erscheint die Ready Aussage. Aber auch wenn dieses weggelassen 
wird funktioniert es nicht. Es scheint so als wenn er die if-Anweisung 
if(SIM900.available() >0) ihm keine Rückmeldung gibt.

@ Frank L
Wie kann ich denn die Debugausgaben erzeugen?

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Chri Z. schrieb:
> Wie kann ich denn die Debugausgaben erzeugen?

Damit meinte ich die Ausgabe auf Deinem seriellen Terminal.
Also alles was Du mit Serial.println ausgibst.

Gruß
Frank

von Chri Z. (belgariad_89)


Lesenswert?

Da gibt er mir nichts aus. Nichteinmal das RING, welches bei einem 
eingehenden Anruf vom Modul geschickt wird. Daher wird ja auch nicht 
"statanruf" auf 1 gesetzt
Das der Anruf eingeht, erkenne ich aber anhand von LEDs auf der Platine 
vom Modul sowie auch anhand des Klingeln über den Kopfhörer

: Bearbeitet durch User
von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Hallo,

entferne mal aus dem File "Hauptcode_mit_Testcode.ino" den Code
1
if (gsm.begin(4800)){
2
  Serial.println("\nstatus=READY"); 
3
  }
4
  else Serial.println("\nstatus=IDLE");

hier initialisierst Du das Teil zweimal.

Wobei mir eins nicht klar ist, Du sagst, das File "test.ino" läuft so 
wie der Code abgebildet ist. Im File "Hauptcode_mit_Testcode.ino" 
inkludierst Du aber noch das File #include <SIM900.h> das fehlt im File 
"test.ino".

Irgendetwas passt da ganz und gar nicht zusammen.

Gruß
Frank

von Chri Z. (belgariad_89)


Angehängte Dateien:

Lesenswert?

habe ich geändert, leider ohne Erfolg. Habe auch die test.ino nochmal 
angepasst. Habe dort die SIM900.h nun ebenfalls inkludiert und die 
Variable statanruf wird wieder auf 0 gesetzt nach dem Auflegen

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Hallo,

auf die Gefahr hin mich zu wiederholen:

1. Gibt das File "Hauptcode_mit_Testcode_2.ino" irgendeine Meldung auf 
dem Terminal per println etwas aus?
2. Gibt das File "test.ino" etwas m Terminal aus?

Wenn nicht, kommentiere im File "Hauptcode_mit_Testcode_2.ino" mal die 
folgenden Zeilen aus:
1
#include <GSM.h>
2
#include <call.h>
3
#define MIT
4
5
pinMode(analogeingang, INPUT);       
6
7
Serial.println(analogRead(0)); 
8
9
tart_Verzoegerung = millis();

Hast Du mal geprüft, welche Infos beim Hochladen des Files 
"Hauptcode_mit_Testcode_2.ino" auf den Arduino in der IDE angezeigt 
werden. Mach davon mal bitte einen Screenshot.

Gruß
Frank

: Bearbeitet durch User
von Chri Z. (belgariad_89)


Lesenswert?

Fehler gefunden!!!
Vielen Dank an Frank L. Es lag an:

if (gsm.begin(4800)){
  Serial.println("\nstatus=READY");
  }
  else Serial.println("\nstatus=IDLE");


sobald dieses nicht mehr im Code auftaucht läuft es. Ich dachte das wäre 
nur zum kontrollieren ob alles i.O. ist.
Die Anruffunktion klappte ja auch schon es ging nur um das annehmen.


Vielen Dank auch nochmal an das Forum für die vielen Bemühungen und 
Antworten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.