我想从我的Arduino发送整数值到Java应用程序 . 为此,我使用的是串口 . 在Arduino的处理程序中,我将以下内容打印到串口:
Serial.print(accel, DEC)
accel
是一个带符号的int . 在我的Java代码中,我正在实现 SerialPortEventListener
,我正在从输入流输入中读取一个字节数组 .
public synchronized void serialEvent(SerialPortEvent oEvent) {
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
int available = input.available();
byte[] chunk = new byte[available];
input.read(chunk);
System.out.println (new String(chunk));
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
我需要将这个字节数组转换为整数,但我不知道如何做到这一点 . Arduino教程Lesson 4 - Serial communication and playing with data表示Arduino以两个字节(16位)存储签名的整数 . 我已经尝试将两个字节的数据读入一个数组块,然后使用以下代码将这两个字节解码为整数 .
public synchronized void serialEvent(SerialPortEvent oEvent) {
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
int available = input.available();
int n = 2;
byte[] chunk = new byte[n];
input.read(chunk);
int value = 0;
value |= chunk[0] & 0xFF;
value <<= 8;
value |= chunk[1] & 0xFF;
System.out.println(value);
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
这应打印出在-512和-516之间波动的整数流,但事实并非如此 . 代码打印出以下内容 .
2949173
3211317
851978
2949173
3211317
851978
2949173
3211319
如何解码从Arduino通过串口到整数的字节?
3 回答
您可以使用
ByteBuffer
将byte转换为int,您的代码将如下所示:编辑:我应该已经识别出ascii数字:-)
为什么不:制定面向行的协议;使用java BufferedReader和.readLine() . 使用Integer.valueOf()解析字符串 . 请注意,换行符用作框架字符 .
它是如何使用大多数GPS GPS设备和各种非常重要的设备 . 在任何方面都不是最佳的,但你去......
事实证明,Arduino上的Serial.print()函数将值转换为字符串并将字符串发送到串行端口,这就是我的位移不起作用的原因 . 一种解决方案是将我的java代码中的值作为字符串收集,然后将字符串转换为int .
但是,要避免将值从字符串转换为int的步骤,可以使用serial.write()函数将int发送到串行端口 . 为此,在Arduino草图中,定义int和相同大小的字节数组的并集 . 然后创建union的实例,设置整数,并将Serial.write()创建为匹配的字节数组 . 收集Java程序中的字节数组并进行一点移位以获取整数 .
我的Arduino草图编码如下:
我读取字节数组并将其转换为int的java代码如下所示:
我仍然在寻找一种从Arduino到java代码中获取浮点数或双精度的方法 . 我知道我可以通过将union中的int替换为double或float,设置double或float,以及Serial.write()匹配的字节数组来编写float或double . 我的问题来自Java方面 . 一旦我收集了字节数组,我就没有找到一种方法来正确地将数据移位到float或double . 有什么帮助吗?