5

初めて投稿するので、フォーマット通りに全部書いてほしいです。

現在、Javaアプリケーションと測定デバイス間でRXTXとのシリアル通信を使用するプロジェクトに取り組んでいます。これはうまく機能しますが、デバイスがイベントとともに送信するデータをキャッチしたいと思います。

以下のコードは機能しますが、次の問題 DATA_AVAILABLEがあります。すべてのデータが送信される前に4回呼び出されます。これをと呼ばれる文字列でvBufferキャッチし、データをキャッチして完全な文字列を取得できます。

このデータ(完全な文字列)を返したいのですが、SerialPortEventこの文字列を返すためにすべてのデータが送信されるまで待機するを見つけることができません。

以下の例では使用していますOUTPUT_BUFFER_EMPTYが、これはコマンドの送信の開始時に呼び出されます。つまり、コマンドを2回送信すると、OUTPUT_BUFFER_EMPTYイベントは最初のコマンドのデータを含むvBufferを返し、2番目のコマンドを開始した直後に返されます。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が開始されます。ただし、受信したすべてのデータが完了するまで待機しません。

編集:これを増やすために、それでも問題をさらに進めないでください。

serialEventメソッド:

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はメッセージの最後にあります)。これがtrueの場合、完全なメッセージが表示されます。

問題が解決しました!

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 に答える