7

RXTX を約 1 年間使用していますが、あまり問題はありません。新しいハードウェアと対話する新しいプログラムを開始したばかりなので、他のプロジェクトで使用した connect() メソッドを再利用しましたが、これまでに見たことのない奇妙な問題があります。

問題

デバイスは正常に動作します。ハイパーターミナルに接続すると、期待どおりのものが送信され、受信され、シリアル ポート モニター(SPM) がこれを反映するためです。

ただし、メインアプリで発生している問題を診断するために書いた単純な HyperTerminal-clone を実行すると、SPM に従ってバイトが送信されますが、何も受信されず、SerialPortEventListener が起動しません。メインループで利用可能なデータをチェックしても、reader.ready()が返されますfalse。このチェックを無視すると、例外が発生します。詳細は以下をご覧ください。

connect() メソッドの関連セクション

// Configure and open port
port = (SerialPort) CommPortIdentifier.getPortIdentifier(name)
                                      .open(owner,1000)
port.setSerialPortParams(baud, databits, stopbits, parity);
port.setFlowControlMode(fc_mode);
final BufferedReader br = new BufferedReader(
                            new InputStreamReader(
                              port.getInputStream(), 
                              "US-ASCII"));

// Add listener to print received characters to screen
port.addEventListener(new SerialPortEventListener(){
  public void serialEvent(SerialPortEvent ev) {
    try {
      System.out.println("Received: "+br.readLine());
    } catch (IOException e) { e.printStackTrace(); }
  }   
});
port.notifyOnDataAvailable();

例外

java.io.IOException: Underlying input stream returned zero bytes
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:268)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
        at java.io.InputStreamReader.read(InputStreamReader.java:167)
        at java.io.BufferedReader.fill(BufferedReader.java:136)
        at java.io.BufferedReader.read(BufferedReader.java:157)
        at <my code>

大きな問題 (再び)

考えられるすべてのハードウェアの問題を排除したと思いますが、私のコードまたは RXTX ライブラリのどこが悪いのでしょうか?

編集:何か面白い

応答を取得するはずの Java から一連のコマンドを送信した後にハイパーターミナルを開くと、すべての応答がすぐに表示されます。まるでバッファのどこかに置かれているかのように見えますが、使用できません。

編集2:何か新しいことを試してみましたが、同じ結果

ここにあるコード例を実行しましたが、結果は同じでした。データは入ってこなかったのですが、新しいプログラムに切り替えたら一気に入ってきました。

編集 3

ハードウェアは問題なく、別のコンピューターでも同じ問題が発生します。私は、いかなる種類の USB アダプタも使用していません。

私もPortMonを使い始めましたが、興味深い結果が得られています。HyperTerminal と RXTX は同じ設定を使用しておらず、HyperTerminal とは異なり、RXTX は常にポートをポーリングしますが、どの設定がこれに影響するかはまだわかりません。定期的なポーリングから構成を切り離すことができ次第、PortMon ログを投稿します。

編集 4

過去 3 か月間の何らかの Windows 更新プログラムが原因である可能性はありますか? 私のMATLAB mexベースのプログラムの1つが一度台無しになりました。

編集 5

また、HyperTerminal、RXTX、およびデバイスと通信するために見つけた別のプログラムの間でいくつかの違いがあることに気付きました (しかし、私が望むことをしないので、私は自分のプログラムを展開しています)

  • ハイパーターミナル - フロー制御なしに設定されていますが、シリアル ポート モニターの RTS および DTR インジケーターは緑色です。
  • 他のプログラム - どの設定を使用していると思われるかは不明ですが、SPM の RTS インジケータのみが緑色です
  • RXTX - どのようなフロー制御を設定しても、SPM の CTS および DTR インジケータのみがオンになります。

Serial Port Monitor のヘルプ ファイルから (言い換え):

the indicators display the state of the serial control lines

  RTS - Request To Send
  CTS - Clear To Send
  DTR - Data Terminal Ready
4

6 に答える 6

7

OK、申し訳ありませんが、この質問に戻るのにとても時間がかかりました。これが私が物事を機能させる方法です。

注:この方法はすべての人に役立つわけではありません。独自のコードにコピーして貼り付ける前に、以下をお読みください。

