Java 从Arduino读取串行数据

Java 从Arduino读取串行数据,java,serial-port,arduino,Java,Serial Port,Arduino,我正在尝试使用Java从我的Arduino读取串行数据。我遵循了教程 到目前为止,我已经让它工作了,除了,我没有一次读取全部串行数据。例如,Arduino应该发送0.71,我读取的是0,然后是a.71或其他组合。有时我读得很好,但更多的时候,数据被分解了 我有一种预感,如果我将发送的数据类型更改为一个字节,我的程序就可以了,但是我需要传输数据的浮点精度。如何解决此问题?串行协议(如用于USB串行传输的协议)是面向字节的,而不是面向数据包的。因此,正如您所观察到的,无法保证读操作会返回另一端发送的

我正在尝试使用Java从我的Arduino读取串行数据。我遵循了教程

到目前为止,我已经让它工作了,除了,我没有一次读取全部串行数据。例如,Arduino应该发送0.71,我读取的是0,然后是a.71或其他组合。有时我读得很好,但更多的时候,数据被分解了


我有一种预感,如果我将发送的数据类型更改为一个字节,我的程序就可以了,但是我需要传输数据的浮点精度。如何解决此问题?

串行协议(如用于USB串行传输的协议)是面向字节的,而不是面向数据包的。因此,正如您所观察到的,无法保证读操作会返回另一端发送的整个“消息”,或者只是其中的一部分,因为没有消息或数据包的概念


相反,您需要以某种方式对消息进行分隔,例如通过添加换行符或使用长度字段预结束消息,以便您知道要读取多少字节。

我通过让Arduino发送“帧”,并用“间隔”分隔。配置从串行端口读取数据的超时(至少在Perl中是这样)很容易。所以我要做的是:

  • 允许在数据帧持续时间加上额外的几毫秒期间读取数据:

    [(字节数)×10位×1000毫秒/(波特率)]+100毫秒

  • 然后发送的两个值或帧之间的间隔应大于此值

  • 由于策略性超时,程序很容易与数据流同步
  • 我还在数据中添加了一个简单的前导,以检查数据的完整性

既然我在arduino上发送了一个4字节的浮点;如果我读取的数据少于4字节,我可以缓冲我的数据吗?一旦我读取了所有4个字节,我就知道我的输入数据是好的。@jos76是的,如果你知道你正在发送4个字节,那就可以了。不过,在您给出的示例中,您发送的是十进制数,而不是4字节浮点数。