Дмитрий
29 июля 2020 г. 21:38

Мусор в Serial-порте. Подключение Bluetooth HC-05 к Iskra Mega.

Arduino, HC-05, Iskra mega

Все привет!
Пытаюсь подружить HC-05 с Iskra Mega (аналог Arduino Mega). Блютус подсоединил к порту Serial2. Для проверки на смартфон написал тестовую программку. Но для отладки использую Serial Bluetooth Terminal, установленный из плей маркета. Когда посылаю что-нибудь (символ "1" или "0"), то после этого начинает постоянно валиться мусор и число байт постоянно 63.
Вот код:

  1. int inByte=0;
  2. int LED = 13;
  3. int counter=0;
  4. void setup()
  5. {
  6. //Serial.begin(9600);
  7. Serial2.begin(9600);
  8. pinMode(LED, OUTPUT);
  9. digitalWrite(LED, HIGH);
  10. }
  11. void loop()
  12. {
  13. while(Serial2.available()>0)
  14. {
  15. int avail=Serial2.available();
  16. inByte = Serial2.read();
  17. // При символе "1" включаем светодиод
  18. if ((char)inByte == '1')
  19. {
  20. digitalWrite(LED, HIGH);
  21. }
  22. // При символе "0" выключаем светодиод
  23. if ( (char)inByte == '0')
  24. {
  25. digitalWrite(LED, LOW);
  26. }
  27. if ((char)inByte == '1' || ((char)inByte == '0'))
  28. {
  29. Serial2.println("Recieved: "+String(counter));
  30. counter++;
  31. }
  32. else
  33. {
  34. Serial2.println("Unknown data: "+String(inByte)+" Available bytes:"+String(avail));
  35. //Serial.println("Unknown data: "+String(inByte)+" Available bytes:"+String(avail)); //в монитор порта
  36. }
  37. }
  38. }

Пробовал разные порты, но результат тот же.
Причем если этот же код (заменив Serial2 на Serial и подключив к соответсвующим выводам) загрузить в китайскую nano, то все работает. Может кто знает куда копать?

3

Вам это нравится? Поделитесь в социальных сетях!

3
R
  • 30 июля 2020 г. 14:18

Добрый день!
Увы, я новичок в Ардуино, но постараюсь помочь. Простите если что-то написал не так.

Функция void loop() запускается "по кругу". Исполняется и опять запускается. У Вас в строках 29,30 при получении какого-либо ответа inByte будет выводится номер этой иттерации с переменной counter. Попробуйте вообще убрать строки 29,30 и переменную counter. Если подключение не успешно, отработают строки 34,35.
Еще поскольку функция цыклична, у Вас будет отправлять эту 1 условно 100 раз в секунду. Я бы написал отдельную функцию подключения my_connect(){...... return true} и вызвал бы ее в void setup() и в случае ((char)inByte !== '1'. Тогда 1 раз будет подключение и вызов если оно отпалою И не будет посылаться мусор.

    Дмитрий
    • 31 июля 2020 г. 2:16
    • (ред.)

    Спасибо, я немного не так сделал: закомментировал строки 34 и 35. Стало больее приближенно к реальности, но все равно в сериал приходят не всегда те данные: т.е. символы 0 или 1 могут превратиться в нечто другое. Приходится несколько раз отсылать, пока правильно считается. Попробовал на китайской Arduino Mega - результат тот же. Или придет правильно, а за ним тут же число 255 (знак вопроса в другую сторону). Что-то я не знаю про Serial.

      Дмитрий
      • 31 июля 2020 г. 2:32
      • Ответ был помечен как решение.

      Нашел решение. Пусть здесь будет:

      1. void setup()
      2. {
      3. digitalWrite( 19, HIGH ); // fix Serial1
      4. digitalWrite( 17, HIGH ); // fix Serial2
      5. digitalWrite( 15, HIGH ); // fix Serial3
      6. ...
      7. }

      В самом начале нужно вставить. И сразу заработало как часы.

        Комментарии

        Только авторизованные пользователи могут публиковать комментарии.
        Пожалуйста, авторизуйтесь или зарегистрируйтесь