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

SD120(バーコードリーダー)を仮想シリアル通信で利用する

昔、図書館でバーコードリーダー使ってるの見て格好いいなーって思っていた、からすです。

今回はAmazonで安値で売られているSD120を用いてバーコードを読んでみたいと思います。

2018年3月8日現在、\2,870円です。

USB接続のバーコードリーダーでこれと言った特徴は無いです。

もう少し出せばBluetooth対応だったりと利便性向上したのが買えたりしますが、遊んでみたいだけなので、マニュアルも揃って安価なSD120を買いました。

取り合えず何も考えずWindows10機に挿した所、HIDデバイスとして認識されました。

この時点で特に問題もなく認識されたので、音量下げ等設定して動作確認完了とします。

さて、本題の仮想シリアル通信ですが、付属の日本語マニュアルに書いてなかったので、Champtek社のマニュアルからやってみたいと思います。

http://www.champtek.com/en/product/48

11ページのVirtual COMがそうですね、8ページのフローチャート通りに

設定開始→Virtual COM(%0088)→設定終了→パラメータセーブで終わりです。

 

設定終了した時点でVCOMが認識されたとWindowsが教えてくれました。

早速、Teratermから当該ポートを選択して確認してみます。

読めました、これでプログラムに組み込むのが容易になるかと思います。