如何在Android Things上获取LV-MaxSonar LV-EZ0测距仪的标准输出?
问题排查与解决思路
看起来你遇到的核心问题是传感器没进入预期的串口ASCII输出模式,再加上读取代码里的多余字节干扰,导致读不到符合规格的R+三位数字+回车格式数据。下面是具体的排查和修复步骤:
1. 优先检查传感器的模式引脚配置
LV-MaxSonar LV-EZ0的输出模式是由**Mode引脚(Pin 4)**决定的:
- 要启用你需要的串口ASCII输出,必须把Mode引脚连接到Vcc(高电平)
- 如果这个引脚悬空、接GND或者接线错误,传感器会自动切换到其他输出模式(比如模拟电压或脉冲宽度输出),这时候你从串口读到的就是对应模式的原始数值,而非预期的ASCII字符串——这和你现在看到的“数值随距离变化但格式完全不对”的现象完全吻合
赶紧确认一下Mode引脚的接线,确保它已经正确连到树莓派的3.3V或5V引脚(传感器兼容两种电平逻辑)。
2. 移除读取代码中的多余字节
你的readUartBuffer方法里,自行添加了bout.write(23)和bout.write(0),这会把无关字节混入原始串口数据,干扰你对真实输出的判断。修改后的代码应该只读取传感器的原始输出:
public void readUartBuffer(UartDevice uart) throws IOException { ByteArrayOutputStream bout = new ByteArrayOutputStream(); final int maxCount = 1024; byte[] buffer = new byte[maxCount]; int total = 0; int cycles = 0; int count; // 去掉多余的前置/后置字节写入 while ((count = uart.read(buffer, buffer.length)) > 0) { bout.write(buffer, 0, count); total += count; cycles++; } byte[] buf = bout.toByteArray(); String bufStr = Arrays.toString(buf); // 新增ASCII字符串转换,方便直接观察输出内容 String asciiOutput = new String(buf, StandardCharsets.US_ASCII); Log.d(TAG, "Received " + total + " bytes in " + cycles + " cycles: \nRaw Bytes: " + bufStr + "\nASCII: " + asciiOutput); }
3. 额外的硬件接线检查
- 确认UART引脚交叉连接:树莓派的RX引脚要接传感器的TX引脚(Pin 5),如果只是读取数据,树莓派的TX可以不用接传感器的RX
- 传感器供电要稳定:建议用树莓派的5V引脚给传感器供电,避免3.3V供电可能出现的电压不足问题
验证方式
调整完接线和代码后重新运行,正常情况下你应该能看到类似R045\r(对应45英寸)的ASCII输出。如果还是有问题,可以用树莓派上的minicom工具直接读取UART端口,先排除代码层面的问题,确认硬件输出是否正常。
内容的提问来源于stack exchange,提问作者Tom Hume
相关产品推荐
相关产品推荐

