2012-02-15 13 views
1

Javaのシリアル通信で問題が発生しました。私のjennicハードウェアデバイスはUARTを使用して接続されています。私は私が最初に私がバイトを読み、[]バフに保管し JavaでのSerialPortの読み込み

 case SerialPortEvent.DATA_AVAILABLE: 
      try { 
        int size; 
        while(inputStream.available()!=0) { 
         byte buff[]=new byte[100]; 
         size=inputStream.read(buff); 
         inputStream.close(); 
         String result = new String(buff,0,size); 
         ZPS_tsAplZdpIeeeAddrRsp IeeRsp = new ZPS_tsAplZdpIeeeAddrRsp(result); 
       } 

SerialPortEvent.DATA_AVAILABLE

内の文字列のバイト配列を受け付けております

..値は私のデバイスを形成取得したいです。それを文字列に変換し、後に文字列配列に変換します。しかし、私の問題は、私が外に出す時間は数分の一にします。

出力例:

80011634002078445541560000341201004189 

    80011635002078445541560000341201004189 

    80011636002078445541560000341201004189 
    /*Here is Break my seq */ 
    800116370020784455 

    41560000341201004189/*this two breaking seq generated two separate array and here is the problem*/ 

    80011638002078445541560000341201004189 

私はinputStream.resetを試してみました()が、それは動作しません入力バッファをフラッシュするための問題があるが...誰も私の問題を克服するために、適切な提案を与えることができます。

ありがとう...

答えて

0

ポートからバッファに読み込む必要があります。バッファ全体がメッセージを持っている場合は、バッファのその部分をメッセージ処理ルーチンにフラッシュします。つまり、各メッセージを個別に識別して分離できるようにメッセージを定義する必要があります。

ストリームの読み取りは、データが利用可能であるか利用できない場合に機能します。しかし、ストリームを読み込んでも、1つのメッセージサイズのデータ​​でデータを取得することは保証されません。あなたは、読むべきデータがあることに気づくだけです。 のデータがシリアルポートバッファーに読み込まれており、メッセージのすべてが読み込めるようになる前に読み始めると、共通の問題に気付きました。プログラムが "次の"メッセージを読む準備が整う前に、2回以上のメッセージがシリアルポートバッファにバッファリングされるかもしれないという別の問題が発生する可能性があることに注意してください。

メッセージを読み取ることができるまでバイトを保持するバッファ(クラス)にバイトを読み込む通信プロトコルです。次に、メッセージレベル(メッセージが完全になるまでバッファリング)を除いて、read()のように動作するバッファーreadMessage()上にインターフェースを置きます。

1

「問題」はあなたの期待です。 read()がバッファを満たすか、シリアルデータ転送によってメッセージの境界が保持されるとは言いません。それはあなた次第です。あなたが得るのはバイトストリームだけです。

0

通常、シリアル接続の一方の端から送信される「メッセージ」は、すべて1つのグループとして受信されることは期待できません。あなたはそれを一度に、または様々な長さのいくつかのチャンクで得ることができます。入ってくるデータについて知っているものを使って、シリアルポートからバイトを読み込み、それらをまとめて、完全なメッセージが受信されたときに認識するのは受信プログラムの責任です。

通常、デバイスは、3つの方法のいずれかでこれを処理:

  • 修正長のパケット - あなたはXのバイトを得るまで読み、次にそれらのXバイトを処理します。
  • パケット長は、完全なパケットまで受信したデータを考慮する前に、いくつの追加バイトを読み込むかを示すパケットヘッダーの一部です。
  • パケット開始/終了インジケータ(開始するSTXまたはSOH、通常は終了するETX)。開始標識と終了標識の間で受け取ったすべてのデータを1つのメッセージ・パケットとして扱います。
関連する問題