Arduino for循环完全不起作用

Arduino for loop completely not functional

我正在尝试从 arduino 将数据从加速度计发送到 Java。我正在使用增量时间将其限制为每 250 毫秒发送一次。问题是所有 Java 程序正在读取的是 setup() 中发送的第一条消息一遍又一遍。我添加了一个测试 Serial.write 来检查程序是否曾经进入增量时间块,并且它似乎正在发送(或至少读取)该消息的前 2 个字符。 arduino代码如下。

#include <SparkFun_MMA8452Q.h>

 int sleepPin = 7;
 int stepPin = 6;
 int buttonPin = 8;
 int stepCount = 0;
 boolean stepMode = true;
 int delTime = 5000;
 MMA8452Q accel; //accelerometer

 void setup(){
  Serial.begin(9600);
  while(millis() < 4000); //wait so I can start java program
  Serial.write("Connected");

  //set pins
  pinMode(sleepPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  pinMode(buttonPin, INPUT);

  digitalWrite(stepPin, HIGH); //starts in step mode

  delTime = millis() + 250;
 }

 void loop(){

  if (digitalRead(buttonPin) == HIGH) stepMode = !stepMode;

  if (millis() > delTime) {
    Serial.write("delTime"); //test case

    //set led's according to mode
    if(stepMode) {
      digitalWrite(stepPin, HIGH);
      digitalWrite(sleepPin, LOW);
    }
    else {
      digitalWrite(stepPin, HIGH);
      digitalWrite(sleepPin, LOW);
    }
    
    //create string to store data
    String data = "";
    if (stepMode) data += "s"; //s is step mode key
    else data += "z"; //z is sleep mode key

    //add actual reading stuff
    data += String(accel.getX()) + "," + String(accel.getY());
    Serial.write(data.c_str()); //send the lad over
  }
 }

Java 端与功能程序几乎相同(没有 if 语句的条件,但这并不重要,因为如果它不满足语句,它只会打印它看到的内容)用于我以前使用过的串行通信。不过,如果需要,我可以包含它。

Java 控制台输出显示为

Connected
de
Connected
de
Connected
de

大约每秒出现一次新的迭代。我在做什么阻止 arduino 发送数据?

还没有一个正确的答案,更多的是测试,但我不能把它放在评论中。

所做的更改:

  • delTime 现在是 unsigned long int;
  • delTime 现在在 loop() 结束时重置;
  • String 对象和操作被对堆更友好的代码所取代。
  • 已添加accel.begin();

让我知道这是否适合您,如果不适合,请告诉我它在哪里抱怨。还没有完全测试代码。您也可以尝试将 accel.getX()accel.getY() 替换为数字;他们 return short int 我想。

顺便说一句,按钮需要去抖动。

#include <SparkFun_MMA8452Q.h>

int sleepPin = 7;
int stepPin = 6;
int buttonPin = 8;
boolean stepMode = true;
unsigned long int delTime = 0;
MMA8452Q accel; //accelerometer

void setup(){
  Serial.begin(9600);
  while(millis() < 4000); //wait so I can start java program
  Serial.write("Connected");

  //set pins
  pinMode(sleepPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  pinMode(buttonPin, INPUT);

  accel.begin();

  digitalWrite(stepPin, HIGH); //starts in step mode

  delTime = millis() + 250;
}

void loop() {
  char str[15];
  if (digitalRead(buttonPin) == HIGH)
    stepMode = !stepMode;
  if (millis() > delTime) {
    //set led's according to mode
    if (stepMode) {
      digitalWrite(stepPin, HIGH);
      digitalWrite(sleepPin, LOW);
      Serial.write('s');
    } else {
      digitalWrite(stepPin, HIGH);
      digitalWrite(sleepPin, LOW);
      Serial.write('z');
    }
    
    sprintf(str, "%d", accel.getX());
    Serial.write(str);
    Serial.write(',');
    sprintf(str, "%d", accel.getY());
    Serial.write(str);
    Serial.write('\n');

    delTime = millis() + 250;
  }
}