#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
方法和一个名为 BottleCenterState
的 boolean
。但是代码只到此为止,它在打印 Serial.println("In Monitor")
行的“In
”后停止。这是为什么?
最佳答案
不要指望输出会告诉您错误在哪里。该串行打印可能已成功完成,消息被缓冲在输出流中,等待将其写入串行端口的机会。
崩溃的更可能原因是串行打印下方的行。
Serial.println("In Monitor");
while(tPointer->getTurret().BottleCenterState==false)
tPointer
被使用,我在提供的代码中没有看到它被分配了一个有效的、可取消引用的指针。取消引用未定义的指针会导致未定义的行为,在这种情况下可能会导致崩溃。即使这不是您看到的崩溃,这也几乎可以肯定是错误的。
如何解决?
从提供的代码看来,tpointer
根本不需要是一个指针。
Turret turret;
可能就是您所需要的。静态分配 turret
消除了指针和内存管理错误的可能性,并减少了泄漏的可能性。
否则,
Turret* tPointer = new Turret();
但这给您留下了如何以及何时delete tPointer;
的问题。
关于c++ - 代码无法打印出整个字符串并突然结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38381319/