Как считать данные с терминала, Serial.read()

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Добрый день и всех с праздником Благовещения!

Такой вопрос. Отлаживаю скетч и пока не пришли датчики, надо как-то присваивать переменным числовые значения. Других вариантов, кроме терминала - не вижу. Но есть проблема: не пойму как.

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

Подскажите как это делается!

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014
cani1974
Offline
Зарегистрирован: 03.04.2016
//urok ot Dmitriya Osipova - upravleniye Arduino IK pul?tom
#include <IRremote.h> // eto skachannaya biblioteka

int RECV_PIN = 11; //vkhod IK priyemnika
IRrecv irrecv(RECV_PIN);
decode_results results;
int a=0; // peremennaya pereklyucheniya rezhima , pri nazhatii knopki ona prinimayet znacheniye +1
int b=0; //
int c=0; //
int d=0; //
int e=0; //
int f=0; //
int g=0; //
 

void setup()
{
irrecv.enableIRIn(); // vklyuchit? priyemnik

pinMode(13, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT); // naznachayem piny kak vykhody
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);

} 

void loop() {
if (irrecv.decode(&results)) {
delay(300); // zaderzhka pered vypolneniyem opredeleniya knopok , chtoby izbezhat? bystroye dvoynoye nazhatiye

if (results.value == 0x1000809) {a=a+1;} // obrabotka nazhitya klavishi , zdes? peremennaya prinimayet znacheniye +1
if (results.value == 0x1008889) {b=b+1;} //VAZHNO !!! ( 1008889 ) Eto kod knopki № 2 - moyego pul?ta ot televizora Panasonic - u vashego pul?ta budet drugoy kod - zamenite na svoy
if (results.value == 0x1004849) {c=c+1;}
if (results.value == 0x100C8C9) {d=d+1;}
if (results.value == 0x1002829) {e=e+1;}
if (results.value == 0x100A8A9) {f=f+1;}
if (results.value == 0x1006869) {g=g+1;}

// nachinayem vklyuchat? svetodiody na pinakh
if (a==1){digitalWrite(13, HIGH);} else {digitalWrite(13, LOW); a=0;} // deystviye posle nazhatiya knopki , yesli peremennaya stala ravna 1 to
if (b==1){digitalWrite(2, HIGH);} else {digitalWrite(2, LOW); b=0;} // proizvesti pereklyucheniye pina v rezhim HIGH, yesli zhe net to vernut? peremennuyu v iskhodnoye sostoyaniye
if (c==1){digitalWrite(3, HIGH);} else {digitalWrite(3, LOW); c=0;} // Destviye mozhet byt? drugim
if (d==1){digitalWrite(4, HIGH);} else {digitalWrite(4, LOW); d=0;} // Destviye posle nazhatiya knopki  
if (e==1){digitalWrite(5, HIGH);} else {digitalWrite(5, LOW); e=0;} // Destviye posle nazhatiya knopki
if (f==1){digitalWrite(6, HIGH);} else {digitalWrite(6, LOW); f=0;} // Destviye posle nazhatiya knopki
if (g==1){digitalWrite(7, HIGH);} else {digitalWrite(7, LOW); g=0;} // Destviye posle nazhatiya knopki

{ //
delay(50); //pauza mezhdu povtorami //
} //
irrecv.resume(); // 

}

}

 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Счя разберем. Спасибо.

--------------------------

Мда, несколько замысловато, конечно - передавать не сами введенные символы, а их байтовые значения. Чувствую себя Джеймсом Бондом, которому предстоит написать процедуру расшифровки полученых по "Serial.read()" чисел... Но ссылки оказались очень полезными.

А к чему был скетч с зажиганием светодиодов с пульта?

---------------------

Опачки, а вот пришло же и готовое решение! http://podrugomu.com/node/987

Спасибо, Jeka_M!!! Это целый доллар в мою копилочку навыков !

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Ничего не поучатся пока что. Есть такой скетч:

#include <string.h>

char  Ser_IN1[10];
char  Ser_IN2[10];
char  Ser_IN3[10];
char  Ser_IN4[10];

int   Ser_OUT1 = 0;
int   Ser_OUT2 = 0;
int   Ser_OUT3 = 0;
int   Ser_OUT4 = 0;

void setup() {

  Serial.begin(9600);
  Serial.println ("Serial begin:");
  Serial.println ("-------------");
}

