2016-07-14 5 views
1
#include "IRSensor.h" 
#include "Turret.h" 
#include "StepperButtonController.h" 
#include "LoadBottleButton.h" 

LoadBottleButton go(A3,1000); 

void setup() 
{ 
    Serial.begin(9600); 
    Serial.println("Port Open"); 
} 

void loop() 
{ 
    if(go.Read()) 
    { 
    go.Monitor(); 
    } 
} 

Oben ist der Hauptcode-Code nicht eine ganze Zeichenfolge auszudrucken und endet abrupt

#ifndef LoadBottleButton_cpp 
#define LoadBottleButton_cpp 

#include "Arduino.h" 
#include "ScaleObject.h" 
#include "LoadBottleButton.h" 
#include "Turret.h" 
#include "StepperButtonController.h" 

ScaleObject* so; 
Turret* tPointer; 

LoadBottleButton::LoadBottleButton(int pin, int debounce):StepperButtonController(pin,debounce) 
{ 

} 
void LoadBottleButton::Monitor() 
{ 
    Serial.println("In Monitor"); 
    while(tPointer->getTurret().BottleCenterState==false) 
    { 
    Serial.println("In Monitor While Loop"); 
    tPointer->Start(); 
    SETUP = true; 
    load = true; 
    unload = !so->getScale().Empty(); 
    Serial.println(load); 
    Serial.println(unload); 
    Serial.println(!so->getScale().Empty()); 
    if(unload) 
    { 
     unload=!so->getScale().Empty(); 
    } 
    else if(load && !so->getScale().Empty()) 
    { 
     load = !tPointer->BottleCentered(); 
    } 
    if(!load && !unload && SETUP) 
    { 
     tPointer->Stop(); 
     SETUP = false; 
    } 
    } 
} 
#endif 

Und oben ist die LoadBottleButtonClass.cpp Datei.

#ifndef Turret_cpp 
#define Turret_cpp 

//#include "HX711.h" 
#include "Turret.h" 
#include "Arduino.h" 
#include "StepperButtonController.h" 
#include "ScaleObject.h" 
#include "IRSensor.h" 

//StepperButtonController Clear(9,1000); 

void StepTurret(); 
Turret turret(2,3,4,StepTurret); 
void StepTurret() 
{ 
    turret.Step(); 
} 

ScaleObject* tso; 
IRSensor* irs; 

Turret::Turret() 
{ 

} 
Turret Turret::getTurret() 
{ 
    return turret; 
} 
Turret::Turret(int en, int dir, int clk, void(*stepFunction)()):stepper2(en,dir,clk,stepFunction) 
{ 
    tso->getScale().tare(); 
    tso->getScale().set_gain(128); 
    tso->getScale().set_scale(-3483.4); 
} 
void Turret::SeekBottleCenter() 
{ 
    Start(); 
    while(irs->IRState()==1) 
    { 
    Serial.println("High"); 
    Serial.println(irs->IRState()); 
    } 
    while(irs->IRState()==0) 
    { 
    Serial.println("Low"); 
    }  
} 
bool Turret::BottleCentered() 
{ 
    return turret.BottleCenterState; 
} 
void Turret::ClearFunction() 
{ 
    wt = tso->getScale().get_units(); 
    while(wt>5) 
    { 
    Serial.println("Clearing"); 
    wt = tso->getScale().get_units(); 
    Rotate(20); 
    } 
} 
#endif 

Und oben ist die Turret.cpp-Datei.

Und oben ist die IRSensor.cpp Datei. Also im Wesentlichen ich drücke die Go-Taste in meinem main deklariert, ruft diese Schaltfläche Monitor in der Datei LoadBottleButton.cpp, diese Methode verwendet einen Revolver Punkt, um Zugriff auf die Turret.cpp Methoden und eine boolean namens BottleCenterState. Aber der Code wird nur so weit, es stoppt nach dem Drucken "In" der Serial.println("In Monitor") Linie. Warum das?

+2

Versuchen Sie, ein minimales, vollständiges und überprüfbares Beispiel zu erstellen (http://stackoverflow.com/help/mcve), den minimalen Code, der zur Replizierung Ihres Problems benötigt wird. Wenn du das tust, ist es eine gute Chance, dass du es selbst herausfinden kannst. Wenn nicht, von einer einfachen Basis ausgehend, und dann Schritt für Schritt Funktionen und Funktionen hinzugefügt werden, um jeden Schritt auf dem Weg zu testen, hilft normalerweise Code, der funktioniert. –

Antwort

1

Zählen Sie nicht auf die Ausgabe, um Ihnen zu sagen, wo der Fehler ist. Dieser serielle Druck wurde möglicherweise erfolgreich abgeschlossen, und die Nachricht wird in einem Ausgabestrom gepuffert, der auf eine Chance wartet, in den seriellen Port geschrieben zu werden.

Eine viel wahrscheinliche Ursache des Absturzes ist die Zeile unterhalb des Seriendrucks.

Serial.println("In Monitor"); 
while(tPointer->getTurret().BottleCenterState==false) 

tPointer verwendet wird und ich nicht überall in der mitgelieferten Code sehen sie einen gültigen, dereferencable Zeiger zugeordnet ist. Die Dereferenzierung eines nicht definierten Zeigers führt zu undefiniertem Verhalten und in diesem Fall wahrscheinlich zu einem Absturz. Auch wenn es nicht der Absturz ist, den Sie sehen, ist dies mit ziemlicher Sicherheit falsch.

Wie es zu beheben?

Aus dem bereitgestellten Code sieht es nicht aus wie tpointer muss ein Zeiger überhaupt sein.

Kann alles sein, was Sie brauchen. Die Zuteilung von turret eliminiert die Möglichkeit von Fehlern in der Zeiger- und Speicherverwaltung statisch und verringert die Wahrscheinlichkeit von Lecks. Ansonsten

,

Turret* tPointer = new Turret(); 

Aber das lässt Sie mit dem Problem, wie und wann Sie delete tPointer;.

0

Überprüfen Sie, ob Ihre Zeichenfolge kein Zeichen NULL enthält. Dies wird die Saite abrupt beenden.

Verwandte Themen