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のバージョン違いますね…