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
Если я нажму зеленую кнопку или кнопку "Выкл", серийный монитор выдаст 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);
}
}
@theflyingoreo, 👍1
Обсуждение3 ответа
Лучший ответ:
Обновление: причиной проблем был неисправный модуль Bluetooth. Купил новый и все работает отлично!
Если вы используете 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
Прочитав комментарии, я предположил, что вы используете 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
- AT-команда не отвечает на последовательный монитор
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Чтение SMS с помощью Arduino Uno и SIM800L и печать на LCD (16x2 буквенно-цифровых) с использованием последовательного соединения
- Как работает последовательная связь на Arduino?
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
У вас здесь большая проблема: вы используете одновременно и программные, и аппаратные сериалы. Я предлагаю вам использовать только аппаратный серийный номер. Для этого удалите строки
#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