0

モバイルデバイスのシリアルプログラムに2つの問題があります。

  1. InputStream.available()は、ドキュメントに従って常に0を返します。データが文字列ではなくファイルである可能性があるため、DataInputStreamを使用できません。InputStreamでread()を呼び出すだけで、バイトが反対側に存在しない場合はIO操作がブロックされます。また、入力データのサイズもわかりません。では、データがポートで利用可能かどうか、および利用可能なデータのサイズはどのくらいかを確認するにはどうすればよいですか?
  2. ハイパーターミナルを使用してシリアルポートをテストしていますが、モバイルはataやatdなどのATコマンドにのみ応答しています。したがって、「hello」のような文字列は無視され、私のアプリはそれを見ることができません。これは本当ですか?または私は何かが欠けていますか?データをアプリに表示するにはどうすればよいですか?

何か提案はありますか?コードスニペットは多分?

4

1 に答える 1

0

リスナーをSerialPortに追加して、そのポートでデータが利用可能になるたびに通知を受け取ることができます。このコールバック内でin.available()は、読み取ることができるバイト数も返す必要がありますが、read-1が返されるまでバイトを消費する方がおそらく良いでしょう。

final CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM1");

final SerialPort com1 = (SerialPort)portId.open("Test", 1000);
final InputStream in = com1.getInputStream();

com1.notifyOnDataAvailable(true);
com1.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
com1.addEventListener(new SerialPortEventListener() {
    public void serialEvent(SerialPortEvent event) {
        if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            try {
                byte[] buffer = new byte[4096];
                int len;
                while (-1 != (len = in.read(buffer))) {
                    // do something with buffer[0..len]
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
});
于 2012-01-31T10:34:17.250 に答える