1

センサーからの入力を読み取るためにハイパーターミナルを使用しています。このセンサーは、値 6 桁または 5 桁と小数点 (ただし、スペース 2 つと 3 桁と小数点 1 つ) の形式である必要がある文字列を送信します。など) タブ セパレーター文字列 例 (F-18 または C-11) タブ セパレーター タブ CRLF 文字列の終了識別子。

ハイパーターミナルを介してこの入力を監視すると、完全に読み取られます

0.00  kBq      F-18 2D

ただし、それを読むと、ほとんどの場合、文字列の壊れたセグメントが表示され、正しい文字列が返されることがあります。返されるものの例を以下に示します。

0.00  k□□□□□□□□□□□□□

Bq      F-18 2D□□□□□□□□□

0.00  kBq      F-18 □□□

0.002D
□□□□□□□□□□

私が使用するコードは、RXTX ライブラリからのものです。

public void serialEvent (SerialPortEvent event){  
    if (event.getEventType()== SerialPortEvent.DATA_AVAILABLE){  
       byte[] readBuffer = new byte[19];  
       try{  
            while (inputStream.available() > 0){  
                int numBytes = inputStream.read(readBuffer);  
                }
       catch (IOException e) {}  
       input_line = new String (readBuffer);  
       inter.update(input_line);}}  
4

1 に答える 1

1

これは仕様によるものです。Read() 呼び出しからすべてのバイトを取得すると想定しています。それはどのように機能するかではなく、これまでに受信したバイトのみを提供します。これはハイパーターミナルでも起こりますが、あなたの目はそれほど速くないので気付かないでしょう。

readBuffer をメソッドの外に移動し、完全な応答を受け取るまで徐々に埋める必要があります。それからそれを処理します。

デバイスが単純な ASCII テキストと行末記号のみを送信する場合 (これはよくあることです)、SerialPort.ReadLine() を呼び出すことは、応答ですべての文字を確実に取得するための良い方法です。必要に応じて NewLine プロパティを微調整します。

于 2012-10-25T13:50:08.730 に答える