Ввод данных в порт (HELP)

fotorobot
Offline
Зарегистрирован: 07.11.2016

Всем здррасте))) Это снова Я со соими вопросами))) Вчера вроде разобрались как ардовину научить выполнять комманды и ведь все здорово, выполняет, и вроде всем спасибо, все свбодны, но не тут то было... Не долго музыка играла, а светодиод мигал))

Ситуация следующая мне необзодимо подаять команду на запись некоторого числа в переменную. Ну собственно комманду он принимает, ждет ввода данных... я их ввожу, а он негодяй вбивает в них "-1" и нечего другого ....

в ожидании использую Serial.available(); . удалось определить что "-1" это возврат отсутствия данных от сериалавалибал... но я введь ее ввожу... в общем как то так... 

а еще может кто подскажет как задавать значение переменной совместно в коммандой? Например: led_blink_set_234 - 234 - число которое нужно затолкать....

вот мой код

String data;
boolean bl = true;
boolean led = false;
int ledPin = 2;
boolean a = false;
int ms = 249;
void setup(){
  pinMode(ledPin,OUTPUT);
  digitalWrite(ledPin,LOW);
  Serial.begin(9600);
  Serial.setTimeout(5);
}
void loop(){


    if (led == true) {digitalWrite(ledPin,HIGH);}
    //Serial.print(ms);
    if (led == false) {digitalWrite(ledPin, LOW);}
  if (bl == true) {led = !led; delay(50);}
  
}

void serialEvent() {
  //if (Serial.available()>0)
  //{
    data = Serial.readString();
    data.trim();
    Serial.println("=> " + data);
   //}
   if (a == false && data == "halo"){Serial.println("Vasabi)"); a=true;}
   if (a == true && data == "help")
    {
      Serial.println("BukaCorp");
      Serial.println("Help text");
      Serial.println("Commands:");
      Serial.println("led_on - ON all LED");
      Serial.println("led_off - OFF all LED");
      Serial.println("led_blink - Blink LED");
      Serial.println("led_status - Print status LED");
    }
   if (a==true && data == "led_on") {led =true; bl = false;}
   if (a == true && data == "led_off"){led = false; bl = false;}
   if (a == true && data == "led_blink"){bl = true;}
   //if (a == true && data == "led_blink_off"){bl = false;}
   if (a == 1 && data == "led_blink_set")
    {
      Serial.println("Set blink time ms:");
     while(!Serial.available()){
     ms = Serial.read();
         }
   Serial.println(ms);   
    }
   if (a == true && data == "led_status" && bl == false)
      {
     Serial.print("LED status: ");
     if (led == true) {Serial.println("ON");}    
     if (led == false) {Serial.println("OFF");}
      }
   if (a == true && data == "led_status" && bl == true)
   {
    Serial.println("LED status: Blink");
   }
   
}

 

fotorobot
Offline
Зарегистрирован: 07.11.2016

или как в Стринге найти число и затолкать его в ИНТ?

fotorobot
Offline
Зарегистрирован: 07.11.2016

Калапуций давай без ругани... говорил же что я пошел другим путем а и твой код что то под сриал е поет...

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

fotorobot пишет:

Калапуций давай без ругани... говорил же что я пошел другим путем а и твой код что то под сриал е поет...

с чего бы это моему коду под сериал не работать?

fotorobot
Offline
Зарегистрирован: 07.11.2016

сам проверял???

fotorobot
Offline
Зарегистрирован: 07.11.2016

это было во первых...

во вторых где в твоем коде поиск в объекте числа??? или преобразование объекта в число...

я же по Русски написал что пошел другим путем... 

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

fotorobot пишет:

сам проверял???

ок. аргументировано обоснуй, почему мой код не может работать с сериалом - что в нём такого, чего нет в сериале?

fotorobot
Offline
Зарегистрирован: 07.11.2016

погоди секунду...

 

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

ок.

я не буду измываться - просто замени DigiUSB на Serial, DigiUSB.tx_remaining() на Serial.availableForWrite(), удали DigiUSB.delay(1) и DigiUSB.begin(), добавь Serial.begin(хххх) - всё

fotorobot
Offline
Зарегистрирован: 07.11.2016
void setup() {
pinMode(14, OUTPUT); // LED_01
digitalWrite(14, 1);
pinMode(15, OUTPUT); // LED_02
digitalWrite(15, 1);
Serial.begin(9600);
}
void loop() {
if (Serial.available()) { // в USB что-то есть.
char a = Serial.read(); // считать символ из USB в переменную.
static String b = ""; // объявление переменной строки.
if (a != '\b') {b = b + a;               } // дописать символ в конец строки, если это не символ клавиши Backspace.
if (a == '\b') {b.remove(b.length() - 1);} // удалить последний символ строки, если получен символ клавиши Backspace.
if (a == '\n') {                           // если получен символ клавиши Enter.
// эхо строки. (необязательная часть кода, используется для отладки)
//if (DigiUSB.tx_remaining() > (b.length() + 1)) { // проверка места в буфере USB для строки длиной + 1 символ.
Serial.print(b); // печать в DigiUSB собранной строки.
}
// что-то делаем, после получения символа клавиши Enter.
if (b == "LED_01 on\n") {digitalWrite(14, 0);} // зажечь светодиод, если принята строка ххх\n.
if (b == "LED_01 of\n") {digitalWrite(14, 1);} // погасить светодиод, если принята строка ххх\n.
if (b == "LED_02 on\n") {digitalWrite(15, 0);} // зажечь светодиод, если принята строка ххх\n.
if (b == "LED_02 of\n") {digitalWrite(15, 1);} // погасить светодиод, если принята строка ххх\n.
b = ""; // очистка строки.
}
delay(1);
}

