Java SerialPortEvent 问题 : DATA_AVAILABLE calls faster then incoming data

标签 java events serial-port rxtx serial-communication

第一次发帖,希望大家按格式写。

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

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

现在我想返回此数据(完整字符串),但找不到 SerialPortEvent它将等到所有数据发送完毕后返回此字符串。

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

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;

最佳答案

我找到了一种方法来检查命令集 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);
  }
}

关于Java SerialPortEvent 问题 : DATA_AVAILABLE calls faster then incoming data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15408708/

相关文章:

java - ListIterator 抛出 "Exception in thread "main“java.util.ConcurrentModificationException”Java

java - Spring Servlet 过滤器的内部工作原理

java - 缓冲区和数据包

c++ - 来自串行的 100 Hz 数据

ubuntu - 在 ubuntu 中,我无法从 C 程序中通过 USB 串行端口发送两字节命令

java - 每次调用后都有不同的Web服务对象

java - 使用android中的房间数据库删除保存在文件夹中的照片

c# - 检查事件不为空后事件为空

当按下向右或向左箭头键时,C# 阻止列表框控件的默认操作

javascript - 在 JavaScript 中将函数指针传递给事件