我正在将这个传感器与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>
任何想法我在这里做错了什么?我怀疑这是非常明显的,但我很难过。检查二进制值本身看起来不像位被例如移位。协议配置错误。
答案 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进行测试。