Потоковая передача данных с помощью датчика расстояния ToF через порт USB при обработке - PullRequest
0 голосов
/ 27 октября 2019

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

import com.hamoid.*;

// Example by Tom Igoe

import processing.serial.*;

float angle = 0;
int myString;


Serial myPort;  // The serial port


void setup() {

  size(500, 500);
  // List all the available serial ports
  printArray(Serial.list());
  // Open the port you are using at the rate you want:
  myPort = new Serial(this, Serial.list()[3], 115200);

}

void draw() {
  background(0);
  // Expand array size to the number of bytes you expect
  byte[] inBuffer = new byte[4];



  while (myPort.available() > 0) {
    inBuffer = myPort.readBytes();
    myPort.readBytes(inBuffer);
    if (inBuffer != null) {
      String myString = new String(inBuffer);
      println(myString);


    }
  }

}

вот что я вижу, когда запускаю код:

T�T� T�T� T�T� T� T�T�T�T� T�T� T�T� T�T� T�T� T� T�T� T�T� T� T�T� T�T� T�T� T� T�T�T�T� T� T�T�

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

@ laancelot Я использовал этот скетч и теперь получаю целые числа, но не нужные. Например:

84 6 177 84 6 194 177 84 6 189 203 84 6 194 177 84 6

Это эскиз I 'м при обработке:

    import com.hamoid.*;

// Example by Tom Igoe

import processing.serial.*;

int distance;

Serial port;  // The serial port

void setup() {

  printArray(Serial.list());
  // Open the port you are using at the rate you want:
  port = new Serial(this, Serial.list()[3], 115200);

}

void draw() {
  if (0 < port.available()) {  // If data is available to read,
    distance = port.read(); 
  }
    println(distance);
}
0 голосов
/ 01 ноября 2019

Давайте попробуем очевидные вещи и продолжим наш путь оттуда.

У вас есть 4 байта, что означает 32 бита. Это очень близко к 32-битному целому числу, особенно другие вещи намекают на целое число. Единственное плохое нововведение - это то, что мы не знаем, действительно ли это целое число, и даже если это так, мы все равно не знаем, целое ли это число со знаком или целое без знака.

Первое, что нужно попробовать: мы используем Java, и Java рассматривает байт как подписанный тип. Давайте сразу приведем его к целому числу:

// #1
if (inBuffer != null) {
  int distance = inBuffer;
  println(distance);
}

В качестве альтернативы, мы можем добиться некоторого успеха с одним из методов Байта (это в основном та же самая операция, но мы никогда не узнаем):

// #2
if (inBuffer != null) {
  int distance = inBuffer.intValue();
  println(distance);
}

Может быть, это без знака, сейчас. Разница заключается в том, что знак (плюс или минус, как в «это число меньше или больше нуля) принимает биты, в то время как для числа без знака все биты могут использоваться для хранения части числа, а не знакаВы должны были бы разыграть его, чтобы «игнорировать» знак, например:

// #3
if (inBuffer != null) {
  int distance = (inBuffer & 0xFF);
  println(distance);
}

Начните с № 1, а затем № 3. Я делаю ставку на № 3, так как нет необходимости в отрицательном расстояниина сенсор. Дайте мне знать, что вы найдете!

=========================================================

Вот учебник по двоичным числам. (Предупреждение спойлеров: двоичный код - это круто)

Как вы, наверное, знаете, двоичное число состоит из 1 и 0. Ничего другого. И, как вы можете знать, а можете и не знать, это тот тип вещей, на котором основано все наше общество. Это и операторы. Но давайтепридерживайтесь бинарного.

При чтении бинарного вы должны читать справа налево. Я имею в виду, если вы киборг или что-то, что вы, вероятно, можете просто перевести, как мы знаем, что5 000 000 - это пять миллионов, если читать их нормально. Но чтобы действительно знать, сколько стоит «5» в «5 000 000», вы должны начать читать справа, иначе вы не знаете, сколько нулей следует за ним - тогда это может означать что угодно.

То же самое с двоичным, за исключением того, что с десятичным числом каждое левое число стоит в 10 раз больше, чем последнее, в то время как в двоичном виде оно равно 2х.

В двоичном формате первое число справа стоит 1. Каждый второй номер стоит в два раза больше предыдущего. Итак, для одного байта значения «единиц» следующие:

128 64 32 16 8 4 2 1
 1   1  1  1 1 1 1 1 == 255
 1   0  0  0 0 0 1 0 == 130
 0   0  0  0 1 1 0 1 == 13

Это простое дополнение (как и любое число, когда вы об этом думаете). Это выглядит сложно, но это легко, как только вы поймете идею.

Байт всегда 8 бит. Как эти примеры:

[00000000] == 0
[11111111] == 255
[00001101] == 13

Теперь, если мы посмотрим на спецификации для вашего датчика, мы найдем эти 3 информации:

8 data bits
no parity bit
one stop bit

Что означает следующее:

  1. Данные будут содержаться в пакетах по 8 бит (один байт).
  2. Нет битов, зарезервированных для обнаружения ошибок
  3. Один специальный бит сообщит, когда начинается или заканчивается связь.

Мы до сих пор не знаем, будут ли данные подписаны или не подписаны (снова предупреждение о спойлере: возможно, не подписано), но мы уже начинаем видеть здесь паттерны. Даже в полученных вами строках мы можем обнаружить четкий шаблон:

84 6 177 84 6 194 177 84 6 189 203 84 6 194 177 84 6

Проблема в том, что это, вероятно, не целые числа. Они двоичные интерпретируются как целое число на машине. Это не то же самое.

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

Теперь, если мы углубимся в детали, мы увидим, что протокол вашего датчика не просто "отправка расстояний". Это сложнее, чем это. Вот как это работает:

  1. Он начинается с одного байта, содержащего 7-битный адрес и 0 («бит записи»). Это, вероятно, то, что вы читаете как «6».
  2. Он отправляет еще один бит с адресом, но с "1" в конце (бит "read"). Это, вероятно, то, что вы читаете как "84".
  3. Он отправляет 2 байтаданные, содержащие 16-битное число, которое является вашим измерением в мм.
  4. Отправляет контрольную сумму (один байт).

Это имело бы смысл. В конце концов, ваш датчик долженможет считываться в миллиметрах и может достигать 60 000 мм, что невозможно только одним байтом (который равен 255, помните?). На самом деле вы не можете записать 60 000 в двоичном виде с менее чем 16 битами.

Теперь, как мы можем их интерпретировать?

Во-первых, port.read() читает только один байт за раз, поэтому он не может прочитать 16 бит за один раз. Это одна из причинчисла, которые вы получаете, не имеют смысла (8 бит только в диапазоне от 0 до 255, поэтому вы не можете получить и более высокое значение).

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

194 == [11000010]
177 == [10110001]
[11000010 10110001] == 49 841


189 == [10111101]
203 == [11001011]
[10111101 11001011] == 48 587

Вы указывали на что-то около 5 метров? Будет ли это иметь смысл ?? Попробуйте направить датчик к тому, что вы знаете приблизительное расстояние, и давайте сделаем это снова, просто для удовольствия! И наука!

...