Serial.read() всегда возвращает 255

Итак, я пытаюсь научиться основам разработки приложений для Android. Мой главный план состоял в том, чтобы сделать приложение с помощью MIT App Inventor, которое включало бы светодиод через Bluetooth с помощью Arduino. Как только я убедился, что все работает, я написал все приложение с нуля, используя Android Studio. Таким образом, когда я неизбежно сталкиваюсь с ошибками в своем приложении, написанном с нуля, я могу со 100% уверенностью сказать, что проблема в моем коде Android, а не в оборудовании/Arduino.

Поэтому у меня сейчас проблемы. У меня есть две отдельные цепи светодиодов, синий светодиод от порта 13 и зеленый светодиод от контакта 8. Я проверил, что обе цепи работают правильно, используя код Blink, поэтому я знаю, что проблема определенно не в цепях светодиодов.

Я использую модуль Bluetooth HC 06. Контакты подключаются следующим образом:

HC 06 -> Ардуино

Прием -> Передача

Передача -> Прием

5В -> 5В

Земля -> Земля

Вот код Arduino:

#include <SoftwareSerial.h>

SoftwareSerial bluetooth(0,1);
int ledblue = 13;
int ledgreen = 8;
int tx = 1;
int rx = 0;
int type;

void setup() {
  Serial.begin(9600);
  //Bluetooth.begin(9600);
  pinMode(ledblue, OUTPUT);
  pinMode(ledgreen, OUTPUT);
  pinMode(tx, OUTPUT);
  pinMode(rx, INPUT);
  allpinslow();
}

void loop() {
  int i = 0;
  int m = 0;
  delay(500);
  if (Serial.available() > 0) {
    while(Serial.available() > 0){
      type = Serial.read();
      Serial.println(type);
    }
    Check_Protocol(type);
  }
}

void allpinslow()
{
  digitalWrite(ledgreen, LOW);
  digitalWrite(ledblue, LOW);
}

void Check_Protocol(int inStr) {
  int i = 0;
  int m = 0;
  if (inStr == '0') { // Светодиод выключен equals("2off")
    allpinslow();
  }
  if (inStr == '1') { // Светодиод включен
    digitalWrite(ledblue, HIGH);
  }
  if (inStr == '2'){
    digitalWrite(ledgreen,HIGH);
  }
}

Вот код блока MIT App Inventor

Код блока MIT App Inventor

Если я нажму зеленую кнопку или кнопку "Выкл", серийный монитор выдаст 255. Если я нажму красную, на последовательном мониторе ничего не появится. Я немного ошеломлен тем, что сломалось, поэтому буду очень признателен за любую помощь, которую я могу получить.

Редактировать: @Delta_G здесь измененный код

#include <SoftwareSerial.h>
int ledblue = 13;
int ledgreen = 8;
SoftwareSerial mySerial(2,4); //прием, передача
int type;

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(ledblue, OUTPUT);
  pinMode(ledgreen, OUTPUT);
  allpinslow();
}

void loop() {
  int i = 0;
  int m = 0;
  delay(500);
  if (mySerial.available()) {
    while(mySerial.available()){
      type = mySerial.read();
      Serial.println(type);
    }
    Check_Protocol(type);
    //Serial.println(inSerial);
  }
}

void allpinslow()
{
  digitalWrite(ledblue, HIGH);
  digitalWrite(ledblue, LOW);
}

void Check_Protocol(int inStr) {
  int i = 0;
  int m = 0;
  if (inStr == '0') { // Светодиод выключен equals("2off")
    digitalWrite(ledblue, LOW);
    digitalWrite(ledgreen, LOW);
  }
  if (inStr == '1') { // Светодиод включен
    digitalWrite(ledblue, HIGH);
  }
  if (inStr == '2'){
    digitalWrite(ledgreen,HIGH);
  }
}

, 👍1

Обсуждение

У вас здесь большая проблема: вы используете одновременно и программные, и аппаратные сериалы. Я предлагаю вам использовать только аппаратный серийный номер. Для этого удалите строки #include <SoftwareSerial.h> и SoftwareSerial bluetooth(0,1);. Затем скажите, где подключен последовательный терминал (к плате arduino?) и, наконец, если он все еще не работает, попробуйте поменять местами провода RX и TX., @frarugi87

