代码无法打印出整个字符串并突然结束

时间:2016-07-14 18:11:01

标签: c++ pointers arduino

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

以上是主要代码

#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

以上是LoadBottleButtonClass.cpp文件。

#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

以上是Turret.cpp文件。

#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

以上是IRSensor.cpp文件。所以基本上我按下main中声明的go按钮,该按钮调用LoadBottleButton.cpp文件中的监视器,该方法使用炮塔点来访问Turret.cpp方法和{{{ 1}}名为boolean。但代码只到目前为止,它在打印BottleCenterState行的“In”后停止。那是为什么?

2 个答案:

答案 0 :(得分:1)

不要指望输出告诉你错误的位置。该串行打印可能已成功完成,并且消息在输出流中缓冲,等待有机会写入串行端口。

更可能的原因是串行打印下面的行。

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

tPointer被使用,我没有在提供的代码中看到它被分配了一个有效的,可解除引用的指针。取消引用未定义的指针会导致未定义的行为,在这种情况下可能会发生崩溃。即使不是你看到的崩溃,这几乎肯定是错误的。

如何解决?

从提供的代码来看,tpointer看起来根本不需要指针。

Turret turret;

可能就是您所需要的一切。静态分配turret可以消除指针和内存管理错误的可能性,并减少泄漏的可能性。

否则,

Turret* tPointer = new Turret();

但这会让您了解delete tPointer;的方式和时间。

答案 1 :(得分:0)

检查您的字符串是否包含NULL个字符。这会突然终止字符串。