Давайте попробуем очевидные вещи и продолжим наш путь оттуда.
У вас есть 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
Что означает следующее:
- Данные будут содержаться в пакетах по 8 бит (один байт).
- Нет битов, зарезервированных для обнаружения ошибок
- Один специальный бит сообщит, когда начинается или заканчивается связь.
Мы до сих пор не знаем, будут ли данные подписаны или не подписаны (снова предупреждение о спойлере: возможно, не подписано), но мы уже начинаем видеть здесь паттерны. Даже в полученных вами строках мы можем обнаружить четкий шаблон:
84 6 177 84 6 194 177 84 6 189 203 84 6 194 177 84 6
Проблема в том, что это, вероятно, не целые числа. Они двоичные интерпретируются как целое число на машине. Это не то же самое.
Ваш датчик работает "вхолостую", что означает, что он никогда не ждет вас. Это всегда отправка сигналов. Каждый раз, когда он заканчивает отправку номера, он начинает отправлять еще один, все время. Это может объяснить, почему вы получаете такую петлю в ваших данных.
Теперь, если мы углубимся в детали, мы увидим, что протокол вашего датчика не просто "отправка расстояний". Это сложнее, чем это. Вот как это работает:
- Он начинается с одного байта, содержащего 7-битный адрес и 0 («бит записи»). Это, вероятно, то, что вы читаете как «6».
- Он отправляет еще один бит с адресом, но с "1" в конце (бит "read"). Это, вероятно, то, что вы читаете как "84".
- Он отправляет 2 байтаданные, содержащие 16-битное число, которое является вашим измерением в мм.
- Отправляет контрольную сумму (один байт).
Это имело бы смысл. В конце концов, ваш датчик долженможет считываться в миллиметрах и может достигать 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 метров? Будет ли это иметь смысл ?? Попробуйте направить датчик к тому, что вы знаете приблизительное расстояние, и давайте сделаем это снова, просто для удовольствия! И наука!