C++ 为什么我的序列号通过串行监视器在Arduino IDE上打印两次?
我只输入了一个“打印命令”,但是我得到了两个打印读取 该程序驱动两个步进电机。 moveSteps值=48 当程序开始运行时,电机短暂停止并打印'48',然后在程序结束前触发if时再次打印'48' 只能打印一个“48”。你知道为什么会这样吗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)
/*
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