RXTX Java librairie bug

时间:2014-01-07 16:08:00

标签: java arduino rxtx

我的英语不太好,所以我会尽力为你清楚。 我目前正在开展一个多项目项目。 我编写了一个Arduino控制程序,它允许我通过命令管理传感器网络。例如,我可以通过输入命令“add”等来添加传感器......

我还为微控制器编写了一个用于传感器数据采集的Java API(适用于所有类型的微控制器),它能够将命令文件发送到我的微控制器,以获取接收的数据并将其存储到我选择的格式的文件(JSON,XML,PostScript,字节码...),也可以在http标头格式下发送到IP地址......

我有以下问题:

当我从Java程序向我的微控制器发送命令时,Java程序有时无法接收命令执行响应,导致它崩溃:

Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7
Received line : I: Tab cleared.
Received line : I: Setup terminated
|MicroController.java->messageReceived|: recieved response : I: Setup terminated
Send : add t1 2 3
Received line : I:|Main loop| command received :add t1 2 3
Received line : I:|Main loop| command add t1 2 3 in execution ...
Received line : I:|Main loop| command add t1 2 3 executed.
Received line : I:|Main loop| return code 0 sent.

如您所见,微控制器发送了返回码“0”,但Java没有收到它。

我已经编写了自己的send()和receive()方法:

/**
 * Send message.
 * 
 * @param str String to send.
 * 
 * @throws IOException IO error.
 * @throws InterruptedException 
 */
public void sendMessage(String str)
throws IOException, InterruptedException
{
   System.out.println("Send : " + str);

   // Send the command.
   output.write(str.getBytes());
   output.flush();
}

/**
 * Handle input event on the serial port.
 * 
 * @param oEvent Event receives.
 */
private synchronized void processReceivedEvent(SerialPortEvent oEvent)
{
   if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE)
   {
      try
      {
         // Wait input to be ready (mandatory, exception o/w).
         while (!input.ready())
         {
            Thread.sleep(1);
         }
         String inputLine = input.readLine();
         System.out.println("Received line : " + inputLine);

         // Notify listener.
         if ((listener != null) && (inputLine != null))
            listener.messageReceived(inputLine);
      }
      catch (Exception e)
      {
         if (port != null)
            e.printStackTrace();
      }
   }
}

也许我有一些同步错误,导致串行读取错误,但我很想知道我的发送和接收方法与串行librairie方法之间是否存在某种冲突......

感谢。

1 个答案:

答案 0 :(得分:0)

我终于解决了这个问题。我的代码中有一个BufferedReader,它正在崩溃阻止程序。 由于串行链接和这个无用的BufferedReader(当然在我的程序中没用),微控制器发送的消息与Java程序接收的消息之间有太多层,所以它在大多数时间都处于超时状态。

我放了一个简单的InputStream,以避免图层,并开发自己的阅读方法。

但我也有一个长期存在的问题:

当微控制器设置完成后,它会向Java程序发送以下消息:“I:Setup terminated”。

如果Java程序没有收到此消息,它将进入超时状态。 但有时,Java程序收到“termI:Setup terminated”,在“I:”前面有一些字符。

我不知道从哪里来......如果你有任何线索,那就太好了。

谢谢!