繁体   English   中英

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 控制台 output 显示为:

Connected
de
Connected
de
Connected
de

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

还不是一个正确的答案,更多的是测试,但我无法将其放入评论中。

所做的更改:

  • delTime现在是一个unsigned long int
  • delTime现在在loop()结束时重置;
  • String object 和操作被堆友好代码取代。
  • 添加accel.begin();

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

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

#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;
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM