Ввод в сериал порт

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Необходимо ввести в сериал 7 значений и занести их в разные переменные. Как это сделать? Заранее всех благодарю!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Что означает "ввести в сериал 7 значений"? Ввести ИЗ сериала?

А одно значение можете ввести?

Если можете, то просто сделайте это семь раз.

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Я хочу ввести в сериал одной строкой 7 разных значений, которые в программе необходимо ввести в отдельные переменные.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, Вас же спросили, одно значение Вы можете ввести или нет? 

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Да у меня бред вообще получается! Мне нужно заполнить 7 переменных для даты(Часы реального времени). Кое что накидал. Результат: бесконечно крутит одно и то же. Мне просто нужно переходить с ввода года например к вводу месяца.

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Но одно ввести могу!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Если одно можете, то и сделайте это семь раз.

А если 

Nazar_Diadiun пишет:

Кое что накидал. 

так показывайте

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

Nazar_Diadiun пишет:

Но одно ввести могу!

не могУ, а мОгу!

*сегодня выходной в албанской резервации.

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016
if(Prog == true)
  {
    //-----------------------------------
      Serial.println("Введите Год");
      if (Serial.available() > 0){
      Year = Serial.parseInt();
      delay(250);
      Serial.println("Введите Месяц");
      if (Serial.available() > 0){
      Month = Serial.parseInt();
      delay(250);
      Serial.println("Введите День");
      if (Serial.available() > 0){
      Day = Serial.parseInt();
      delay(250);
      Serial.println("Введите День недели");
      if (Serial.available() > 0){
      DayOfTheWeek = Serial.parseInt();
      delay(250);
      Serial.println("Введите Час");
      if (Serial.available() > 0){
      Hour = Serial.parseInt();
      delay(250);
      Serial.println("Введите Минуту");
      if (Serial.available() > 0){
      Minute = Serial.parseInt();
      delay(250);
      Serial.println("Введите Секунду");
      if (Serial.available() > 0){
      Second = Serial.parseInt();
      delay(250);
      Serial.println(Year);
      Serial.println(Month);
      Serial.println(Day);
      Serial.println(DayOfTheWeek);
      Serial.println(Hour);
      Serial.println(Minute);
      Serial.println(Second);
      }}}}}}}
  }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А полностью выложить? Секртено?

И чего? как это работает?

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

2 ардуинки общаются по NRF24l01+. Одна в качестве контроллера а другая как сервер. если с сервера пульнуть цифру 2, то нужно включить режим программирования часов, и ввести новую дату.

То что я скинул по сути вообще не работает. Постоянно выводит "Введите год" и все!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Значит либо в сериале ничерта нет, либо там нет нормального числа в текстовом виде. Вы же не показываете что Вы там шлёте.

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h> // https://github.com/maniacbug/RF24
boolean Prog = false;

const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба"

RF24 radio(9, 10); // CE, CSN

    int Year; //Год
    int Month; //Месяц
    int Day; //День
    int DayOfTheWeek; //День недели
    int Hour; //Час
    int Minute; //Минута
    int Second; //Секунда


void setup(){
  Serial.begin(9600);
  
  radio.begin();  
  delay(2);
  radio.setChannel(9); // канал (0-127)
  
    // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
    // RF24_250KBPS на nRF24L01 (без +) неработает.
    // меньше скорость, выше чувствительность приемника.
  radio.setDataRate(RF24_1MBPS);     
  
    // мощьность передатчика RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM,
  radio.setPALevel(RF24_PA_HIGH);   
    
  radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe"
  radio.startListening(); // включаем приемник, начинаем слушать трубу
  Serial.println("Введите команду:");
}
 

