Вывод цифр через Serial.read

Тема в разделе "Arduino & Shields", создана пользователем robotehnika18, 13 дек 2017.

  1. robotehnika18

    robotehnika18 Нерд

    Здравствуйте. Нужно для одного проекта вводить цифры через монитор порта на Ардуинку.

    Вот код:

    Код (C++):
    int val;
    void setup()
    {
      Serial.begin(9600);
    }
    void loop()
    {
      if (Serial.available()) // проверяем, поступают ли какие-то команды
      {
        val = Serial.read(); // переменная val равна полученной команде
    delay(1000);
    Serial.print(val);
      }
    }
    Но, например, ввожу "21", а на монитор потом выводится "50" и "49". В чем дело, кто подскажет? Пробовал разные типы данных - ничего не помогает.
     
  2. Igor68

    Igor68 Гуру

    Это коды символов 0x32 и 0x31 (шестнадцатеричное) то есть символы 2 и 1. Вам надо принимать строку и применив функцию "atoi" преобразовать её в число.
     
    arkadyf нравится это.
  3. Igor68

    Igor68 Гуру

    Код (C++):
    char str[16]; //строка (массив) куда принимаем символы
    int val; //полученное число
    ....
    //тут принимаем и размещаем символы в строку
    //начиная с str[0] и далее
    //строка должна быть завершена нулём
    ....
    val = atoi(&str[0]); //получаем число
    ...
     
     
    arkadyf нравится это.
  4. rkit

    rkit Гуру

    Serial.parseInt
     
    arkadyf и Igor68 нравится это.
  5. robotehnika18

    robotehnika18 Нерд

    Сделал вот так. Теперь всегда нули выходят:

    Код (C++):
    char str[16];
    int val;
    void setup()
    {
      Serial.begin(9600);
    }
    void loop()
    {
      if (Serial.available()) // проверяем, поступают ли какие-то команды
      {
    str[16] = Serial.parseInt(); // переменная val равна полученной команде
       
    val = atoi(&str[0]);

    delay(1000);
    Serial.print(val);
      }
     
  6. DIYMan

    DIYMan Guest

    В коде завелась дичь, убейте её, и будет работать.
     
  7. ИгорьК

    ИгорьК Оракул Модератор

    upload_2017-12-14_10-20-2.png
     
    vvr и MihaNN52 нравится это.
  8. DIYMan

    DIYMan Guest

  9. DIYMan

    DIYMan Guest

    А если серьёзно - достаточно просто почитать документацию и примеры: https://www.arduino.cc/en/Tutorial/ReadASCIIString, и тогда не будет подобной чуши:
    Код (C++):
    str[16] = Serial.parseInt(); // переменная val равна полученной команде
     
    val = atoi(&str[0]);
     
  10. DetSimen

    DetSimen Guest

    паматри, что отдает функция parseInt() у Serial. И при чем здесь char str[]?
     
  11. ИгорьК

    ИгорьК Оракул Модератор

    Ну да.
    Но тормоз 1 секунда в глаза сразу бросается! Что там может работать то в принципе.
     
  12. robotehnika18

    robotehnika18 Нерд

    Всем спасибо. Тему можно закрыть.
    Сделал так:

    Код (C++):
    int val;
    void setup() {
      Serial.begin(9600);
    }
    void loop()
      {
        if (Serial.available() > 0) {
        val = Serial.parseInt();
        Serial.println(val);
        delay(1000);
       }
      }
     
    Hank Hill и Igor68 нравится это.
  13. как поймать эти сообщения от Nextion
    65 01 0A 01 FF FF FF
    e\x01\x0A\x01\xFF\xFF\xFF
     
  14. asam

    asam Гик

    memcmp() http://all-ht.ru/inf/prog/c/func/memcmp.html
     
  15. не понял ссылку.
    я не вижу этих сообщений во входящих порта на ардуино
     
  16. b707

    b707 Гуру

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