Node.jsでハンディスキャナを使う場合、node-serialport
モジュールを使うのがスタンダードのようだ
v4とv5~6でパーサの指定など変わったみたいなので、v6の使い方をまとめる
node-serialport
環境
- Windows 10
- node 8.9.1
- serialport 6.2
ハンディスキャナはCOM5
に接続されているものとします。
インストール
npmからインストールする
npm install serialport
yarnだとこう
yarn add serialport
最小構成で動かす
index.jsファイルを作成します。3行だけ!カンタン!
const SerialPort = require('serialport');
const port = new SerialPort('COM5');
port.on('data', console.log);
でも実際動かして、バーコードをスキャンしてみるとバイナリで表示されてしまう。
> node index.js
<Buffer 54 45 53 54 2d 44 41 54 41 0a>
ReadLineパーサを使う
ReadLineパーサを使うとutf-8
でエンコードしてくれます。
https://node-serialport.github.io/parsers/ReadLineParser.html
デリミタは\n
(LF)にしていますが、ハンディスキャナと合わせて下さい。
#!/usr/bin/env node
const SerialPort = require('serialport');
// const Readline = require('@serialport/parser-readline');
const { Readline } = SerialPort.parsers;
const port = new SerialPort('COM5');
const parser = port.pipe(new Readline({ delimiter: '\n' }));
parser.on('data', data => console.log(data));
※公式のサンプルだと以下の形で
require
してますが、エラーで読めませんでした。
const Readline = require('@serialport/parser-readline');
これで読めるようになりました!
> node index.js
TEST-DATA
また、ほかにもいろんなパーサがあるみたいだね!
https://node-serialport.github.io/parsers/index.html
エラーハンドリング
ハンディスキャナのエラーはerror
イベントで取得できる。
port.on('error', err => console.log(err.message));
コンストラクタでもいける
var SerialPort = require('serialport');
var port = new SerialPort('COM5', (err) => {
if (err) {
return console.log('Error: ', err.message);
}
});
テスト
モックが用意されているのでテストもできる
const SerialPort = require('serialport/test');
const MockBinding = SerialPort.Binding;
const { Readline } = SerialPort.parsers;
MockBinding.createPort('/dev/ROBOT', { echo: true, record: true });
const port = new SerialPort('/dev/ROBOT');
const parser = port.pipe(new Readline({ delimiter: '\n' }));
parser.on('data', data => console.log(data));
parser.write('SERIAL PORT TEST\n');
データを書いてあげるとそのまま読みだしてくれる
> node test.js
SERIAL PORT TEST
Shift-jisを読む
ReadLineパーサにはencoding
オプションがあるみたいだけど、どうやってもShift-jisが設定できなかった。
なので力ずくでやってやるぞ
npm install iconv-lite
#!/usr/bin/env node
const SerialPort = require('serialport');
const iconv = require('iconv-lite');
const { Delimiter } = SerialPort.parsers;
const port = new SerialPort('COM5');
const parser = port
.pipe(new Delimiter({ delimiter: '\n' }))
.pipe(iconv.decodeStream('SJIS'));
parser.on('data', console.log);