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
我需要在 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