Отправка целого числа> 1 байта с Android на Arduino через последовательный порт
Я использую
public abstract void write(int b) throws IOException;
из класса OutputStream в Android Studio для отправки целого числа (градусы от 0 до 360) в последовательный порт моего Arduino через модуль Bluetooth HC06.
Градусы от 0 до 256 хорошо читаются с помощью
int angle = Serial.read();
Значения больше 256 (1 байт) принимаются как 0, что-то странное.
Я пытался использовать
Serial.parseInt();
поскольку он должен возвращать длинное целое число, но все, что я получаю, это одна цифра, в основном 0.
Я также пытался использовать
Serial.readBytes(threeDigitsInt, 3);
angle = (threeDigitsInt[0] * 100) + (threeDigitsInt[1] * 10) + threeDigitsInt[2];
но я не могу сказать, что окажется в массиве. Определенно не правильная однозначная цифра. Я пробовал char[] и byte[], но не могу восстановить значение отправки Integer.
Вывод: я хочу отправить 360 как целое число с Android и получить его как целое число на Arduino.
Благодарим вас за помощь!
@Corazon, 👍0
Обсуждение1 ответ
Лучший ответ:
Во-первых, вы отправляете только один байт с Android:
public abstract void write (int b)
Записывает указанный байт в этот выходной поток. Общий контракт для записи заключается в том, что в выходной поток записывается один байт. Записываемый байт — это восемь младших битов аргумента b. 24 старших бита b игнорируются.
OutputStream.write(byte) никогда не может записать более одного байта.
Также ясно, что вы понятия не имеете о том, в каком формате отправляются данные, если вы пытаетесь затем прочитать 3 байта и использовать двоично-десятичный код для их восстановления.
Вместо этого я предлагаю вам работать в чистом формате ASCII. Забудьте о байтах. Байты — это не то, что вам нужно, если только вы не хотите потратить дополнительное время на определение, а затем на реализацию собственного протокола.
Начните с форматирования данных в печатную строку ASCII. Если Android Java похож на обычную Java, я бы начал с превращения вашего целого числа в строку с правильными окончаниями строк. Что-то вроде:
String val = String.format("%d\n", angle);
Затем получите байты, представляющие эту отформатированную строку:
byte[] valBytes = val.getBytes();
Теперь у вас есть допустимый массив байтов, содержащий ваше текстовое представление данных, которые вы можете отправить с помощью OutputStream.write(byte[])
.
Теперь ваша задача — прочитать эти данные на Arduino. Это означает чтение каждого поступающего байта, который по очереди сохраняет его в той или иной форме, пока вы не получите окончание строки \n
. В этот момент вы можете взять каждый байт как строку и снова преобразовать их в целое число.
Это можно сделать на лету:
static int angle = 0;
if (Serial.available()) {
char c = Serial.read();
if (c == '\n') {
Serial.print("I got: ");
Serial.println(angle);
angle = 0;
} else if ((c >= '0') && (c <= '9')) {
angle *= 10;
angle += (c - '0');
}
}
В принципе, есть переменная, которая хранит входящий угол. Для каждого символа, поступающего на последовательный порт, если это строка, оканчивающаяся на \n
, то делайте что угодно со значением угла. Если это символ от 0 до 9, умножьте свой угол на 10 (десятичный сдвиг влево), преобразуйте свой символ в эквивалентное целое число, вычитая символ «0», и прибавьте его к вашему углу.
Угол не получает никакого значения?, @Corazon
Возможно, Android отправляет вещи по-другому. Сначала вы должны точно подтвердить, что отправляет Android., @Majenko
Также проверьте Arduino отдельно от Android. Если он работает с последовательным монитором, вводя числа, тогда код Arduino в порядке., @Majenko
Хорошо, большое спасибо. Я найду время и попробую сегодня!, @Corazon
- Bluetooth: прочитайте предоставленное пользователем значение, а затем получите время с телефона Android.
- Модуль Bluetooth HC-05 мигает красным светом - Arduino Uno
- Плохо отформатированные символы с использованием Bluetooth-модуля JDY-30
- Какова самая высокая скорость передачи данных, которая может работать между Android-устройством и Ардуино, подключенным к HC05?
- Serial печатается дважды?
- ПК не может получить доступ к порту HC-06 Bluetooth COM
- Как интерпретировать последовательные данные, полученные модулем Bluetooth
- Возможно ли использование двух модулей с последовательным интерфейсом на одном Arduino Uno?
Вы отправляете только один байт от 0 до 255. Прочтите руководство. https://developer.android.com/reference/java/io/OutputStream.html#write(int), @Majenko
Хорошо. Я вижу, ты прав! Можете ли вы помочь мне разобрать этот угол int в байт b [ ], чтобы я мог использовать public void write(byte b[]) выдает IOException { написать (b, 0, b.length); }, @Corazon
Вы не можете просто случайным образом передавать данные по последовательному соединению. У вас должен быть какой-то формат, чтобы получатель знал, что такое байт., @Majenko
Хм. Я имею в виду, что формат хорошо распознается в Serial.read(), @Corazon