Как считать данные с терминала, Serial.read()
- Войдите на сайт для отправки комментариев
Чт, 07/04/2016 - 16:39
Добрый день и всех с праздником Благовещения!
Такой вопрос. Отлаживаю скетч и пока не пришли датчики, надо как-то присваивать переменным числовые значения. Других вариантов, кроме терминала - не вижу. Но есть проблема: не пойму как.
Главное дело, в каком-то скетче или даже примере, я точно видел что можно читать с терминала, но теперь не найду этот пример.
Подскажите как это делается!
http://arduino.ru/Reference/Serial/Available
http://pashkevich.me/article/6.html
http://podrugomu.com/node/987
http://wiki.amperka.ru/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D1%83%D1%80%D0%BE%D0%BA%D0%B8:6-serial-%D0%B8-processing
//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(); // } }Счя разберем. Спасибо.
--------------------------
Мда, несколько замысловато, конечно - передавать не сами введенные символы, а их байтовые значения. Чувствую себя Джеймсом Бондом, которому предстоит написать процедуру расшифровки полученых по "Serial.read()" чисел... Но ссылки оказались очень полезными.
А к чему был скетч с зажиганием светодиодов с пульта?
---------------------
Опачки, а вот пришло же и готовое решение! http://podrugomu.com/node/987
Спасибо, Jeka_M!!! Это целый доллар в мою копилочку навыков !
Ничего не поучатся пока что. Есть такой скетч:
#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" ?
Как правильно преобразовать "char" в "int" ?
Что Вы понимаете под "преобразовать"?
Вообще-то char это целое число, его не надо преобразоавывать, просто присвойте переменной типа int.
Или Вам надо делать преобразования по какому-то правилу? например '1'->1, '2'->2 или там 'A'->1, 'B'->2 или ещё по какому.
'1'->1, '2'->2. Только цифры.
'1'->1, '2'->2. Только цифры.
Минусуйте '0' и получите цифру, т.е.:
'1'->1, '2'->2. Только цифры.
На сколько я понял поставленную задачу можно решить при помощи этого http://arduino.ua/ru/prog/StringToInt. К сожалению у меня сейчас плата не под рукой, так что не могу сказать правильное это решение или нет.
'1'->1, '2'->2. Только цифры.
Минусуйте '0' и получите цифру, т.е.:
Ах вот в чем дело! Надо убрать "конец передачи", или как называется последний ноль - не помню. Спасибо.
На сколько я понял поставленную задачу можно решить при помощи этого http://arduino.ua/ru/prog/StringToInt. К сожалению у меня сейчас плата не под рукой, так что не могу сказать правильное это решение или нет.
Судя по названию: "StringToInt" - что-то очень похожее.
'1'->1, '2'->2. Только цифры.
На сколько я понял поставленную задачу можно решить при помощи этого http://arduino.ua/ru/prog/StringToInt. К сожалению у меня сейчас плата не под рукой, так что не могу сказать правильное это решение или нет.
На гроизонте воробей, расчехляй царь-пушку!
Правильно же написали. Если у Вас есть переменная типа char в которой сидит символ цифры ('0' или '1', или '2', ...), чтобы получить число, достаточно вычесть из него символ '0'
Типа: "А ларчик - просто открывался" ...
Ах вот в чем дело! Надо убрать "конец передачи", или как называется последний ноль - не помню. Спасибо.
Нет, не то. Я надеюсь, что вы это уже поняли. Но я постараюсь поставить логическую точку этим простым объяснением (может кто-то еще заполнит маленький пробел в знаниях).
Каждый символ имеет свой код - это должно быть понятно (надо же как-то хранить их в памяти).
Так вот, у символа '0' код 48, у '1' - 49, ..., у '9' - 57. Ну и у остальных букв и знаков соответственно свой код.
Простым языком говоря, например, запись '7' - '0' равнозначна записи '7' - 48 или 55 - 48 (где 55 - это код '7') и будет равняться 7. Таким образом, чтобы из символа цифры получить саму цифру надо от него отминусовать 48 (или '0').