1

Com ポートと通信できるように JSSC API を実装しました。「N\r\n」のようなコマンドを送信します

通常のハイパーターミナルで受け取るものは次のようになります。

0100071CA79215021803164442180000

0100071C9F5415021803164514520000

0100071CDF5115022106142956600000

ノック

しかし、JSSC API で同じことをすると、これを受け取ります (最初のコードのみ)

010

0071CA79

2150218

0316444

218

問題は、ビット部分をランダムに受け取り、コードの最後で一部を失うことです。しかし、それは重要ではありません。すべてのコードの最初の 12 桁だけが必要です。

問題は、ビットパーツではなくフルラインのみを受け取るように関数を取得するにはどうすればよいですか?

これはクラス Class PortReader2 implements SerialPortEventListener {

    @Override
    public void serialEvent(SerialPortEvent event) {
        if(event.isRXCHAR()&& event.getEventValue() > 2) {
            try {
                // получение ответа от порта
                String receivedData = serialPort.readString();
                System.out.println(receivedData.length() + ":" + receivedData);
            }
            catch (SerialPortException ex) {
                System.out.println("Error in receiving response from port: " + ex);
            }
        }

    }
}

これが送信部分です

    public void sendCodeCommand(SerialPort serialPort) {
    // writing string to port
    try {
        Thread.sleep(3000);
        serialPort.writeBytes("N\r\n".getBytes());
    } catch (SerialPortException | InterruptedException ex) {
        Logger.getLogger(ComPortSendReceive.class.getName()).log(Level.SEVERE, null, ex);
    }
        System.out.println("String wrote to port, waiting for response..");
    }
4

1 に答える 1

0

上記の問題を解決するには、受け取った文字列を別の文字列に連結する必要があります。この文字列は、serialEvent ハンドラーにある readString() 関数から受け取った文字列フラグメントを蓄積します。これはowmスレッドであるため、シリアルデータを取得するために一定のCPU時間を取得し、シリアルポート入力データの部分的な順次読み取りを効果的に取得します。したがって、この例では部分入力をまとめて「全体」入力を作成します。

String serialString;

したがって、serialEvent ハンドラー内では次のようになります。

try {
serialStringFragment = serialPort.readString();
serialString.concat(serialStringFragment);
}

readString() から取得した文字列または累積文字列のいずれかをスキャンして、eol 条件などのトークンを見つけることができます。例えば:

String [] dlLines = serialString.split("\r\n");

各行を dlLines 文字列配列の要素に分割します。

ただし、ターゲットデバイスから固定長の出力がある場合、これはよりうまく機能することがわかりました。

serialPort.readString(int bytecount);

書き込みシリアル文字列とインライン化して、serialEvent ハンドラーを排除します。

これは少し不自然ですが、言い換えれば:

String expectedStringLength "0100071CA79215021803164442180000";
int serialstrlen = expectedStringLength.length();

したがって、serialstrlen は、予想される行ごとに明らかに定数になるはずです。

serialPort.writeString("N\r\n");
serialPort.readString(serialstrlen+2); // assuming cr lf 

最初の行を取得する必要があります。

readString() をループに入れて、予想される文字列に従って serialstrelen 引数の値を変更します。エラー処理用の代替コンテンツの文字列を確認してください。これは私にとってはうまくいきました。

于 2015-06-20T20:26:08.510 に答える