ничего не забыл?

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

 

 

delay(1); удалить

//if (DigiUSB.tx_remaining() > (b.length() + 1)) { // проверка места в буфере USB для строки длиной + 1 символ.

раскомментировать  DigiUSB.tx_remaining() на Serial.availableForWrite()

fotorobot
Offline
Зарегистрирован: 07.11.2016

давай по порядку

1 - по этому поводу я добился результатов при помощи класса String

я так понимаю что разница нишь в том что у тебя строка собирается  а у меня целиком падает... мы скажем пришли к одному и тому же разными путями... н вопрос остался открытым... Как в Стринге отдельть число от текта в переменную?? потому что и ты и я помещаем данные в стринг)

а по поводу кода бэза бес норм код... личто на затупил с Serial.availableForWrite(); спс за подсказку.... 

 

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

fotorobot пишет:

Как в Стринге отдельть число от текта в переменную??

тебе не нужно в стринге отделять число - работай с приёмом посимвольно: когда приходит цифра, складывай её в отдельную строку. достаточно завести две строки - пусть одна будет текст, вторая - цифры, строку с цифрами переведёшь в число toInt() по условию получения символа перевода строки или просто буквы

fotorobot
Offline
Зарегистрирован: 07.11.2016

ну тогда рассказывай как разделять число от симвоа)))

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

fotorobot пишет:

ну тогда рассказывай как разделять число от симвоа)))

тю.

if(цифра) {} else {};

fotorobot
Offline
Зарегистрирован: 07.11.2016

что то вроде

if(a=1){тра та та} else {ту ту ту}

iif(a=2) {тра тта та} else {ту ту ту}

и т.д.???

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

fotorobot пишет:

что то вроде

if(a=1){тра та та} else {ту ту ту}

iif(a=2) {тра тта та} else {ту ту ту}

и т.д.???

if(a == 0 || a == 1 ||... a == 9){прибавить символ к концу строки цифр} else {прибавить символ к концу строки всего остального}

на тебе для ознакомления таблицу символов ascii http://book.itep.ru/10/ascii.htm - будешь знать, что у тебя по сериалу летает, кроме цифр и букв 

 

fotorobot
Offline
Зарегистрирован: 07.11.2016

СПС) ну рас уж пошлла такая пьянка может ты подскажес как по среди цикла его заставить подождать ввода цифр???

 

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

fotorobot пишет:

СПС) ну рас уж пошлла такая пьянка может ты подскажес как по среди цикла его заставить подождать ввода цифр???

не нужно ничего ждать - принимай все символы, проверяй ифами - цифра это или нет, если нет пусть улетает в никуда и считывается следующий символ.

какой, нафиг, цикл? - собрался превратить МК в кирпич, ожидая своих цифр?

fotorobot
Offline
Зарегистрирован: 07.11.2016

я в том плане - ввожу комманду, от мне в ответ.. введите число.. я ему ввожу и цикл продолжается...

 

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

fotorobot пишет:

я в том плане - ввожу комманду, от мне в ответ.. введите число.. я ему ввожу и цикл продолжается...

значит так - забудь слово цикл while

у тебя всё крутится в цикле loop() - этого тебе достаточно.

ифами проверяешь наличие чего-то в сериале - .available()

если там буквы, складываешь эти буквы в строку букв, строку проверяешь на соответсвие коммандам, если соответсвует, то печатаешь в сериал "введите цифру"

если там цифры, складываешь эти цифры в строку цифр, по условию приёма символа перевода строки или чего-то другого, свидетельсвующего, что ты все цифры набрал - что-то делаешь: превращаешь строку цифр в число, которое записываешь в переменную.

fotorobot
Offline
Зарегистрирован: 07.11.2016

 ок... буду пытаться)))

 

fotorobot
Offline
Зарегистрирован: 07.11.2016

спасибо за помощь, но альтернативный вариант я все же нашел))) сначала ввод данных а потом поиск там чисел)))

void serialEvent() {
    String data;
    String num;
     data = Serial.readString();  
 if ( !data.indexOf("led_blink_set"))
    { 
     num = data.substring(13);
     ms = num.toInt();
     }

 

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

fotorobot пишет:

спасибо за помощь, но альтернативный вариант я все же нашел))) сначала ввод данных а потом поиск там чисел)))

void serialEvent() {
    String data;
    String num;
     data = Serial.readString();  
 if ( !data.indexOf("led_blink_set"))
    { 
     num = data.substring(13);
     ms = num.toInt();
     }

 

ты проверял? - пошли в сериал "xxxxxxled_blink_setxxxxxxx"

fotorobot
Offline
Зарегистрирован: 07.11.2016

"xxxxled_blink_setxxxx@ -в такой форме он не будет знать комманды... 

в этом скетче отн сначала считывает комманду, а ужже относительно нее изменяет переменную.... 

допустим "led_blink_set 123" это изменение частоты мерцания

а "led_set 2" это изменит мигающий светодиод

"blink_set 3" изменит форму мерцания...

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

 

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

fotorobot пишет:

"xxxxled_blink_setxxxx@ -в такой форме он не будет знать комманды... 

ты проверил, что произойдёт при вводе led_blink_setx?