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