Контакт HC 06 RX подключен к контакту 1, контакт HC 06 TX подключен к контакту 0. Я избавился от двух строк кода, но результат все равно тот же. Поменять пины местами не получится-телефон откажется подключаться к модулю, @theflyingoreo

Извиняюсь за двойной комментарий - «. Тогда скажите, где последовательный терминал подключен (к плате Arduino?)». Это скажет Arduino, где подключен последовательный терминал?, @theflyingoreo

Ваш код ссылается на объект «Последовательный», который относится к аппаратному UART, а не на объект «Bluetooth», который является серийным экземпляром программного обеспечения на контактах, которые теперь, как мы надеемся, не конфликтуют., @Chris Stratton

Привет, вместо этого я попытался использовать SoftwareSerial. Я добавил обновленный код в свой исходный пост. Все три кнопки в моем приложении по-прежнему возвращают «255» в последовательном мониторе. Если бы вы могли проверить обновленный код, я был бы очень признателен. Спасибо!, @theflyingoreo


3 ответа


Лучший ответ:

1

Обновление: причиной проблем был неисправный модуль Bluetooth. Купил новый и все работает отлично!

,

0

Если вы используете Serial, вы не можете использовать контакты 0 и 1 для чего-то еще, так как это аппаратные последовательные контакты. Выберите разные контакты для Bluetooth.

,

Если я использую softwareserial и подключаю HC 06 TX к контакту 4, а HC 06 RX к контакту 2, я получаю те же результаты (255), @theflyingoreo

255 это диагностика. Это то, что вы получите, если вызовете read(), когда нет доступных данных., @Delta_G

Но убей меня, я не могу понять, почему он не получает никаких данных. Если вы посмотрите на код блока приложения, он явно отправляет 48, 49 и 50, но Arduino ничего не получает., @theflyingoreo

Покажите новый код с новыми контактами. Кто занимается отправкой? Bluetooth? Вы читаете серийный экземпляр программного обеспечения? Или вы просто читаете из Serial, как в коде, который вы разместили?, @Delta_G

Я добавил новый код в свой исходный пост, @theflyingoreo

И чтобы ответить на ваш вопрос, приложение должно отправлять 48, 49 или 50 на модуль Bluetooth. Затем модуль Bluetooth отправляет его на Arduino, и в зависимости от того, какое значение он получил, он включает один из светодиодов или выключает их оба., @theflyingoreo

@Delta_G на самом деле значение отсутствия данных равно -1; и задействованные типы данных, по-видимому, представляют это правильно, а не неверно интерпретируют его как 255, но, возможно, у вас есть конкретная теория относительно того, как могло возникнуть это неправильное толкование? Также обратите внимание, что чтение выполняется только в том случае, если проверка доступных данных возвращает значение true., @Chris Stratton

Ой, простите. Я привык видеть, как люди читают 8-битные переменные. Я не понимал, что это на самом деле читается в int., @Delta_G


0

Прочитав комментарии, я предположил, что вы используете Arduino Uno, и у вас есть ПК (или Mac, или компьютер любого типа), подключенный к его USB-порту. порт и устройство Android на другом конце соединения Bluetooth.

Я не понимаю, что не так с вашим скетчом. тогда я предложу только два методы проверки правильности работы низкоуровневой связи. Как только вы убедитесь, что связь налажена, отладка станет проще.

Протестируйте обход микроконтроллера

Сначала загрузите пустой скетч в Arduino, затем подключите Модуль Bluetooth следующим образом:

HC 06   Arduino
───────────────
 GND ─── GND
  5V ─── 5V
  RX ─── RX
  TX ─── TX

Важно сначала загрузить пустой скетч: вы не хотите, Arduino для доступа к своему аппаратному последовательному порту. Теперь вы можете открыть свой сериал монитор на ПК, установите 9600/8N1.

