5

我是第一次发帖,所以我希望我按照格式写所有东西。

目前,我正在开发一个在 java 应用程序和测量设备之间使用串行通信与 RXTX 的项目。这很好用,但现在我想捕获设备随事件发送的数据。

下面的代码有效,但存在以下问题: DATA_AVAILABLE在发送所有数据之前将被调用 4 次。我在一个名为的字符串中捕获它,vBuffer并且我能够捕获数据以获取完整的字符串。

现在我想返回这个数据(完整的字符串),但是找不到一个SerialPortEvent会等到所有数据都发送后才返回这个字符串的。

在下面的示例中,我使用了OUTPUT_BUFFER_EMPTY但这在发送命令的开始时调用。这意味着当第二次发送命令时,OUTPUT_BUFFER_EMPTY事件将返回 vBuffer 以及来自第一个命令的数据,然后立即启动第二个命令。在第 3 次OUTPUT_BUFFER_EMPTY发送来自第 2 个命令的数据并启动第 3 个等。

有没有办法DATA_AVAILABLE等到所有数据都发送完毕,或者在发送完所有数据后是否有另一个事件会被调用?

额外信息:发送带有Stringbuilder字符的命令,以确保发送设备的正确格式。命令的布局如下:<STX><COMMAND><RTX><CR><LF>. 我可以通过查看命令何时结束来赶上结束吗?如果是这样,怎么做?

更新:这是我发送函数的代码:

  StringBuilder message = new StringBuilder();
  message.append(new Character((char) 2));   // STX (Start of Text)
  message.append("M");                       // Command character
  message.append(new Character((char) 3));   // ETX (End of Text
  message.append(new Character((char) 13));  // CR (Carriage Return)
  message.append(new Character((char) 10));  // LF (Line Feed)
  outputStream.write(message.toString().getBytes());

在此之后,DATA_AVAILABLE将启动。但不要等到所有接收到的数据都完成。

编辑:为了解决这个问题,问题仍然没有进一步。

串行事件方法:

public void serialEvent(SerialPortEvent event)
 {
  switch (event.getEventType())
  {
   case SerialPortEvent.BI:
   case SerialPortEvent.OE:
   case SerialPortEvent.FE:
   case SerialPortEvent.PE:
   case SerialPortEvent.CD:
   case SerialPortEvent.CTS:
   case SerialPortEvent.DSR:
   case SerialPortEvent.RI:
   case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
    if (vBuffer != "")
     {
      System.out.println(vBuffer);
     }
     break;  
   case SerialPortEvent.DATA_AVAILABLE:
    byte[] readBuffer = new byte[40];

    try
    {
      while (inputStream.available() > 0)
      {
        int numBytes = inputStream.read(readBuffer);
      }
      vBuffer += new String(readBuffer);
      System.out.print(new String(readBuffer));
    }
    catch (IOException e)
    {
      System.out.println(e);
    }
    break;
4

1 回答 1

3

我找到了一种检查命令集 STX 和 ETX 的方法,也可以查看消息是否完整(ETX 在消息的末尾)。如果这是真的,那么我有一个完整的消息。

问题解决了!

public void serialEvent(SerialPortEvent event)
{

 if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE)
 {
  System.out.println("Data available event received");

  try
  {
    int available = inputStream.available();
    byte[] readBuffer = new byte[available];

    if (available > 0)
    {
      inputStream.read(readBuffer);
    }

    messageBuffer = messageBuffer + new String(readBuffer);

    try
    {
      int start = messageBuffer.indexOf(new Character((char) 2));
      int end = messageBuffer.indexOf(new Character((char) 10));

      if (start >= 0 && end >= 0)
      {
        System.out.println("We found 1 complete message!!");
        System.out.println(messageBuffer.substring(start, end));
        _fireBufferEvent();
        messageBuffer = "";
      }
    }
    catch (IndexOutOfBoundsException ex)
    {
      System.out.println("IndexOutOfBoundsException, message not complete yet. Waiting for more data.");
    }
  }
  catch (IOException ex)
  {
    System.out.println("IOException while reading data:");
    System.out.println(ex);
  }
}
于 2013-04-02T08:39:55.693 回答