JSerialComm无法从Arduino读取整个字符串

时间:2019-11-08 17:00:22

标签: java arduino

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

我在Windows 10上使用IntelliJ,Adruino IDE 1.8.10和JDK 13。

当前字符串很长,可能会导致大小变化,所以我不能只读取一定数量的字节。

我什至目前正在打印字符串,字符串的前面是#,结尾是*。我的设计目前正在以某种方式丢失数据,只能得到可接受的字符串,可能是发送的十分之一。

    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 个答案:

答案 0 :(得分:0)

想到两个问题。

1)什么是仅在编写完整消息后才调用代码的同步方法?当Arduino仅编写部分消息时,什么使代码无法运行?

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

以上两个问题中的任何一个都可能导致您有时错过角色。它们不是串行通信故障的唯一根源,而是系统设计应解决的问题。