どうも!リョクちゃです。
今回はスーパーなどでよく見かけるバーコードリーダ、
店員さんが使う商品を読み取る際に使うあれについて、紹介していきます。
そもそもどうやって、読み取ったバーコードの情報が表示されるのか?
またパソコンにはどうやって情報が受け取られるのか?
などざっくりと紹介していきます。
ちなみに前回はこちら
目次
商品に貼られているバーコード
スーパーでよく見かけるだろうバーコード、数字の羅列が並んでいると思います。
食材などの商品に貼られているバーコードは一般的にだいたいがJANコードといわれる
JAN規格を基に発行され、貼り付けられています。
JANコードは1次元コードと称され、他にも様々な規格のバーコードが存在します。
ちなみにQRコードやデータマトリクスは2次元コードと称されます。
どうやって読み取られているの?
スーパーなどで使われるバーコードリーダは、1次元スキャナともいわれ
トリガと呼ばれるボタンを押すことで、赤いレーザーが照射されます。
照射された赤いレーザをバーコードに当てることで、バーコードを読み取ることができます。
では、なぜレーザを当てるだけで読み取れているのでしょうか?
それは、バーコードを形成している、白と黒の棒(バー)が鍵を握っています。
なんか棒が並んでるなと感じたあなた
ただの棒が並んでるだけではなく、実は規則的に白と黒の棒が交互に並べられています。
詳しくは、こちらのページに解説が載っています。ありがとうございます。
本題:いざ実証・実験
それでは、さっそくバーコードを読み取るための準備としてUSB接続のバーコード
リーダからデータを受け取るにはどうしたらいいか?こちら紐解いていきます。
USB接続のバーコードリーダは一般的には、キーボードインターフェースとして
パソコンでは接続がされるとデバイスマネージャーで認識されます。
つまり、キーボードと同じ扱いがされるということになります。
したがって、キー入力と同じように読み取ったデータが受け取られることになります。
これを踏まえて、テスト用にバーコードリーダの入力値を受け取る画面を作成して、
実際に試してみましょう。
使用したバーコードリーダ
その前に、今回使用したバーコードリーダはこちらになります。
Amazonでベストセラーだったバーコードリーダです。
ちなみに2次元式なのでQRも読めます。
準備編:バーコード受信画面
このようなテスト画面を作成してみました。
画面の作成ができたら、バーコードリーダをパソコンに接続します。
テスト画面を起動し、テキストボックスにカーソルを合わせたら
バーコードを読み取ってみましょう。
すると、どうでしょう?
読み取ったバーコードが、下図のように表示されたのではないでしょうか?
バーコードは、適当なモノを作りました。
こちらで作成をすることができます。
ここまででバーコードリーダから読み取られたデータがどのようにして
受け取られるかがわかってきたかと思います。
USB接続の場合、キーボード入力と同様にして受け取られています。
それでは、受け取ったデータから更に処理をつなげたい場合どうしたらいいでしょう?
バーコードは読んだだけでは終わりませんよね?
読んだその先に、値段を表示してくれたり、読んだバーコードによって
設備の動作を変えたりと読み取った後の処理が重要になってきます。
先ほどは、読み取った値をテキストボックスに表示することができました。
表示がされたテキストボックスに対して何らかの処理を追加すればよさそうですね。
つまり、テキストボックスのイベントを発生させて、
そこで何らかの処理をさせてあげればよさそうです。
ここで使う候補として出てくるのが、TextBox.TextChanged
バーコード情報を処理する
テキストボックスに出力されたバーコードから読み取った情報を処理してみましょう。
TextBox.TextChangedを使用するので、以下のようになります。
1 2 3 |
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged Console.WriteLine(TextBox1.Text) End Sub |
では、実際にコードを走らせてバーコードを読み取ってみましょう。
※カーソルはテキストボックスに合わせてください。
コードを走らせてみるとわかるのですが、
バーコードリーダで読み取ったデータを表示させると実は、
1文字ずつPCへ送信されているのがわかります。
バーコードリーダからPCへ送信されるデータは、1文字ずつとなり
その都度TextBox.TextChangedイベントが処理されます。
つまり、全てのバーコード情報を受け取るには
バーコードの長さ分TextChangedイベントが繰り返されます。
本来は全てのバーコード情報がそろって処理をするので、当然1文字ずつでは
正しい情報として成り立ちません。
では、どうしたらいいでしょう?
終端キー:ターミネータ
バーコードリーダで読み取ったデータの終わりには、終端キーと呼ばれる
ターミネータが付加されています。
※バーコードリーダによっては機能自体がないモノもあります。
このターミネータを検知することで、読み取ったデータがそろってから
処理をすることができそうですね。
ターミネータ機能を有しているバーコードリーダでは、デフォルトだと
「CR」や「CR+LF」が設定されています。
ちなみに「CR」はキャリッジリターンって呼ばれています。
「LF」はラインフィードになります。
それぞれ
- CR : 先頭行へ戻す
- LF:次の行へ送る
といった役割があります。
終端キーを検知
それでは終端キーを検知する処理を実装していきます。
先ほどは、TextChangedイベントを使いましたがそれよりも良いイベントがあったので
以下のイベントを使用します。
を使います。
これはテキストボックス内でキーが押されたときにイベントが発生するメソッドになります。
バーコードリーダの動作はキーボード動作と同様のふるまいをするのでこちらが便利です。
このイベント内でターミネータを検知させます。
コードで書くと以下のようになります。
1 2 3 4 5 6 |
Private Sub TextBox1_KeyPress(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown If e.KeyCode = Keys.Enter Then ' ターミネータを検知してからの処理 ’Trueの処理 End If End Sub |
ターミネータの検知をIf文で行っています。
条件式としては、e.KeyCodeがEnterキーであれば処理を
実行するといった式を組んでいます。
変数eには、テキストボックス内で検知されたキー情報が格納されます。
「CR」や「CR+LF」はEnterキーとして扱うことができるので、
Keys.Enterを指定しています。
ターミネータが「CR」もしくは「CR+LF」だと、Trueの処理に移り
バーコード情報が全てそろった状態で処理ができます。
以上でバーコードリーダから受け取る、受け取った後の処理ができました。
これ以降は、仕様によって変更したり桁数のチェックやチェックデジットなどの
処理を追加して読み取ったデータが正常かどうかをチェックすることにつなげられます。
お疲れ様でした。
まとめ
PCと接続したバーコードリーダから読み取ったデータを受け取る方法について
紹介していきました。
USB接続のバーコードリーダの大半はキーボードインターフェースとして認識され、
普段私たちが使うキーボードと同様のふるまいをします。
バーコードで読み取ったデータは、一気に入力されるのではなく、
1文字ずつ入力がされていくので注意が必要です。
全てのデータがそろった状態で処理をするには、
ターミネータを検知して次の処理へつなげれるように意識しましょう。
バーコードリーダ……奥が深いですが、使えるようになると楽しいですよ。
最後までお読みいただき、ありがとうございます。
・こちらの書籍を参考にVB.Net勉強しています。