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