При такой настройке HC 06 будет использовать мост USB/последовательный порт Arduino (ATmega16U2), а основной микроконтроллер (ATmega16U2). ATmega328P) просто сторонний наблюдатель. Независимо от того, что HC 06 выводит через TX должен появиться на вашем последовательном мониторе. Путь данных следующий:

┌─────────┐  Bluetooth  ┌───────┐  Serial  ┌──────┐     ┌──────┐  USB  ┌────┐
│ Android │ ──────────→ │ HC 06 │ ───────┐ │ 328P │ ┌─→ │ 16U2 │ ────→ │ PC │
└─────────┘             └───────┘        │ └──────┘ │   └──────┘       └────┘
                                         └──────────┘

Обратите внимание, что 328P отключен от последовательного канала.

Проверить с помощью эхо-скетча

Загрузите следующий скетч:

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    if (Serial.available())
        Serial.write(Serial.read());
}

затем подключите модуль Bluetooth следующим образом:

HC 06   Arduino
───────────────
 GND ─── GND
  5V ─── 5V
  RX ─── TX
  TX ─── RX

При такой настройке все, что HC 06 выводит на свой TX, должно появиться на ваш последовательный монитор и должен быть отправлен обратно через Bluetooth. путь к данным:

┌─────────┐  Bluetooth  ┌───────┐  Serial  ┌──────┐     ┌──────┐  USB  ┌────┐
│ Android │ ──────────→ │ HC 06 │ ───────→ │ 328P │ ┌─→ │ 16U2 │ ────→ │ PC │
│         │ ←────────── │       │ ←──────┐ └──────┘ │   └──────┘       └────┘
└─────────┘             └───────┘        └─────┴────┘

Обратите внимание, что выходной сигнал 328P принимается как 16U2, так и HC 06. Поскольку Android-устройство, похоже, игнорирует все, что оно получает через Bluetooth, настройка должна работать нормально и для отладки вашего приложения.

,

Для первого метода я загрузил пустой скетч, переподключил HC 06 и открыл Serial Monitor в IDE. Ничего не произошло. Я подключился к HC 06 через Bluetooth на втором компьютере, открыл TeraTerm VT, установил 9600/8N1, попробовал нажимать кнопки в приложении. Ничего не произошло. Ни одна из нажатых мною кнопок не вызвала реакции. Для второго метода я загрузил эхо-скетч и снова открыл Serial Monitor. На этот раз все, что я получал, это один вопросительный знак в обратном направлении каждый раз, когда я нажимал кнопку. http://imgur.com/a/I1qaP Может модуль неисправен?, @theflyingoreo

Тогда я бы сделал вывод, что у вас проблема со связью _upstream_ от Arduino., @Edgar Bonet

Так что потенциально это может быть сломанный модуль Bluetooth? Проблема с приложением в том, что это фиктивное приложение, написанное в MIT App Inventor. У меня нет возможности прыгнуть в исходный код и убедиться, что все на самом деле правильно. По сути, я должен предположить, что App Inventor правильно скомпилировал приложение., @theflyingoreo

Я не могу сказать, я не знаю, как должен работать модуль Bluetooth, или как его можно настроить. Эксперимент только доказывает, что он отправляет не то, что вы ожидаете, так что это не ваш скетч Arduino неисправен. Если у вас есть область, вы можете попробовать посмотреть TX модуля при отправке данных из вашего приложения., @Edgar Bonet

Я использовал шаг 2 отсюда, чтобы попробовать протестировать модуль BT: https://create.arduino.cc/projecthub/mjrobot/connecting-stuff-via-bluetooth-android-arduino-d0b8f1 Ни на какие АТ-команды ответа не было. Это возможное указание на модуль DOA?, @theflyingoreo

Я заменил Serial.write на Serial.println в вашем эхо-скетч, который вернул 255. Итак... Я думаю, мы вернулись к тому же месту?, @theflyingoreo

@theflyingoreo: Да, но теперь эскиз сведен к минимуму, и вы знаете, что проблема не в нем. Я бы попробовал посмотреть ТХ модуля с прицелом, если он у вас есть. Вы уверены, что этот модуль говорит на 9600/8N1? У меня нет опыта работы с Bluetooth, поэтому я не могу больше помочь., @Edgar Bonet