void loop() {
  int i = 0;
  char buffer[1000];

  //если есть данные - читаем
  if (Serial.available()) {
    delay(100);
    
    // Проверям что получилось:
    Serial.println ("Data recived:");

    //загоняем прочитанное в буфер
    while ( Serial.available() && i < 99) {
      buffer[i++] = Serial.read();
    }
    //закрываем массив
    buffer[i++] = '\0';
  }

  //если буфер заполнен
  if (i > 0) {

    //разбираем его на части отделенные запятой
    sscanf(buffer, "%[^','],%[^','],%[^','],%s", &Ser_IN1, &Ser_IN2, &Ser_IN3, &Ser_IN4);
    
    // Проверяем что получилось:
    Serial.print ("IN1 = "); Serial.println (Ser_IN1);
    Serial.print ("IN2 = "); Serial.println (Ser_IN2);
    Serial.print ("IN3 = "); Serial.println (Ser_IN3);
    Serial.print ("IN4 = "); Serial.println (Ser_IN4);
    delay(100);
    
    //Пытаемся преобразовать в INT

    Serial.println ("Data converted:");
    Ser_OUT1 = int(Ser_IN1);
    Ser_OUT2 = int(Ser_IN2);
    Ser_OUT3 = int(Ser_IN3);
    Ser_OUT4 = int(Ser_IN4);
    Serial.print ("OUT1 = "); Serial.println (Ser_OUT1);
    Serial.print ("OUT2 = "); Serial.println (Ser_OUT2);
    Serial.print ("OUT3 = "); Serial.println (Ser_OUT3);
    Serial.print ("OUT4 = "); Serial.println (Ser_OUT4);
  }


}

Вот после Serial.println ("Data converted:"); пишет всякую хрень уже.

Как правильно преобразовать "char" в "int" ?

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

Buzzer2010 пишет:

Как правильно преобразовать "char" в "int" ?

Что Вы понимаете под "преобразовать"?

Вообще-то char это целое число, его не надо преобразоавывать, просто присвойте переменной типа int.

Или Вам надо делать преобразования по какому-то правилу? например '1'->1, '2'->2 или там 'A'->1, 'B'->2 или ещё по какому.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

'1'->1, '2'->2. Только цифры.

vk007
Offline
Зарегистрирован: 16.06.2015

Buzzer2010 пишет:

'1'->1, '2'->2. Только цифры.

Минусуйте '0' и получите цифру, т.е.:

'0' - '0' = 0
'1' - '0' = 1
...
'9' - '0' = 9

 

El
Offline
Зарегистрирован: 10.03.2016

Buzzer2010 пишет:

'1'->1, '2'->2. Только цифры.

На сколько я понял поставленную задачу можно решить при помощи этого http://arduino.ua/ru/prog/StringToInt. К сожалению у меня сейчас плата не под рукой, так что не могу сказать правильное это решение или нет.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

vk007 пишет:

Buzzer2010 пишет:

'1'->1, '2'->2. Только цифры.

Минусуйте '0' и получите цифру, т.е.:

'0' - '0' = 0
'1' - '0' = 1
...
'9' - '0' = 9

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

El пишет:

На сколько я понял поставленную задачу можно решить при помощи этого http://arduino.ua/ru/prog/StringToInt. К сожалению у меня сейчас плата не под рукой, так что не могу сказать правильное это решение или нет.

Судя по названию: "StringToInt" - что-то очень похожее.

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

El пишет:

Buzzer2010 пишет:

'1'->1, '2'->2. Только цифры.

На сколько я понял поставленную задачу можно решить при помощи этого http://arduino.ua/ru/prog/StringToInt. К сожалению у меня сейчас плата не под рукой, так что не могу сказать правильное это решение или нет.

На гроизонте воробей, расчехляй царь-пушку!

Правильно же написали. Если у Вас есть переменная типа char в которой сидит символ цифры ('0' или '1', или '2', ...), чтобы получить число, достаточно вычесть из него символ '0'

char c = '3';
int n = c - '0'; // теперь n == 3

 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Типа: "А ларчик  - просто открывался" ...

vk007
Offline
Зарегистрирован: 16.06.2015

Buzzer2010 пишет:

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

Нет, не то. Я надеюсь, что вы это уже поняли. Но я постараюсь поставить логическую точку этим простым объяснением (может кто-то еще заполнит маленький пробел в знаниях).

Каждый символ имеет свой код - это должно быть понятно (надо же как-то хранить их в памяти).

Так вот, у символа '0' код 48, у '1' - 49, ..., у '9' - 57. Ну и у остальных букв и знаков соответственно свой код.

Простым языком говоря, например, запись '7' - '0' равнозначна записи '7' - 48 или 55 - 48 (где 55 - это код '7') и будет равняться 7. Таким образом, чтобы из символа цифры получить саму цифру надо от него отминусовать 48 (или '0').