void loop()   
{
int data[2];
  if (radio.available()){ // проверяем не пришло ли чего в буфер.
    radio.read(&data, sizeof(data)); // читаем данные и указываем сколько байт читать
    
      Serial.print("Humidity (%): ");
      Serial.println(data[1]);
      Serial.print("Temperature (oC): ");
      Serial.println(data[0]); 
  }
  
  

  if (Serial.available() > 0){ // если чтото пришло в сериал
    int val = Serial.parseInt(); // читаем в переменную
    if (val == 1){ // если это 1
      radio.stopListening(); // останавливает приём (нужно перед началом передачи) 
      radio.openWritingPipe(pipe); // открываем трубу на передачу.
      radio.write(&val, sizeof(val)); // отправляем val и указываем сколько байт пакет
      radio.startListening(); // включаем приемник, начинаем слушать трубу
    }
    
    if (val == 2){ // если это 2
      radio.stopListening(); // останавливает приём (нужно перед началом передачи) 
      radio.openWritingPipe(pipe); // открываем трубу на передачу.
      radio.write(&val, sizeof(val)); // отправляем val и указываем сколько байт пакет
      Prog = true;
      radio.write(&Year, sizeof(Year));
      delay(100);
      radio.write(&Month, sizeof(Month));
      delay(100);
      radio.write(&Day, sizeof(Day));
      delay(100);
      radio.write(&DayOfTheWeek, sizeof(DayOfTheWeek));
      delay(100);
      radio.write(&Hour, sizeof(Hour));
      delay(100);
      radio.write(&Minute, sizeof(Minute));
      delay(100);
      radio.write(&Second, sizeof(Second));

      
      
      radio.startListening(); // включаем приемник, начинаем слушать трубу
    }
    Serial.flush(); // очищаем буфер  
  }

  if(Prog == true)
  {
    //-----------------------------------
      Serial.println("Введите Год");
      if (Serial.available() > 0){
      Year = Serial.parseInt();
      delay(250);
      Serial.println("Введите Месяц");
      if (Serial.available() > 0){
      Month = Serial.parseInt();
      delay(250);
      Serial.println("Введите День");
      if (Serial.available() > 0){
      Day = Serial.parseInt();
      delay(250);
      Serial.println("Введите День недели");
      if (Serial.available() > 0){
      DayOfTheWeek = Serial.parseInt();
      delay(250);
      Serial.println("Введите Час");
      if (Serial.available() > 0){
      Hour = Serial.parseInt();
      delay(250);
      Serial.println("Введите Минуту");
      if (Serial.available() > 0){
      Minute = Serial.parseInt();
      delay(250);
      Serial.println("Введите Секунду");
      if (Serial.available() > 0){
      Second = Serial.parseInt();
      delay(250);
      Serial.println(Year);
      Serial.println(Month);
      Serial.println(Day);
      Serial.println(DayOfTheWeek);
      Serial.println(Hour);
      Serial.println(Minute);
      Serial.println(Second);
      }}}}}}}
  }
}
  

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так а чего Вы хотите?

Если туда что-то пришло, Вы это обнаруживаете встроке 54, что-то вычитываете. а в строке 86 очищаете буфер. Поэтом, когда дело доходит до строки 93 в сериале уже нихрена нету - всё вычищено.

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Я просто не могу перейти от ввода года до ввода месяца. Он постоянно предлагает мне ввести год.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И правильно делает. Вы же не проверяете введён уже год или нет, а просто тупо запрашиваете год, если Prog == true

Araris
Offline
Зарегистрирован: 09.11.2012

После вывода подсказки (ст.92) скетч благополучно проскакивает условие if (Serial.available() > 0), переходит к подсказке и т.д, и т.п. То есть скетч не ожидает ввода данных.

И да, после строки 126 стоит поставить Prog == false;

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

А как сделать ожидание ввода?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Nazar_Diadiun пишет:

А как сделать ожидание ввода?

Serial.setTimeout(100500);

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

ЕвгенийП пишет:

Nazar_Diadiun пишет:

А как сделать ожидание ввода?

Serial.setTimeout(100500);

Ахахах, Евгений, 5 баллов :) Так их, ату!

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Спасибо всем! Теперь получилось!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не за что.