Raspberry pi 如何获得LV MaxSonar LV-EZ0测距仪的每种规格输出?

Raspberry pi 如何获得LV MaxSonar LV-EZ0测距仪的每种规格输出?,raspberry-pi,serial-port,android-things,Raspberry Pi,Serial Port,Android Things,我用的传感器是覆盆子皮B3和安卓1.0 我已按照说明将其连接起来 对于其输出,建议我应该接收“一个ASCII大写字母“R”,后跟三个ASCII字符数字,表示以英寸为单位的范围,最大为255,后跟回车符(ASCII 13)” 我已经连接到设备,并按照如下方式对其进行了配置(我认为连接参数映射到该规范中的“串行,0到Vcc,9600波特,81N”): 我在该回调中读取其缓冲区,如下所示: public void readUartBuffer(UartDevice uart) throws IOExc

我用的传感器是覆盆子皮B3和安卓1.0

我已按照说明将其连接起来

对于其输出,建议我应该接收“一个ASCII大写字母“R”,后跟三个ASCII字符数字,表示以英寸为单位的范围,最大为255,后跟回车符(ASCII 13)”

我已经连接到设备,并按照如下方式对其进行了配置(我认为连接参数映射到该规范中的“串行,0到Vcc,9600波特,81N”):

我在该回调中读取其缓冲区,如下所示:

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是我添加的值。我得到的是7个带符号的字节,而不是它们之间预期的R\d\d\13。当我将手移向或移离传感器时,这些字节值中的某些值会出现变化,即,我得到的值会以我预期的方式变化,即使输出的形式和大小完全错误


知道我做错了什么吗?我怀疑这是非常明显的事情,但我被难住了。检查二进制值本身看起来并不是因为协议配置中的错误而移位。

我现在无法在硬件上测试它,但从LV MaxSonar LV-EZ0测距仪读取串行数据的算法应该略有不同:您应该在UART序列缓冲区中找到“ASCII大写字母”R(因为LV-EZ0在通电后开始发送数据,并且未与Raspberry Pi板同步,第一个接收的字节可能不是“R”,接收的字节数量可能小于或大于LV MaxSonar响应的5个字节^1个缓冲区中可能有几个(或部分)LV MaxSonar响应)然后尝试解析表示以英寸为单位的范围和结束CR符号的3个字符数字(如果数字和CR符号没有全部3个字节,则再次开始查找大写字母“R”,因为LV MaxSonar响应已中断(也可以是))。例如,请特别查看
processBuffer()
of和
processMessageFrame()
of-区别在于您只有一个“句子”,它的开头不是
“GPRMC”
,而是只有
“R”
符号


还有其他重要的事情:似乎没有大写字母“R”(ASCII 82)在您的响应缓冲区中-LV MaxSonar LV-EZ0连接可能存在一些问题。您的示意图应该与第6页的右上角图片完全相同:
独立传感器操作:串行输出传感器操作
。此外,还可以尝试将LV MaxSonar LV-EZ0连接到USBUART(带电源输出)电缆(例如,like)然后用你的电脑在终端上测试。

你有逻辑分析仪来检查来自uart总线的值吗?如果发送的数据是无符号的,但你正在读取有符号的值,也许你需要转换字节。谢谢-我不认为有符号/无符号的差异会转换字节(这是在序列的开始,我希望是一个R)到82(ASCII R)。我没有逻辑分析仪,恐怕我需要一个:/
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]