LoginSignup
11
7

More than 5 years have passed since last update.

Node.jsでハンディスキャナを使う

Posted at

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行だけ!カンタン!

index.js
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)にしていますが、ハンディスキャナと合わせて下さい。

index.js
#!/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);
  }
});

テスト

モックが用意されているのでテストもできる

test.js
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
sjis.js
#!/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);
11
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
7