如何获得带有Android Things的LV-MaxSonar LV-EZ0测距仪的每规格输出?

时间:2018-05-13 02:25:48

标签: raspberry-pi serial-port android-things

我正在将这个传感器与Raspberry Pi B 3和Android Things 1.0一起使用

我按照these说明连接了

输出的spec表示我应该收到“ASCII大写字母”R“,后跟三个ASCII字符数字,表示以英寸为单位的范围,最大值为255,然后是回车符(ASCII 13) )“

我已连接到设备并按如下方式配置(连接参数映射到该规范中的“Serial,0到Vcc,9600 Baud,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个有符号字节。当我将手移向和离开传感器时,会出现一些字节值的变化 - 即我正在回归的值会以我预期的方式变化,即使输出在形式和大小上完全错误。 / p>

任何想法我在这里做错了什么?我怀疑这是非常明显的,但我很难过。检查二进制值本身看起来不像位被例如移位。协议配置错误。

1 个答案:

答案 0 :(得分:0)

我现在无法在硬件上测试它,但似乎从LV-MaxSonar LV-EZ0测距仪读取串行数据的算法应该略有不同:你应该在UART序列缓冲区中找到“ASCII大写”R“(因为LV-EZ0在上电后开始发送数据并且与Raspberry Pi板不同步,并且第一个接收的字节可能不是“R”,并且接收的字节数量可以少于或多于5个字节的LV-MaxSonar响应^在一个缓冲区中可以是几个(或部分)LV-MaxSonar响应)和THAN尝试解析3个字符数字,表示以英寸为单位的范围和结束CR符号(如果没有全部3个字节的数字和CR符号 - 比开始查找大写“R “再次因为LV-MaxSonar响应被打破(也可能是这样)。”例如,请查看GPS contrib driver,尤其是NmeaGpsModule.java processBuffer()processMessageFrame() "GPRMC" 3}} - 区别在于您只有一个“句子”,其开头不是"R",而只是Independent Sensor Operation: Serial Output Sensor Operation符号。

其他重要的事情:似乎你的响应缓冲区中没有大写“R”(ASCII 82) - 可能是LV-MaxSonar LV-EZ0连接中的一些问题。您的原理图应与NmeaParser.java import serial s = serial.Serial("/dev/ttyACM0") s.write("read\n") resp = [] char = None while char != "\r": char = s.read() resp.append(char) print "".join(resp) 第6页上的右上图完全相同。例如,还可以尝试将LV-MaxSonar LV-EZ0连接到USB< - > UART(带电源输出)电缆(例如datasheet),并在终端上使用PC进行测试。