2013-03-14 6 views
5

初めて投稿していますので、フォーマットに従ってすべてを書き込むことを願っています。Java SerialPortイベントの問題:DATA_AVAILABLEは、受信データをより早く呼び出します

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

以下のコードは動作しますが、すべてのデータが送信される前に DATA_AVAILABLEが4回呼び出されます。 私はこれをvBufferという文字列で捕まえ、完全な文字列を得るためにデータを捕まえることができます。

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

次の例では、私はOUTPUT_BUFFER_EMPTYを使用しますが、これはコマンドの送信の冒頭で呼び出されます。これは、2回目のコマンドを送信するときに、OUTPUT_BUFFER_EMPTYイベントが最初のコマンドのデータとともにvBufferを返し、2番目のコマンドを開始した直後であることを意味します。 3回目にOUTPUT_BUFFER_EMPTYは2番目のコマンドからデータを送信し、3番目のコマンドを開始します。

すべてのデータが送信されるまで待機する方法はありますか、すべてのデータが送信された後に呼び出される別のイベントがありますか?

追加情報:コマンドは、Stringbuilderのcharsで送信され、デバイスの正しいフォーマットが送信されていることを確認します。コマンドのレイアウトは、<STX><COMMAND><RTX><CR><LF>です。 コマンドが終了したときを見て最後を捉えることができますか?もしそうなら、どうですか?

更新:これは私が機能を送る方法コードです:。このDATA_AVAILABLE

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()); 

でキックされますが、受信したすべてのデータが行われるまで待機しません。

編集:この問題を解決するには、それ以上問題はありません。

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; 
+0

すべてのデータを受信したと思いますか?あなたの側から。 – partlov

+0

本当に何を意味するのか分かりませんが、受信した文字列には接続されたデバイスの測定データが含まれています。そしてそのストリング私は分割するつもりです。私はハードコーディングされた方法(睡眠を余儀なくされた)を行ってきましたが、今のところハードコードされた部分を持たずにこれを達成しようとしています。 – Skillcoil

+0

"すべてのデータが送信されるまでDATA_AVAILABLEに待機する方法はありますか?"私はあなたが何かを送っているのを見ず、受け取っているだけです。すべてのデータが受信されるまで待つことを意味しますか? – partlov

答えて

2

私は、コマンドをチェックする方法を見つけたが(ETXは、メッセージの最後にある)のメッセージが完了したかどうかを確認あまりにもSTXと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); 
    } 
} 
関連する問題