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

Mestniy96
Offline
Зарегистрирован: 31.08.2015
String brightness = "";
int i;
void setup()
{
Serial.begin(9600);
}
void loop()
{
while (Serial.available() > 0) {  //если есть доступные данные
    char inChar = Serial.read();    //считываем байт
    brightness += inChar;    //собираем информацию в строку
    delay(i);
    if (inChar == ';')
    {
     i += inChar;  
    }
}

 

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Вопрос в том, что я буду отправлять на ардуино значения типа: "21;".

Не будет ли мешать знак ;?

Зараее спасибо!

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Хочется паузу внешне менять.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Не вижу, где он может мешать...

Mestniy96
Offline
Зарегистрирован: 31.08.2015

ТОесть. Пауза будет равна 21 мс, если я отправлю "21;"? Простите за нубский вопрос!

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Mestniy96 пишет:

ТОесть. Пауза будет равна 21 мс, если я отправлю "21;"? Простите за нубский вопрос!

Вряд ли... Лучше опишите задачу...Просто менять паузу и все? А с 13 по 16 строка для чего?

Mestniy96
Offline
Зарегистрирован: 31.08.2015

с 13-16 - это как раз и есть прием данных в виде: "цыфра;". И эта штука записывается в переменную i.

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

Бред какой-то. А зачем точку с запятой к i прибавлять в 15-ой строке?

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Есть программа на Lazarus. Хочу на ардуино менять значение в delay().

Andrey-S
Offline
Зарегистрирован: 02.01.2015

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

Бред какой-то. А зачем точку с запятой к i прибавлять в 15-ой строке?

Тут смахивает на полное непонимание того, что написано...

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Дело в том, что я паралельно отправляю и другие значения для управления светодиодом. И что-бы хоть как-то ограничить показания, я для яркости сделал знак ".", а для паузы знак ";".

Andrey-S
Offline
Зарегистрирован: 02.01.2015

В Вашем случае пауза стоит внутри цикла считывания данных с SERIAL,а не там, где скорее всего надо... Ваша строка  String вообще не обнуляется нигде (и не используется даже), следовательно начнет расти....

Mestniy96
Offline
Зарегистрирован: 31.08.2015

А я забыл добавить. В конце внутреннего цикла стоит 

:

brightness="";

 

Mestniy96
Offline
Зарегистрирован: 31.08.2015

brightness нужна для управления яркостью. А i для управления паузой.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Если Вам нужно отправить паузу 21мсек, то сначала вы заносите это значение по байтам в строку brightness (что, собственно, Вы и делаетеи далее после цикла надо бы

i=brightness.toInt();
brightness="";

 

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Получается 

i += inChar;

Не нужно?

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Andrey-S пишет:

Если Вам нужно отправить паузу 21мсек, то сначала вы заносите это значение по байтам в строку brightness (что, собственно, Вы и делаетеи далее после цикла надо бы

i=brightness.toInt();
brightness="";

 

А символ ";" убирается при конвертации String в int?

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Mestniy96 пишет:

Получается 

i += inChar;

Не нужно?

Вообще ерунда какая-то... Вам зачем символ ';'?

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Andrey-S пишет:

Mestniy96 пишет:

Получается 

i += inChar;

Не нужно?

Вообще ерунда какая-то... Вам зачем символ ';'?

А как без знаков разделять типы данных? Мне нужно 2 типа: один для яркости светодиода, которое принимается числом с символом ".", а другой для паузы, который принимается числом с символом ";".

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Дык если и то и то у вас число, то и тип данных один... Пишите, к примеру, "х21" - установить паузу равную 21мсек, а y100 - установить яркость равную 100... И парсите строку уже как хотите... Хоть по-символьно, хоть, например, через indexOf()... 

Mestniy96
Offline
Зарегистрирован: 31.08.2015

А в чем недостаток ;?

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Тут смысл в чем: если приходит, например, х21, то очень удобно парсить... Если первым символом пришел 'у', то значит далее число будет относится к яркости, а если первым символом пришел 'х'- то далее будет значение паузы...Можно и ';' ставить вместо 'x', но впереди... Это при посимвольном парсинге... 

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Я правильно понял:

String brightness = "";
int i;
void setup()
{
Serial.begin(9600);
}
void loop()
{
while (Serial.available() > 0) {  //если есть доступные данные
    char inChar = Serial.read();    //считываем байт
    brightness += inChar;    //собираем информацию в строку
    delay(i);
    if (inChar == ';')
    {
     i=brightness.toInt();
       brightness="";
    }
}

Я отправляю ";20" и значение i беднт = 20.

Все верно?

Alexino
Offline
Зарегистрирован: 29.12.2015

Mestniy96, обязательно отправлять данные в текстовом виде ? Отправляйте бинарными, и парсить ничего не придётся.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Mestniy96 пишет:

Я правильно понял:...

Если в этом случае отправить ";20", то в первом же проходе цикла while считается ';' и 'i' присвоится значение строки, которая еще пустая(в ней будет только этот символ ;)... А вообще быстрее пробовать самому и выводить результат в Serial... Отправьте "20;" и посмотрите результат... Подкорректируйте, если результат не соответствует ожиданиям)

Alexino
Offline
Зарегистрирован: 29.12.2015










Как то, примерно, так :










  
  char str[20];
  struct{
    unsigned long   d1;
    unsigned long   d2;
  }data={0, 0};
  unsigned long   *pl=&data.d1;
  
 void setup() {
  Serial.begin(9600);
 }

  
 void loop()  {
    
 while (Serial.available() > 0) { 
      char inChar = Serial.read();

      //------------------
      if(inChar==';'){
        pl++;
      } 
      //------------------
      if((inChar>='0') && (inChar<='9')){
       *pl*=10;
       *pl+=inChar-'0';        
      }
      //------------------
      if(inChar==13){   // '\n'
        Serial.write(13);   // '\n'
        Serial.write("d1=");
        ltoa( data.d1, str ,  10);  
        Serial.write(str);
        Serial.write(", ");
        Serial.write("d2=");
        ltoa( data.d2, str ,  10);  
        Serial.write(str);
        Serial.write(13);   // '\n'
        
        data.d1=data.d2=0;
        pl=&data.d1;
        
        continue;
      }
      //------------------      
      Serial.write(inChar); // echo

  }
 
  }



Вводим в терминале например "1234;5678" и жмём энтер. Данные укладываются в data.d1/d2 и выводятся в терминал с новой строки.
Вводимые символы повторяются эхом.

 

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Спасибо всем. Буду пробовать!

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Mestniy96 пишет:
А как без знаков разделять типы данных? Мне нужно 2 типа: один для яркости светодиода, которое принимается числом с символом ".", а другой для паузы, который принимается числом с символом ";".

Можно вообще командную строку сварганить:


  Serial.println("Enter text command and value com separator. Example: lumi 87"); 
  // lumi - команда изменения яркости, 87 - числовой параметр
  while(!Serial.available());
  String command;
  if(Serial.available() > 0)
  {
    command = Serial.readStringUntil(' ');
    x = Serial.parseInt();
    Serial.print(">I received: command = ");
    Serial.print(command);
    Serial.print(", x = ");
    Serial.println(x);
    if(command == "lumi")
    {
      analogWrite(A0, x);
      Serial.print(">pin A0 is set to ");
      Serial.println(x);
    }
    else if(command == "pause")
    {
      Serial.print(">pause set to ");
      Serial.println(x);
      delay(x);
    }
  }

 

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Спасибо Tomasina. Но я управляю не через терминал, а через программу.

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

А в чем разница между терминалом и "другой программой"? Главное принцип обмена, протокол, а терминалом, другой программой или еще чем - это не принципиально.

 

Alexino
Offline
Зарегистрирован: 29.12.2015

Немного непонятно, для чего управлять устройством из программы с помощью текстовых сообщений ? Лучше придумать свой протокол, со всеми плюшками типа CRC. А то получается, в программе конвертируем числа в текст, передаём его, а в девайсе обратно преобразовываем в числа. Не геморно ? Ещё и учитывая, что при строковых сообщениях отправляется больше данных, а значит вероятность прихода их кривыми - увеличивается.

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

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

Бред какой-то. А зачем точку с запятой к i прибавлять в 15-ой строке?

Женя ман прочитай сначала!

lex2k
Offline
Зарегистрирован: 17.12.2015
есть программа. имеет два канала упраления 1 - по темперетуре 2- по времени. время и температура ВКЛ и ВЫКЛ устанавливается через блютуф c Android девайса 
контролер Duemilanove на 168, время берется с DS3231, температура с DHT11.  блютуф HC-05. время и температура ВКЛ и ВЫКЛ раз в сутки сохраняются в eeprom  на DS3231
есть тест вкл\выкл реле.
кому надо?
at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

lex2k пишет:

есть программа. имеет два канала упраления 1 - по темперетуре 2- по времени. время и температура ВКЛ и ВЫКЛ устанавливается через блютуф c Android девайса 
контролер Duemilanove на 168, время берется с DS3231, температура с DHT11.  блютуф HC-05. время и температура ВКЛ и ВЫКЛ раз в сутки сохраняются в eeprom  на DS3231
есть тест вкл\выкл реле.
кому надо?

Ну положи в общий доступ - я тут намедни все искал как правильно сделать....

Ну если не ноу-хау %(