Java(RXTX)からSD120(バーコードリーダー)を利用する

こちらの記事にて事前にシリアル通信の準備を済ましておきます。

build.gradleにて下記を記述してライブラリを追加してあげます。

// https://mvnrepository.com/artifact/org.rxtx/rxtx
compile group: 'org.rxtx', name: 'rxtx', version: '2.1.7'

次に下記のリンクから自分のOSにあったファイルを選択します。

http://fizzed.com/oss/rxtx-for-java

zipを解凍後、中のReadMeを読んでファイルを設置していきます。

Windowsならば下記の通りです。

Copy RXTXcomm.jar —> <JAVA_HOME>\jre\lib\ext
Copy rxtxSerial.dll —> <JAVA_HOME>\jre\bin
Copy rxtxParallel.dll —> <JAVA_HOME>\jre\bin

正しく設定しないとjava.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.pathが発生しますので気を付けましょう。

 

私の場合、下記の様にSerial.javaを作成しました。

package net.kagamikarasu.barcodereader;

import gnu.io.*;

import java.io.IOException;
import java.io.InputStream;

class Serial {
    SerialPort port;
    Serial(){
        try {
            CommPort commPort = CommPortIdentifier.getPortIdentifier("COM4").open("hoge", 2000);

            port = (SerialPort) commPort;
            port.setSerialPortParams(
                    9600,
                    SerialPort.DATABITS_8,
                    SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);
            port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
            read();

        }catch(Exception ignored){

        }
    }
    private void read() throws IOException {
        InputStream in = port.getInputStream();
        StringBuilder stringBuilder = new StringBuilder();
        byte[] buffer = new byte[1024];
        while (true) {
            int numRead = in.read(buffer);
            if (numRead == -1) {
                break;
            } else if (numRead == 0) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {

                }
            }

            for(byte buf : buffer) {
                if (!(buf == 0 || buf == 13))
                    stringBuilder.append((char) buf);
            }
            System.out.println(stringBuilder.toString());
            stringBuilder.delete(0,stringBuilder.length());
            buffer = cleanBytes(buffer);
        }
    }
    private byte[] cleanBytes(byte[] oldByte){
        return new byte[oldByte.length];
    }
}

ASCII文字しか認識しないと想定していますので、StringBuilderにappendする時はbyte配列を全部読み込んで、各々をcharでやっています。

また、ASCII番号0は無視、13は復帰(改行)ですがバーコードリーダーの設定をいじるのも面倒だったので、こちら側に無視するようにしました。

エラーが起きなく、リーダーにて読み込めば上記の様になるのではないかと思います。

にしても、Native LibとJava Libのバージョン違いますね…

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です