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

Code fails to print out an entire string and ends abruptly

本文关键字:字符串 字符 串并 突然 结束 打印 代码      更新时间:2023-10-16
#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

上面是炮塔.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;的问题.

检查字符串是否不包含NULL字符。这将突然终止字符串。