1

私はswingJavaでインターフェースを構築してmiddlewareいます.シリアルポートを読み続け、何が来るStringのかを保存する.

public class RFID {
  private static RFIDReader rReader;
  private static boolean state;

  public RFID(RFIDReader rReader) {
    this.rReader = rReader;
    this.state = true;
  }

  public void connect(String portName) throws Exception {
    CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
    if (portIdentifier.isCurrentlyOwned()) {
        System.out.println("Error: Port is currently in use");
    } else {
        CommPort commPort = portIdentifier.open(this.getClass().getName(), 2000);

        if (commPort instanceof SerialPort) {
            SerialPort serialPort = (SerialPort) commPort;
            serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

            InputStream in = serialPort.getInputStream();
            OutputStream out = serialPort.getOutputStream();

            (new Thread(new SerialReader(in))).start();
            //(new Thread(new SerialWriter(out))).start();

        } else {
            System.out.println("Error: Only serial ports are handled by this example.");
        }
    }
}

public static class SerialReader implements Runnable {

    InputStream in;

    public SerialReader(InputStream in) {
        this.in = in;
    }

    public void run() {
        byte[] buffer = new byte[1024];
        int len = -1;
        String code;
        try {
            while (state == true && (len = this.in.read(buffer)) > -1) {
                code = new String(buffer, 0, len);
                if (code.length() > 1)
                    rReader.setCode(code);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public void finish(){
    state = false;
}

public static class SerialWriter implements Runnable {

    OutputStream out;

    public SerialWriter(OutputStream out) {
        this.out = out;
    }

    public void run() {
        try {
            int c = 0;
            while ((c = System.in.read()) > -1) {
                this.out.write(c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

したがって、code保存しているものを印刷しようとすると、次のように表示されます。

AC000F9
3
BB

実際には次のようになります。

AC000F93BB

ここで何が間違っていますか?byte[]からへのこの変換Stringは正しくありませんか?

編集: 合計 10 文字の文字列を読み取る必要があります。

4

1 に答える 1

5

InputStreamを使用して読み取りを行わないでください- 説明の aReaderを使用してください。で開始する必要がある場合はInputStream、 で囲みInputStreamReaderます。ただし、コンストラクターを変更して a を受け入れるようReaderにし、クライアントが必要なリーダーを渡すことができるようにします。これにより、テストが容易になります (単に a を使用できるためStringReader)。

編集: 注 -バイナリからリーダーを作成する必要がある場合は、 (エンコーディング)InputStreamの選択を明示してください。そのため、 1 つを指定するコンストラクターのオーバーロードをCharset使用します。InputStreamReaderプラットフォームのデフォルトを使用したい場合でも、何をしているのかを明確にするために、それについて明示します.

編集:「文字列変換が行われる場所」を超えて、何を読むことを期待しているかは不明です。ストリーミング API を扱っています - を呼び出す前に実際にどれだけ読みたいかを決定するものは何setCodeですか? 全線ですか?文字数は固定ですか?特定の区切り文字の前の文字ですか?

編集: これでもう少しわかったので、次のようなヘルパー メソッドを作成することをお勧めします。

// Assuming you now have a field of type Reader, called reader
private String readEntry() throws IOException {
    char[] buffer = new char[10];
    int index = 0;
    while (index < buffer.length) {
        int charsRead = reader.read(buffer, index, buffer.length - index);
        if (charsRead == -1) {
            throw new IOException("Couldn't read entry - end of data");
        }
        index += charsRead;
    }
    return new String(buffer);
}
于 2012-04-18T18:11:44.030 に答える