首页 文章

使用串行端口将Ardunio中的整数发送到Java程序,并将两个字节的数组转换为Java中的整数

提问于
浏览
3

我想从我的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 回答

  • 0

    您可以使用 ByteBuffer 将byte转换为int,您的代码将如下所示:

    ByteBuffer bb = ByteBuffer.wrap(chunk);
    System.out.println(bb.getInt());
    
  • 0

    编辑:我应该已经识别出ascii数字:-)

    为什么不:制定面向行的协议;使用java BufferedReader和.readLine() . 使用Integer.valueOf()解析字符串 . 请注意,换行符用作框架字符 .

    它是如何使用大多数GPS GPS设备和各种非常重要的设备 . 在任何方面都不是最佳的,但你去......

  • 0

    事实证明,Arduino上的Serial.print()函数将值转换为字符串并将字符串发送到串行端口,这就是我的位移不起作用的原因 . 一种解决方案是将我的java代码中的值作为字符串收集,然后将字符串转换为int .

    但是,要避免将值从字符串转换为int的步骤,可以使用serial.write()函数将int发送到串行端口 . 为此,在Arduino草图中,定义int和相同大小的字节数组的并集 . 然后创建union的实例,设置整数,并将Serial.write()创建为匹配的字节数组 . 收集Java程序中的字节数组并进行一点移位以获取整数 .

    我的Arduino草图编码如下:

    union{
      int i;
      byte b[2];
    }u;
    u.i = accel;
    Serial.write(u.b, 2);
    

    我读取字节数组并将其转换为int的java代码如下所示:

    int n = 2;
    byte[] chunk = new byte[n];
    input.read(chunk);
    short value = 0;
    // get 2 bytes, unsigned 0..255
    int low = chunk[0] & 0xff;
    int high = chunk[1] & 0xff;
    value =  (short) (high << 8 | low) ;
    System.out.println(value);
    

    我仍然在寻找一种从Arduino到java代码中获取浮点数或双精度的方法 . 我知道我可以通过将union中的int替换为double或float,设置double或float,以及Serial.write()匹配的字节数组来编写float或double . 我的问题来自Java方面 . 一旦我收集了字节数组,我就没有找到一种方法来正确地将数据移位到float或double . 有什么帮助吗?

相关问题