Отправка целых чисел из Ardunio в Java-программу с использованием последовательного порта и преобразование двухбайтового массива в целое число в Java - PullRequest
3 голосов
/ 02 декабря 2011

Я хочу отправить целочисленные значения из моего Arduino в приложение Java. Для этого я использую последовательный порт. В программе обработки для Arduino я печатаю следующее на последовательный порт:

Serial.print(accel, DEC)

accel является подписанным int. В своем Java-коде я реализую SerialPortEventListener, и я читаю массив байтов из ввода inputtream.

public synchronized void serialEvent(SerialPortEvent oEvent) {
    if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
        try {
            int available = input.available();
            byte[] chunk = new byte[available];
            input.read(chunk);
            System.out.println (new String(chunk));
        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }
}

Мне нужно преобразовать этот массив байтов в целые числа, но я не уверен, как это сделать. В учебнике Arduino Урок 4 - Последовательная связь и воспроизведение данных говорится, что Arduino хранит подписанные целые числа в двух байтах (16 бит). Я попытался прочитать только два байта данных в кусок массива и затем декодировать эти два байта в целое число с помощью следующего кода.

public synchronized void serialEvent(SerialPortEvent oEvent) {
    if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
        try {
            int available = input.available();
            int n = 2;
            byte[] chunk = new byte[n];
            input.read(chunk);
            int value = 0;
            value |= chunk[0] & 0xFF;
            value <<= 8;
            value |= chunk[1] & 0xFF;
            System.out.println(value);
         } catch (Exception e) {
             System.err.println(e.toString());
         }
    } 
}

Это должно вывести поток целых чисел, колеблющихся между -512 и -516, но это не так. Код распечатывает следующее.

2949173
3211317
851978
2949173
3211317
851978
2949173
3211319

Как можно декодировать байты, идущие от Arduino через последовательный порт к целым числам?

Ответы [ 3 ]

0 голосов
/ 03 декабря 2011

Редактировать: я должен был распознать цифры ascii: -)

Почему бы и нет: сделать линейно-ориентированный протокол;Используйте Java BufferedReader и .readLine ().Разобрать строки, используя Integer.valueOf ().Обратите внимание, что символ новой строки используется в качестве обрамляющего символа.

Это то, как используются большинство устройств GPS GPS и все виды весьма важных устройств.Не оптимально ни в коем случае, но вы идете ...

0 голосов
/ 07 декабря 2011

Оказывается, что функция Serial.print () на Arduino преобразует значение в строку и отправляет строку на последовательный порт, поэтому мое смещение бит не сработало.Одним из решений является сбор значений в моем Java-коде в виде строки и преобразование строки в int.

Однако, чтобы избежать шага преобразования значений из строки в int, вы можете использовать функцию serial.write () для отправки значений в последовательный порт.Для этого в эскизе Arduino определите объединение типа int и массива байтов одинакового размера.Затем создайте экземпляр объединения, установите целое число и Serial.write () соответствующий байтовый массив.Соберите байтовый массив в Java-программе и сделайте битовый сдвиг, чтобы получить целое число.

Мой эскиз Arduino кодируется так:

union{
  int i;
  byte b[2];
}u;
u.i = accel;
Serial.write(u.b, 2);

Мой Java-код для чтения байтового массива ипреобразование его в int выглядит следующим образом:

int n = 2;
byte[] chunk = new byte[n];
input.read(chunk);
short value = 0;
// get 2 bytes, unsigned 0..255
int low = chunk[0] & 0xff;
int high = chunk[1] & 0xff;
value =  (short) (high << 8 | low) ;
System.out.println(value);

Я все еще ищу способ получить float или double из Arduino в код Java.Я знаю, что могу написать float или double, заменив int в объединении на double или float, установив double или float и Serial.write () соответствующий байтовый массив.Моя проблема возникает на стороне Java.После того, как я собрал байтовый массив, я не нашел способа корректно сдвинуть данные с плавающей запятой или удвоить.Любая помощь здесь?

0 голосов
/ 02 декабря 2011

Вы можете использовать ByteBuffer для преобразования байта в int, ваш код будет выглядеть примерно так:

ByteBuffer bb = ByteBuffer.wrap(chunk);
System.out.println(bb.getInt());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...