#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
”后停止。那是为什么?
答案 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
个字符。这会突然终止字符串。