Ардуина неправильно считает

Тема в разделе "Arduino & Shields", создана пользователем Виктор///, 26 апр 2018.

  1. Вообщем нужно,чтобы ардуина принимала два байта - шестнадцатиричное представление числа и преобразовывала в байт, но получается не ожидаемый результат.
    Код (C++):

    byte data1,data2;
    byte data;
    void setup() {
    Serial.begin(9600);
    }

    void loop() {
      if (Serial.available() == 2){
        data = 0;
        data1 = byte(Serial.read());
        Serial.print(data1);//Вывод кода 1 символа
        Serial.print(" ");
        data2 = byte(Serial.read());
        Serial.print(data2);//Вывод кода 2 символа
        Serial.print(" ");
        if ((48 >= data1) && (data1 <= 57)) data = (data1-48)*16;
        else if ((97 >= data1) && (data1 <= 102)) data = (data1-87)*16;
        //if (48 >= data2 <= 57) data += (data2-48);
        //else if (97 >= data2 <= 102) data += (data2-97+10);
        Serial.print((data1-48)*16);//Теоретический вывод зачения
        Serial.print(" ");
        Serial.println(data);//Фактический вывод значения
      }
    }
     
    Если поменять тип переменной data на int, то получается тоже не ожидаемый результат!
    Помогите!!
    Похоже, что происходит переполнение переменной
     
    Последнее редактирование: 26 апр 2018
  2. b707

    b707 Гуру

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

    Belkin Гик

    Ардуина принимает байты в виде комбинации "0" и "1", а HEX или DEC - это для визуальности.
    Что пользователь вкладывает в значение этого байта - вопрос пользователя.
    Т.е., байт принимается и с этим байтом надо что-то сделать...
    А что и как - решает пользователь.
    Разберитесь со своей арифметикой или прокомментируйте код, чтоб стал понятен ход вашей мысли.
    Зачастую именно при выполнении второго приходит озарение... ;)
     
  4. Вот. Первое число - код первого символа. Второе число - код второго символа (это пока ненужно). Третье число - результат вычисления выражение. Четвёртое - значение байта.
    48 48 0 0
    49 49 16 160
    50 50 32 176
    51 51 48 192
    52 52 64 208
    53 53 80 224
    54 54 96 240
    55 55 112 0
    56 56 128 16
    57 57 144 32
    97 97 784 160
    98 98 800 0
    99 99 816 0
    100 100 832 0
    101 101 848 0
    102 102 864 0

    Ввод:
    00
    11
    22
    33
    44
    55
    66
    77
    88
    99
    aa
    bb
    cc
    dd
    ee
    ff
     
  5. Вводим два знака - 0-1,a-f - то есть как бы в шестнадцатиричной системе счисления.
    Считываем и получаем 2 байта - коды введённых символов.Берём код первого символа и проводим проверку на вхождение этого значения в диапазон 48-57 (соответствует кодам цифр) и при удачной проверке data присваиваем значение (код-48(поправка на коды цифр. Что б 48 преобразовалось в 0, 57 в 9))*16. Умножаем на 16 потому что это старшие биты. В ином случае делаем проверку на вхождение кода в диапазон букв от "a" до "f" и выполняем тоже выражение, но с другой поправкой. Но суть не в этом. Если переменной присваивать значение этого выражение - получается муть, а если значение отправлять обратно в компьютер - всё как надо..
     
  6. b707

    b707 Гуру

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

    Код (C++):

    if ((48 >= data1) && (data1 <= 57)) data = (data1-48)*16;
        else if ((97 >= data1) && (data1 <= 102)) data = (data1-87)*16;
     
    Нельзя так сравнивать (48 <= data1)
    Код (C++):
    if ((data1 >= 48) && (data1 <= 57)) data = (data1-48)*16;
        else if ((data1 >= 97) && (data1 <= 102)) data = (data1-87)*16;
    Теперь всё работает как надо...
    Просто сначала я хотел сделать сравнение типа 48 >= data1 <= 57.... По-моему так можно в Python. Короче надо не выпендриваться и делать нормально.
     
  8. Daniil

    Daniil Гуру

    Вы уверены, что именно это хотели сравнить? Чтобы data1 была меньше 48 и меньше 57?
    Для С
    Код (C++):
    data>=1
    и
    Код (C++):
    1<=data
    идентичны и должны работать одинаково. У Вас опечатка в знаке была, а не в порядке сравниваемых переменных
     
    Виктор/// нравится это.
  9. Спасибо! Буду знать
     
  10. Belkin

    Belkin Гик

    Дальше даже читать не стал...
    Где в программе указания, что работаем со значениями в HEX-формате ?
    Который день "за рулем" ? ;)
    Типы переменных надо указывать !
    И не в постах на форуме, а в теле программы (по-местному скетча)...