如何通过串口接口实现Teensy4.1与Raspberry Pi 4之间的数据交互
问题核心原因
你遇到的是字节序(端序)不匹配和缓冲区读取顺序错误两个问题:
- Teensy 4.1采用的Cortex-M7内核默认是小端模式,你直接把float转成字节发送,输出的4个字节是小端排序
- Java的
ByteBuffer默认使用大端(网络字节序)解析数据,和Teensy的字节顺序完全相反 - 你的代码中先调用
getInt()读取了全部4个字节,后续调用getFloat()时缓冲区已经没有数据,自然返回0.0
你收到的4个字节本身是正确的:输出的51、179、63、67对应十六进制是0x33、0xB3、0x3F、0x43,按小端拼接后得到单精度浮点编码0x433FB333,对应的数值正好是你要的191.699997。
修正方法
只需要修改Java端的ByteBuffer解析逻辑即可,不需要改动Teensy的代码:
- 为ByteBuffer指定小端字节序匹配Teensy的输出
- 不需要额外读取int值,直接读取float即可
修正后的代码片段:
import java.nio.ByteBuffer; import java.nio.ByteOrder; // 你原有读取4个字节到data数组的逻辑保持不变 ByteBuffer buffer = ByteBuffer.wrap(data); // 关键配置:指定使用小端字节序解析 buffer.order(ByteOrder.LITTLE_ENDIAN); // 直接读取float值 float result = buffer.getFloat(); System.out.printf("解析得到的数值: %f \n", result); // 输出结果为 191.699997
可选优化建议
如果后续你需要传输更多数据,建议增加简单的帧校验规则:比如在每次发送数据前先发送2个固定的帧头字节(例如0xAA 0xBB),树莓派端先识别到帧头后再读取后续的有效数据,可以避免串口偶发丢包导致的数据解析错位问题。
内容的提问来源于stack exchange,提问作者bzc0fq
相关产品推荐
相关产品推荐

