Java JSerialComm未从Arduino读取整个字符串

Java JSerialComm未从Arduino读取整个字符串,java,arduino,Java,Arduino,我在Java应用程序中使用jSerialComm从Arduino接收数据。但是,Java程序只读取传入的“字节”。这不好,因为我的Arduino正在打印一个长字符串,我希望Java应用程序读取整个字符串而不丢失任何信息。我的Arduino每秒发送两次数据字符串 我在Windows10上使用JDK13,使用IntelliJ、AdruinoIDE1.8.10 目前这个字符串很长,可能会改变大小,所以我不能只读取一定数量的字节 我现在甚至正在打印前面有一个#,后面有一个*的字符串。不过,我的设计目前正

我在Java应用程序中使用jSerialComm从Arduino接收数据。但是,Java程序只读取传入的“字节”。这不好,因为我的Arduino正在打印一个长字符串,我希望Java应用程序读取整个字符串而不丢失任何信息。我的Arduino每秒发送两次数据字符串

我在Windows10上使用JDK13,使用IntelliJ、AdruinoIDE1.8.10

目前这个字符串很长,可能会改变大小,所以我不能只读取一定数量的字节

我现在甚至正在打印前面有一个#,后面有一个*的字符串。不过,我的设计目前正在以某种方式丢失数据,只发送了一个可接受的字符串,可能是10个字符串中的1个

    byte[] newData = new byte[comPort.bytesAvailable(0];
    int numRead = comPort.readBytes(newData, newData.length);
    stringBuffer = new String(newData,0,numRead);
    if (stringBuffer.startsWith("#"))
    {
         serialString+=stringBuffer;
         while (!stringBuffer.endsWith("*")
         {
              numRead = comPort.readBytes(newData, newData.length);
              stringBuffer = new String(newData,0,numRead);
              serialString+=stringBuffer;
         }

         //double check it is the proper format
         if (serialString.startsWith("#") && serial.String.endsWith("*")
         {
              //do stuff
         }
         serialString = "";
    }
除了readBytes()之外,还有其他方法可以使用吗?我知道我可以使用getInputStream(),但我不确定从那里可以走到哪里


提前非常感谢。

我想到了两个问题

1) 什么是同步方法,仅在编写完整消息时调用代码?当Arduino只编写了部分消息时,是什么阻止代码运行

2) 您有任何类型的流量控制设置吗?Arduino需要做的只是写一个长字符串,但PC端代码需要将其接收到多个缓冲区中。如果您使用的是内置硬件串行端口,那么单次PC中断可能只能接收16个字符左右。然后,该缓冲区由操作系统通过操作系统驱动程序发送到应用程序。如果您使用的是USB到串行适配器,那么可能会发生类似的问题,长字符串会被分成多个缓冲区,然后通过操作系统驱动程序发送到您的程序。您的程序不需要了解所有这些“引擎盖下”缓冲区管理,但它可能会导致您的电脑偶尔需要Arduino暂停发送数据。这就是软件握手协议的目的;允许慢速接收器暂停快速发送器


以上两个问题中的任何一个都可能导致你偶尔错过一个角色。它们不是串行通信故障的唯一来源,但它们应该由您的系统设计来解决。

分配一个固定大小的缓冲区(
newData
)。开始时可能有0个字节available@Juraj谢谢你的回复。我正在查找缓冲区,但我不确定它们是如何使用的,尤其是在本例中。我需要什么样的缓冲?缓冲数据流?谢谢<代码>字节[]新数据=新字节[64]@Juraj我很惊讶,如果我将其更改为硬编码的数字,它似乎从未获得正确的字符串。打印stringBuffer以查看接收到的内容