Отправка целого числа> 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.

Благодарим вас за помощь!

, 👍0

Обсуждение

Вы отправляете только один байт от 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


1 ответ


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

0

Во-первых, вы отправляете только один байт с 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