public void connect(CommPortIdentifier portId) throws Failure {
    if (portId == null)
        throw new Failure("No port set");

    try { port = (SerialPort) portId.open(getClass().getName(), 10000); } 
    catch (PortInUseException e) {
        throw new Failure("Port in use by " + e.currentOwner,e); }

    try {
        port.setSerialPortParams(9600, SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
        port.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN
                              | SerialPort.FLOWCONTROL_RTSCTS_OUT);
    } catch (UnsupportedCommOperationException e) { throw new Failure(e); }

    port.setRTS(true);

    // More setup
}

したがって、私の場合、問題は、特定のデバイスがRTSフロー制御を必要とすることでした。他のデバイスでは異なるもの(CTS、XON / XOFF)が必要になる場合があるため、そのデバイスのマニュアルを確認してください。デフォルトでは、RXTXはすべてのフロー制御メカニズムを無効にします(Hypertrmや他のプログラムとは異なります)。それぞれを有効にすることは、2段階のプロセスです。

  1. SerialPortオブジェクトを取得したら、メソッドを呼び出し、必要な定数setFlowControlMode()をビット単位でOR(' ')します。|SerialPort.FLOWCONTROL_
  2. 適切なフロー制御をtrueまたはfalseに設定します(私が行ったようにport.setRTS(true)

同様の問題を抱えている他の人にとって、これがうまくいかない場合は、私は提案します

  1. シリアルポートモニターPortMon(両方ともWindows)などのシリアルポート監視プログラムを使用して、実際に何が起こっているかを確認します。
  2. RXTX開発者にrxtx@qbang.orgに電子メールを送信します(彼らは非常に役立ちます)
于 2009-10-28T23:00:50.420 に答える
3

この問題には、もっと簡単な解決策があります。これは私がしたことです:

BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String line;

    while (keepRunning) {
        try {
            while ((br.ready()) && (line = br.readLine()) != null) {
....
}

読み取る前にバッファが「準備ができている」ことを確認すれば、問題はないはずです。

于 2012-06-14T08:59:25.950 に答える
2

わかりました、このスレッドが非常に古いことは承知していますが、これらの解決策はどれもうまくいきませんでした。私は同じ問題を抱えていて、それを修正するためにあらゆることを試みましたが、役に立ちませんでした。次に、問題の原因を調査しました。シリアル通信を扱っていない場合、ファイルの最後で発生します。そこで、Java アプリケーションが受信するものすべてに末尾、具体的には改行 (\n) を追加する必要があると考えました。そして確かに、それは私のために問題を解決しました! うまくいけば、これが新しい人に役立つことを願っています.

于 2014-08-02T06:55:41.523 に答える
0

(単純すぎるかもしれませんが、どこかから始めたほうがいいかもしれません...)

ポートは使用中ですか?それよりも:

port = (SerialPort) CommPortIdentifier.getPortIdentifier(name)
                                      .open(owner,1000)

どうですか:

CommPortIdentifier portIdentifier;
try {
    portIdentifier = CommPortIdentifier.getPortIdentifier(name);
} catch (NoSuchPortException nspe) {
    // handle?
}
if (portIdentifier.isCurrentlyOwned()) {
    // handle?
}
port = portIdentifier.open(owner, 1000);
if (!(port instanceof SerialPort)) {
    // handle?
}

例外を飲み込んでいますか?

于 2009-09-08T00:54:01.287 に答える
0

数か月前に RXTX を試したところ、同様の問題が発生しました。私は2つのことを提案します:

  1. com0com を使用して仮想コンポートを作成します。トレース ログを有効にします。ハイパーターミナルを使用した場合と独自のプログラムを実行した場合のログを比較します。違いは、あなたが間違っていることを強調します。

  2. 私の謙虚な意見では、RXTX の設計には欠陥があり、その実装にはかなりのバグがあります (そのソース コードを見てください。なんて面倒なことでしょう!)。http://kenai.com/projects/jperipheralで代替ライブラリを公開しましたが、次の点に注意してください。これは Windows 専用であり、ビルド済みのバイナリはありません。これらはどちらも近い将来に変更されます。試してみたい場合は、http://desktopbeautifier.com/Main/contactusを使用してメールを送信してください。ビルド済みのバージョンをお送りします。

于 2009-09-08T03:47:42.170 に答える