java - 如何使用串行接口在 Teensy4.1 和 RaspberryPi 4 之间交换数据
问题描述
我需要在 Teensy4.1 和 RaspberyPi 4 之间交换数据(大约 100 字节,每秒 10 次)。我决定通过串行接口来完成。有青少年代码:
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
“获取”之后的前进位置和 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
请注意,您可以通过以下方式更改 a 的字节顺序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
推荐阅读
- javascript - 如何在反应组件中运行自执行 JS 脚本?
- mysql - 如何使用不同的 WHERE 对 UPDATE 进行单个查询?
- excel - 遍历包含图表的工作表,将两个 ChartObjects 复制到另一个工作表中
- kubernetes - Skaffold 1.4.0:“由于同步错误而跳过部署:复制文件:”
- python - Python 读取 .bin 数据并转换为字符串
- sql - MS-Access 中的 LEFT JOIN 与多个匹配条件 (AND(OR)) 陷入困境
- php - PHP缓存 - 我错过了一些明显的东西吗?
- groovy - 将 Groovy 3 YamlBuilder 与包含连字符的 Yaml 一起使用
- javascript - JavaScript 日期中这种非一错误的来源是什么?
- angular - 使用 Route Resolver 时,Angular Universal 不会在视图源中加载我的组件