Teensy4.1和RaspberryPi 4之间如何使用串口进行数据交换

How to exchange data between Teensy4.1 and RaspberryPi 4 using serial interface

我需要在 Teensy4.1 和 RaspberyPi 4 之间交换数据(大约每秒 10 次 100 字节)。我决定通过串行接口进行此操作。 有Teensy代码:

float r=191.699997;
byte * b = (byte *) &r;
Serial8.write(b, 4);

出于测试目的,我硬编码了 191.699997。

请在下面找到 RaspberryPi Java 部分:

System.out.println("----------------");
System.out.format(7 + " : " + TEENSY.getData(7) + "\n");
System.out.format(8 + " : " + TEENSY.getData(8) + "\n");
System.out.format(9 + " : " + TEENSY.getData(9) + "\n");
System.out.format(10 + " : " + TEENSY.getData(10) + "\n");

data[0]=(byte)TEENSY.getData(7);
data[1]=(byte)TEENSY.getData(8);
data[2]=(byte)TEENSY.getData(9);
data[3]=(byte)TEENSY.getData(10);

System.out.format(7 + "' : " + data[0] + "\n");
System.out.format(8 + "' : " + data[1] + "\n");
System.out.format(9 + "' : " + data[2] + "\n");
System.out.format(10 + "' : " + data[3] + "\n");

ByteBuffer buffer = ByteBuffer.wrap(data);
int first = buffer.getInt();
float second = buffer.getFloat();

System.out.print("int: " + first);      System.out.print("\n");
System.out.printf("float: %f \n", second);
System.out.println("----------------");

以上代码的输出如下所示:

----------------
7 : 51
8 : 179
9 : 63
10 : 67
7 : 51
8 : -77
9 : 63
10 : 67
int: 867385155
float: 0.000000
----------------

我明白为什么会有差异,但不知道如何让它工作(工作我的意思是如何在 Raspberry Pi 端获得 191.699997。

提前感谢您的提示。

您有两个问题:ByteBuffer 在“getting”之后前进位置并且 Java 默认为大端:

此代码应演示:

public static void main(String[] args) {
    byte[] b = new byte[4];
    b[0] = 51;
    b[1] = -77;
    b[2] = 63;
    b[3] = 67;

    ByteBuffer buffer = ByteBuffer.wrap(b);
    int first = buffer.getInt();
    float second = buffer.getFloat(0);
    
    System.out.println("f="+first+" s="+second);
    
    b[0] = 67;
    b[1] = 63;
    b[2] = -77;
    b[3] = 51;

    buffer = ByteBuffer.wrap(b);
    first = buffer.getInt();
    second = buffer.getFloat(0);
    
    System.out.println("f="+first+" s="+second);

}

打印:

f=867385155 s=8.346844E-8
f=1128248115 s=191.7

并进一步查看十六进制整数 1128248115(从 Java 打印):

0x433FB333

和整数 867385155 您的代码以十六进制显示(来自 PI 端的 Java):

0x33B33F43

请注意,您可以通过以下方式更改 ByteBuffer 的字节顺序:

ByteBuffer buffer = ByteBuffer.wrap(b).order(ByteOrder.LITTLE_ENDIAN);

然后你的代码就可以工作了(再次使用 getFloat(0)!:

    byte[] b = new byte[4];
    b[0] = 51;
    b[1] = -77;
    b[2] = 63;
    b[3] = 67;


    ByteBuffer buffer = ByteBuffer.wrap(b).order(ByteOrder.LITTLE_ENDIAN);

    int first = buffer.getInt();
    float second = buffer.getFloat(0);
    
    
    System.out.println("f="+first+" s="+second);

版画

f=1128248115 s=191.7