2012-03-04 7 views
2

私はJavaで書かれたArduinoのロガーに取り組んでいます。Java Logger for Arduino

私がArduinoの遊び場からのサンプルコードを使用して開始している:

http://arduino.cc/playground/Interfacing/Java

私の問題は、私は思うここにある:

if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { 
     try { 
      int available = input.available(); 
      byte chunk[] = new byte[available]; 
      input.read(chunk, 0, available); 


      // Displayed results are codepage dependent 
      String print = new String(chunk); 
      test.write(print); 
      System.out.print(print); 


     } catch (Exception e) { 
      System.err.println(e.toString()); 
     } 

私はにデータを書き込みますクラスを書きましたcsvファイルそれがコンソールにデータを印刷するとき、それは完璧です。私は、ファイルにそれを書くとき、私はいくつかの完璧なラインを取得し、時にはなどの悪いライン:

60 
4 

5 
28 

私はそれが好きで、それを印刷したい:

604 
528 

私の書き込み方法は次のとおりです。

public void write(String print) 
{ 

    pw.print(System.currentTimeMillis()); 
    pw.print(","); 
    pw.println(print); 
} 

アドバイスをいただければ幸いです!

答えて

1

コンソールとファイルに印刷データを書き込む場合、まったく同じことをしません。生データをコンソールに出力するので、問題は発生しません。write()メソッドでデータを処理すると、問題が発生する可能性があります。

問題はあなたのwrite()メソッドではなく、あなたがそれを使う方法です。データがあるとすぐに、それを印刷します。問題は、すべてのデータを受け取っていない可能性があるため、早すぎると印刷することです。

オペレーティングシステムはデータが利用可能になったときに警告しますが、警告するとArduinoから送信された5バイトのうち3バイトしか受信できないことがあります。オペレーティングシステムでは、3バイトだけでなく5バイトも待っていることがわかりません。

すべてが受信されたことがわかるまで、データを保存して連結する必要があります。そのための二つの可能性が:

  • あなたはnバイトは、あなたのデータの終わりを示す文字フラグのため
  • 待ちnバイトを受信するまで、ストアデータを送信されることがわかっている場合:私はあなたがシリアルを使用したとします。 Arduinoでprintln()メソッドを使用すると、データの最後に "\ r \ n"が付くことになります。あなたが良いかもしれ

コード:-)新しい行を作成するために、Javeを教えてくれませんでしたが、私はないですので、それをシンプルに保つためにあるため、データを印刷するときに、あなたのファイルにいくつかの新しいラインを持っている理由ちなみに、それはあります直接印刷するときに何か問題が表示されない場合は、ちなみに

// Should be outside of your serialEvent method 
StringBuilder buffer = new StringBuilder(); 

public synchronized void serialEvent(SerialPortEvent oEvent) { 
    if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { 
     try { 
      int available = input.available(); 
      byte chunk[] = new byte[available]; 
      input.read(chunk, 0, available); 

      // We store data in a buffer 
      buffer.append(new String(chunk)); 
      // We check if we received the characters indicating 
      // the end of your data 
      int endOfLineIndex = buffer.indexOf("\r\n"); 
      // We don't, so we leave and wait for more data 
      if (endOfLineIndex == -1) { 
       return; 
      } 

      // The "+2" is to keep the "\r\n" 
      String print = buffer.substring(0, endOfLineIndex+2); 
      // Do not forget to remove what was used in the buffer 
      buffer.delete(0, endOfLineIndex+2); 

      test.write(print); 
      System.out.print(print); 

     } catch (Exception e) { 
      System.err.println(e.toString()); 
     } 
    } 
    // Ignore all the other eventTypes, but you should consider the other ones. 
} 

:Javaであなたのレベルの確認、およびコードを保つために、あなたはそのようなものを(警告、私はそれをテストしていない)行うことができます新しい行の文字がJavaコードではなくArduinoから来ているからです。したがって、画面に印刷する文字の間に何も挿入しないため、破損していないデータストリームを印刷します。あなたの例では、最初に "60"、次に "4 \ r \ n"を受け取ります。これは、画面上の一種の自動連結です。

+0

ありがとうございます!私はちょうど "\ r"が何かと思っています、私は "\ n"が新しい行を作成したと思っていました。 – user1247595

+0

遺産。古い機械式のタイプライターでは、現在の行(\ r)の先頭に戻り、新しい行(\ n)に移動しなければなりませんでした。コンピュータでは、新しい行のエンコーディングは、オペレーティングシステムによって異なります。通常、\ r \ n(古いタイプライターのような)、古いMacの場合は\ r、UNIXのようなオペレーティングシステムの場合は\ nです。しかし、それはすべての前に大会です。あなたはArduinoとあなたのコンピュータの間のプロトコルに\ nしか使えません。それはあなた次第です。しかし、デフォルトでは、Serial.println()を使うと\ r \ nが追加されます。 –