Я использую этот датчик с Raspberry Pi B 3 и Android Things 1.0
У меня это подключено согласно этим инструкциям
spec для его вывода предполагает, что я должен получить "ASCII заглавную" R ", за которой следуют три цифры ASCII-символа, представляющие диапазон в дюймах, максимум 255, за которым следует возврат каретки ( ASCII 13) "
Я подключился к устройству и настроил его следующим образом (я думаю, что параметры подключения соответствуют «Serial, 0 to Vcc, 9600 бод, 81N» в этой спецификации):
PeripheralManager manager = PeripheralManager.getInstance();
mDevice = manager.openUartDevice(name);
mDevice.setBaudrate(9600);
mDevice.setDataSize(8);
mDevice.setParity(UartDevice.PARITY_NONE);
mDevice.setStopBits(1);
mDevice.registerUartDeviceCallback(mUartCallback);
Я читаю из его буфера в этом обратном вызове следующим образом:
public void readUartBuffer(UartDevice uart) throws IOException {
// "The output is an ASCII capital “R”, followed by three ASCII character digits
// representing the range in inches up to a maximum of 255, followed by a carriage return
// (ASCII 13)
ByteArrayOutputStream bout = new ByteArrayOutputStream();
final int maxCount = 1024;
byte[] buffer = new byte[maxCount];
int total = 0;
int cycles = 0;
int count;
bout.write(23);
while ((count = uart.read(buffer, buffer.length)) > 0) {
bout.write(buffer, 0, count);
total += count;
cycles++;
}
bout.write(0);
byte[] buf = bout.toByteArray();
String bufStr = Arrays.toString(buf);
Log.d(TAG, "Got " + total + " in " + cycles + ":" + buf.length +"=>" + bufStr);
}
private UartDeviceCallback mUartCallback = new UartDeviceCallback() {
@Override
public boolean onUartDeviceDataAvailable(UartDevice uart) {
// Read available data from the UART device
try {
readUartBuffer(uart);
} catch (IOException e) {
Log.w(TAG, "Unable to access UART device", e);
}
// Continue listening for more interrupts
return true;
}
Когда я подключаю датчик и использую этот код, я получаю показания на обратной стороне формы:
05-10 03:59:59.198 1572-1572/org.tomhume.blah D/LVEZ0: Got 7 in 1:9=>[23, 43, 0, 6, -77, -84, 15, 0, 0]
05-10 03:59:59.248 1572-1572/org.tomhume.blah D/LVEZ0: Got 7 in 1:9=>[23, 43, 0, 6, 102, 101, 121, 0, 0]
05-10 03:59:59.298 1572-1572/org.tomhume.blah D/LVEZ0: Got 7 in 1:9=>[23, 43, 0, 6, 102, 99, 121, 0, 0]
Начальные 23 и последние 0 в каждой строке - это значения, которые я добавил. Вместо ожидаемого R \ d \ d \ d \ 13 между ними я получаю 7 подписанных байтов. Дисперсия в некоторых из этих байтовых значений появляется, когда я двигаю руку к датчику и от него - то есть значения, которые я получаю, меняются так, как я ожидал, даже если выходные данные совершенно неправильны по форме и размеру.
Есть идеи, что я здесь делаю не так? Я подозреваю, что это что-то чрезвычайно очевидное, но я в тупике. Изучая сами двоичные значения, не похоже, что биты сдвинуты, например, на ошибка в настройке протокола.