Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的序列号通过串行监视器在Arduino IDE上打印两次?_C++_Arduino - Fatal编程技术网

C++ 为什么我的序列号通过串行监视器在Arduino IDE上打印两次?

C++ 为什么我的序列号通过串行监视器在Arduino IDE上打印两次?,c++,arduino,C++,Arduino,我只输入了一个“打印命令”,但是我得到了两个打印读取 该程序驱动两个步进电机。 moveSteps值=48 当程序开始运行时,电机短暂停止并打印'48',然后在程序结束前触发if时再次打印'48' 只能打印一个“48”。你知道为什么会这样吗 /* Precise movement with stop Moves the robot 20mm forwards and 20mm backwards Rob Miles (edited by Dileepa Ranawake)

我只输入了一个“打印命令”,但是我得到了两个打印读取

该程序驱动两个步进电机。 moveSteps值=48

当程序开始运行时,电机短暂停止并打印'48',然后在程序结束前触发if时再次打印'48'

只能打印一个“48”。你知道为什么会这样吗

 /*
  Precise movement with stop 

  Moves the robot 20mm forwards and 20mm backwards 

  Rob Miles (edited by Dileepa Ranawake)

  April 2017
  Version 1.0

 */

int motorDelay;

byte left1,left2,left3,left4;

byte right1,right2,right3,right4;

float wheelDiameter = 68.5;
float stepsPerRevolution = 512;
float mmsPerStep = (wheelDiameter * 3.1416) / stepsPerRevolution;

int moveCount;
int moveSteps;  // number of steps the motor is to move 

void leftForwards()
{
  left1=7; left2=6; left3=5; left4=4;
}

void leftReverse()
{
  left1=4; left2=5; left3=6; left4=7;
}

void rightForwards()
{
  right1=8; right2=9; right3=10; right4=11;
}

void rightReverse()
{
  right1=11; right2=10; right3=9; right4=8;
}

int calculateDistanceSteps(float distanceInMM)
{
  return distanceInMM / mmsPerStep + 0.5;
}

void setup() {
  leftForwards();  
  rightForwards();

  pinMode(left1,OUTPUT);
  pinMode(left2,OUTPUT);
  pinMode(left3,OUTPUT);
  pinMode(left4,OUTPUT);
  digitalWrite(left1,HIGH);

  pinMode(right1,OUTPUT);
  pinMode(right2,OUTPUT);
  pinMode(right3,OUTPUT);
  pinMode(right4,OUTPUT);
  digitalWrite(right1,HIGH);

  motorDelay=1200;

  moveCount=0;
  moveSteps = calculateDistanceSteps(20);
  Serial.begin(9800);

}

void loop() {

  moveCount = moveCount + 1;

  if (moveCount==moveSteps) 
  {
  digitalWrite(left1,LOW);
  digitalWrite(right1,LOW);
  Serial.println(moveCount);
  exit(0);
  }

  digitalWrite(left2,HIGH);
  digitalWrite(right2,HIGH);
  delayMicroseconds(motorDelay);
  digitalWrite(left1,LOW);
  digitalWrite(right1,LOW);
  delayMicroseconds(motorDelay);
  digitalWrite(left3,HIGH);
  digitalWrite(right3,HIGH);
  delayMicroseconds(motorDelay);
  digitalWrite(left2,LOW);
  digitalWrite(right2,LOW);
  delayMicroseconds(motorDelay);
  digitalWrite(left4,HIGH);
  digitalWrite(right4,HIGH);
  delayMicroseconds(motorDelay);
  digitalWrite(left3,LOW);
  digitalWrite(right3,LOW);
  delayMicroseconds(motorDelay);
  digitalWrite(left1,HIGH);
  digitalWrite(right1,HIGH);
  delayMicroseconds(motorDelay);
  digitalWrite(left4,LOW);
  digitalWrite(right4,LOW);
  delayMicroseconds(motorDelay);

}
串行监视器输出4848

我还注意到,只要打开串行监视器,步进电机就会移动

对Arduino使用
exit()
不是标准配置。它基本上禁用所有中断并进入无限循环。您可以像这样重新构造
循环()
,以避免它:

void loop()
{
    // Still moving?
    if (moveCount < moveSteps) {
        moveCount = moveCount + 1;

        // Move complete
        if (moveCount == moveSteps) 
        {
            digitalWrite(left1,LOW);
            digitalWrite(right1,LOW);
            Serial.println(moveCount);
        }
        else {
            digitalWrite(left2,HIGH);
            digitalWrite(right2,HIGH);
            //etc.....
        }
    }
}
void循环()
{
//还在动吗?
if(moveCount
此外,环路延迟1200µs 8x。这仅为1200×8=9600µs=9.6毫秒。如果
moveSteps=48
,则整个循环仅需460.8毫秒。在打开串行监视器之前,程序运行一次,然后在打开后第二次运行。如果在打开串行监视器后按下重置按钮,会发生什么情况

你考虑过使用Arduino内置的吗


<>最后,在以后,考虑这样的问题。

两个注释:<代码> 9800 /代码>不是标准波特率-<代码> 9600 < /代码>。打开串行监视器时,Arduino将重置。而且,从Arduino调用
exit()
也是不标准的。谢谢@JohnnyMopp我已经更新了这两个选项—(用9600替换了9800,用“return;”替换了“exit(0)”,但是我仍然得到了重复的串行监视器读数,现在电机继续运行。谢谢@johnny Mopp-这很有意义,当我按下“重置”时,程序只运行一次(并返回一个值)。我听说过这些库,虽然我对编码还很陌生,所以我想做一段很长的路,所以我理解硬件组件+软件正在做什么/练习编写功能等。感谢您链接到arduino.se-我甚至不知道这是一件事!我感谢您的帮助。Dee