Как «отделить» запись от чтения в последовательной шине (Arduino)? - PullRequest
0 голосов
/ 28 января 2019

Я делаю приложения, которые writes in и reads from Arduino (Uno).Я хочу, чтобы Arduino работал только тогда, когда доступны данные (например, слушатель), и записывает каждый раз (периодически используя delay).Но я не знаю, как настроить слушателя (или есть ли способ сделать это), потому что я не хочу, чтобы delay влиял на reading.

 unsigned long timeDelay = 100;   //Some configurations
 String comand;
 char received;
 const int LED = 12;

void setup() {
  //start serial connection
  Serial.begin(9600);
  pinMode(LED, OUTPUT);   //LED is only a way that I know the Arduino is 
  digitalWrite(LED,LOW);  //reading correctly

}

void loop() {
  //How to separate this part--------------Reading from Serieal--------
  comand = "";
  while(Serial.available() > 0){    
    received = Serial.read();
    comand += received;
    if(comand == "DELAY"){            //Processing the command
      timeDelay = Serial.parseInt();
    }
  }
  if(comand == "Desliga"){            //Processing the command
     digitalWrite(LED,LOW);       //'Desliga' means 'turn on' in portuguese
  }
  else if(comand == "Liga"){          //Processing the command
    digitalWrite(LED,HIGH);       //'Liga' means 'turn off' in portuguese
  }
  //-------------------------------------------------------------------

  //From this other part-----------------Writing on Serial-------------
  int sensorValue = analogRead(A0);
  // print out the value you read:
  Serial.println(sensorValue);
  Serial.flush();
  delay(timeDelay);        // delay in between reads for stability
  //-------------------------------------------------------------------
}

OBS: Iя делаю соединение через приложение Java.Так что я могу установить timeDelay там.Если я поставлю timeDelay, как 1000 (мс), то одна написанная мной команда (для включения / выключения LED) будет обрабатываться в течение 1 секунды.Ребята, вы поняли?

У кого-нибудь есть решение?

1 Ответ

0 голосов
/ 28 января 2019

Я бы рекомендовал использовать диспетчер задач для Arduino для запуска вашего аналогового кода.

Я использую TaskAction для этого.

Вы можете обернуть свой аналоговый кодв функции и создайте объект TaskAction:

void AnalogTaskFunction(TaskAction * pThisTask)
{
  int sensorValue = analogRead(A0);
  // print out the value you read:
  Serial.println(sensorValue);
  Serial.flush();
}

static TaskAction AnalogTask(AnalogTaskFunction, 100, INFINITE_TICKS);

, а в своем loop вы можете запустить задачу, а также установить период задачи:

void loop() {
  //How to separate this part--------------Reading from Serieal--------
  comand = "";
  while(Serial.available() > 0){    
    received = Serial.read();
    comand += received;
    if(comand == "DELAY"){            //Processing the command
      AnalogTask.SetInterval(Serial.parseInt()); // Change the task interval
    }
  }
  if(comand == "Desliga"){            //Processing the command
     digitalWrite(LED,LOW);       //'Desliga' means 'turn on' in portuguese
  }
  else if(comand == "Liga"){          //Processing the command
    digitalWrite(LED,HIGH);       //'Liga' means 'turn off' in portuguese
  }

  AnalogTask.tick(); // Run the task
}

Примечание:другие менеджеры задач для Arduino доступны, это только тот, с которым я знаком.Возможно, вы захотите исследовать других.

...