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

标签 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 方法和一个名为 BottleCenterStateboolean。但是代码只到此为止,它在打印 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/

相关文章:

c++ - 数组损坏其字符 C++

c++ - 进程间对象传递

c++ - 在 C++ 中按值迭代?

c - 如何定义 esp32 arduino ble 扫描结果的回调

C++在函数中分配动态内存 - 新手问题

pointers - 在 Go 中取消引用指针

c++ - 在 Teensy 3.6 上使用 ADC

c++ - 在 GPU 上测量时间

c++ - Boost 程序选项语法

c - *( (int *)ptr+1) 的含义