Dalton Moore
Dalton Moore

Reputation: 69

Code fails to print out an entire string and ends abruptly

#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();
  }
}

Above is the Main code

#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

And above is the LoadBottleButtonClass.cpp file.

#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

And above is the Turret.cpp file.

#ifndef IRSensor_cpp
#define IRSensor_cpp

#include "Arduino.h"
#include "IRSensor.h"
IRSensor i(5);
IRSensor::IRSensor(int pin)
{
  IRSensorPin = pin;
  pinMode(pin,INPUT);
}
int IRSensor::IRState()
{
  return digitalRead(i.IRSensorPin);
}
#endif

And above is the IRSensor.cpp file. So essentially I press the go button declared in my main, that button calls monitor in the LoadBottleButton.cpp file, that method uses a turret point to get access to the Turret.cpp methods and a boolean named BottleCenterState. But the code only gets so far, it stops after printing "In" of the Serial.println("In Monitor") line. Why is that?

Upvotes: 1

Views: 50

Answers (2)

user4581301
user4581301

Reputation: 33932

Don't count on the output to tell you where the error is. That serial print may have completed successfully and the message is buffered in an output stream waiting for a chance to be written to the serial port.

A much more likely cause of the crash is the line below the serial print.

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

tPointer is used and I don't see anywhere in the provided code it is assigned a valid, dereferencable pointer. Dereferencing an undefined pointer results in undefined behaviour, and in this case probably a crash. Even if it isn't the crash you are seeing, this is almost certainly wrong.

How to fix it?

From the code provided it doesn't look like tpointer needs to be a pointer at all.

Turret turret;

May be all you need. Allocating turret statically eliminates the possibility of pointer and memory management bugs and reduces the chance of leaks.

Otherwise,

Turret* tPointer = new Turret();

But this leaves you with the problem of how and when do you delete tPointer;.

Upvotes: 1

contracode
contracode

Reputation: 405

Check that your string doesn't contain a NULL character. This will terminate the string abruptly.

Upvotes: 0

Related Questions