Serial анализ данных с com-порта

Nalik
Nalik аватар
Offline
Зарегистрирован: 02.02.2016

К сожалению сейчас нет возможности проверить код на работоспособность практически, т.к. нету модуля Ардуино, но в дальнейшем это потребуется. Может кто нибудь проверить работает ли этот код? Ну или хотя бы теоретически, всё правильно написано? (именно в плане анализа пришедших данных)

С компьютера с com-порта посылаем 0 - светодиод тухнет. Посылаем 1 - светодиод зажигается.

void setup() {
  Serial.begin(9600); // устанавливаем последовательное соединение
  pinMode(13, OUTPUT); //сделать вывод выходным
}

void loop() {
  //ПРИНЯТЬ ДАННЫЕ С COM-ПОРТА
  if (Serial.available() > 0) //если есть доступные данные
  {
    byte ByteData;                  //Переменная для хранения полученного байта
    ByteData = Serial.read();      //Считываем данные с COM-порта (1 байт)
    
    if (ByteData == 48) {          //Пришёл 0
      digitalWrite(13, LOW);       //ВЫКЛ светодиод
      delay(1000);                 //Ждём секунду
    }

    if (ByteData == 49) {         //Пришёла 1
      digitalWrite(13, HIGH);     //ВКЛ светодиод
      delay(1000);                //Ждём секунду
    }
  }
}

 

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

Непонятно для чего delay'и и почему сравнение идёт с 48 и 49, а не с '0' и '1'. Оно, конечно, на скорость не влияет, но так как-то нагляднее было бы.

Nalik
Nalik аватар
Offline
Зарегистрирован: 02.02.2016

Ну да, delay можно убрать. А вот собственно в этом и вопрос, как принимать и анализировать информацию. Я передаю 0 и 1 в байтах, я так понимаю в байтах я её и принимаю? Собственно потому и сравниваю с кодом цифр (0 код 48, 1 код 49). Или ардуино принимает инфо в строке, а не в байтах?

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

Nalik пишет:

Я передаю 0 и 1 в байтах, я так понимаю в байтах я её и принимаю? Собственно потому и сравниваю с кодом цифр (0 код 48, 1 код 49). Или ардуино принимает инфо в строке, а не в байтах?

1. Причём тут вообще строки? Я что-то писал про строки? Строки записываются в двойных кавычках, я же использовал одинарные, значит, это была не строка, а одиночный символ. В программировании это огромная разница – не путайте.

Ну. а по сути …

«Не мудрствуйте лукаво», в компьютере (любом, не только в Ардуино) всё проще, чем Вам с испугу кажется. Ему (компьютеру) абсолютно по барабану, число там, символ или ещё что-то. Он такими понятиями не оперирует.

Вот сидит у него в каком-то регистре последовательность HIGH (1) и LOW (0), например такая:

00110001

И он знает только про эти нули и единицы. Ему глубоко плевать, что они значат для Вас – это не его дело.

А для Вас они могут значить совершенно разные вещи. Если Вы по каким-то причинам считаете их числом, то это 49. Если же Вам взбрындило считать их символом, то это '1'. Но это Ваши человеческие заморочки. Для компьютера это последовательность 00110001 – и ничего более.

Понимаете?

Поэтому когда Вы сравниваете в программе этот регистр с числом 49 – компьютер скажет «да, равны». Если Вы его же сравните с символом '1' – он тоже скажет «да, равны». Просто потому, что для него нет никаких 49 и '1' – для его это одна и та же последовательность 00110001 – одна и таже и никакой разницы между 49 и '1’ он не видит потому, что её и нет вовсе.

Отсюда следует, что будете Вы сравнивать с числом 49 или с символом '1' – абсолютно фиолетово, т.к. это одно и тоже.

А моё замечание касалось лишь «зраительно-визуальных» вещей. Если Вы вводите в сериал символы 0 и 1 (а именно их Вы давите на клавиатуре и видите в окне сериала!!!), то и сравнивать надо с символами '0’ и ‘1’, а не с невесть откуда взявшимися 48 и 49. Но, повторяю, разница только в визуальном восприятии человеком – так понятнее человеку. С точки зрения же компьютера – это фиолетово (потому я и написал там. что «на скорость не влияет»).

 

Nalik
Nalik аватар
Offline
Зарегистрирован: 02.02.2016

Сколько вы всего написали)

Если я посылаю информацию в байтах, то логично что в байтах я её должен получить. На c# я написал программу которая посылает нажатие клавиш в байтах, соответственно если я нажал "1" с клавиатуры, то моя программа посылает эту клавишу переведённую в байты (а именно перевести "1" в байты получается 49). И тут у меня тогда вопрос, в каком виде в ардуино приходит эта информация. Либо она думает что ей прислали 49 ввиде байтов (т.е. цифра "1" с клавиатуры), либо она думает что ей прислали цифры "4" и "9".

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

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

Если отправляешь байт с компа, то он так байтом и придет, никто его не будет пилить на части по дороге.

 

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

Nalik пишет:

Либо она думает что ей прислали 49 ввиде байтов (т.е. цифра "1" с клавиатуры), либо она думает что ей прислали цифры "4" и "9".

Ну, похоже, это Вы ничего не поняли из того, что писал. Зря время потерял.

Повторяю ещё раз - не мудрствуйте лукаво! Что Вы посылали, точно то и приходит на Ардуино. Так понятнее?

Если нет, то по-другому. Вы читаете функцией read. Что она читает? И сколько этого она читает?