安いバーコードリーダーをお探しですか?
もしかしたらこのAndroidアプリが役に立つかも・・・




バーコードリーダー入門


バーコードリーダーを使ってみよう

トップへ戻る

第3回 USB-COM入力で受取るプログラム

* まずは、バーコードリーダーの準備を行います。今回使用するのは、たまたま手元にあった、「IT-4200」です。様々な読み取りシンボル、インターフェイスに対応した高性能イメージャーです。


バーコードリーダーの接続
 「IT-4200」はUSBインターフェイスの場合、USB-HID(USBキーボード)とUSB-COMの両方に対応しており、設定により切替が可能です。今回はUSB-COMでバーコード値を受取りたいので、パソコンに接続した際にHID(ヒューマンインターフェイスデバイス)として自動認識される場合は、マニュアルにある「USB COM Port Emulation」という設定バーコードを読み取ってください。即座にデバイスドライバが要求されますので、付属のUSB−COMのドライバ(USBシリアルドライバ)を使ってインストールしてください。

*

ドライバがインストールされたかどうか、デバイスマネージャにて確認しましょう。今回は「COM8」としてインストールされているようです。

バーコードリーダーの設定
 「IT-4200」は高性能なバーコードリーダーなので、読み取った情報をPCへ送る際、バーコードの種類や桁数など、そのほかにも様々な情報を付加することが出来ます。今回作成するプログラムでは単純に、読み取り完了を識別するためだけに、ターミネーター(サフィックス)として、改行コードであるCR(0x0d)をバーコード値の最後に付加したものを受取ることにします。マニュアルに記載された「Add CR Sufix」という設定バーコードを読み込んで、ターミネーターをCRに設定しておきます。

1:1照合プログラムを作成する
 今回作成したのは、前回と同様、最初に読み取ったバーコードと次に読み取ったバーコードが同じであれば「OK」、異なれば「NG」 を表示するだけの簡単なプログラムです。 開発言語として、「Microsoft Visual Basic 2005」を使用します。まずは、画面を次のように配置しました。

*

上から、Label1(Label)、Label2(Label)と2つのコントロールを配置しただけです。 更に、COMポートとの通信を行なうための、SerialPort1(SerialPort)を配置しています。
次に、コード部分を書いていきます。

Public Class Form1

    Dim mdlintStep As Integer = 1   '入力ステップ - 1:照合元入力中、2:照合先入力中
    Dim mdlstrBase As String        '照合元バーコード

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        '--- 表示を初期化
        Label1.Text = "照合元を読み取ってください。"
        Label1.BackColor = Color.LightGreen
        Label2.Text = ""
        Label2.ForeColor = Color.White

        '--- COMをオープン
        Try
            SerialPort1.PortName = "COM8"
            SerialPort1.Encoding = System.Text.Encoding.GetEncoding("Shift-JIS")
            SerialPort1.Open()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
            Me.Close()
            Exit Sub
        End Try

    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

        '--- COMをクローズして終了
        Try
            If SerialPort1.IsOpen() = True Then
                SerialPort1.Close()
            End If
            SerialPort1.Dispose()
        Catch ex As Exception
        End Try

    End Sub

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

        '--- CRが来るまで読み込む
        Static strBuff As String = ""
        strBuff &= SerialPort1.ReadExisting()
        If Strings.Right(strBuff, 1) = Chr(&HD) Then

            If mdlintStep = 1 Then
                '--- 照合元の入力値を確定し、照合先入力へ。
                mdlstrBase = strBuff
                mdlChangeState("Label2", "照合元:" & mdlstrBase, Color.Black)
                mdlintStep = 2
            Else
                '--- 照合先の入力値を確定し、照合元の値と照合。
                If mdlstrBase = strBuff Then
                    '--- 同じ値であれば、照合OKとし、次の照合元入力へ。
                    mdlChangeState("Label2", Label2.Text & "照合先:" & strBuff & vbCrLf & "照合OK", Color.Green)
                Else
                    '--- 異なる値であれば、照合NGとし、次の照合元入力へ。
                    mdlChangeState("Label2", Label2.Text & "照合先:" & strBuff & vbCrLf & "照合NG", Color.Red)
                End If
                mdlintStep = 1
            End If
            strBuff = ""

            '--- ガイダンス表示
            If mdlintStep = 1 Then
                mdlChangeState("Label1", "照合元を読み取ってください。", Color.LightGreen)
            Else
                mdlChangeState("Label1", "照合先を読み取ってください。", Color.Aqua)
            End If

        End If

    End Sub

    '----------------------------------------------------------------------------------------------------
    '   結果表示用デリゲート+メソッド
    '----------------------------------------------------------------------------------------------------
    Private Delegate Sub dlgChangeState(ByVal pstrCtrlName As String, ByVal pstrMsg As String, ByVal pclrValue As Color)

    Private Sub mdlChangeState(ByVal pstrCtrlName As String, ByVal pstrMsg As String, ByVal pclrValue As Color)

        If Me.Controls(pstrCtrlName).InvokeRequired Then
            Me.Controls(pstrCtrlName).Invoke(New dlgChangeState(AddressOf mdlChangeState), New Object() {pstrCtrlName, pstrMsg, pclrValue})
        Else
            Me.Controls(pstrCtrlName).Text = pstrMsg
            Me.Controls(pstrCtrlName).BackColor = pclrValue
        End If

    End Sub

End Class

 まず、フォームを開くときにCOMポートをオープンしておきます。「"COM8"」の部分は環境によって異なります。今回明示的に設定したCOMの設定はポート番号(PortName)のみです。その他の設定は今回はデフォルトでOKでした。USB-COMインターフェイスではなく、RS-232Cインターフェイスの場合や、他の機種の場合には、その他にもパリティなど設定する必要が出てくる可能性もありますので、ご注意ください。

今回の「IT-4200」はQRコードなどの二次元コードが読み取り可能であり、漢字などの日本語の読み取りも可能です。リーダーからのデータの文字コードはShift-JISですので、データ取得の際のエンコーディングをShift-JISに設定しています。

あとは、DataReceivedイベントにてデータを受取るだけです。今回はターミネーターにCRを設定していますから、CRが来るまでデータを受信し続けて、バーコード値として確定、照合して結果を表示します。気をつけることは、SerialPortクラスのDataReceivedイベントが別スレッドにて動作するということです。スレッドを意識して開発したことがない方は、ちょっと戸惑うかも知れませんが、デリゲートというものを使って、フォーム上のLabel1とLabel2のプロパティ値を更新しています。

前述したように、「IT-4200」などの高性能リーダーでは、設定によりバーコード値の他にも様々な情報が受取れます。それらの情報を受け取り、解析することにより、より正確な読み取りや判断が行えます。用途に応じて受取る情報を設定し、使いやすいシステムを構築してください。

*

今回作成したプログラムのプロジェクトファイルはこちらです。




トップへ戻る

記事一覧




[stmx] - ソーシャルマーケットプレイス

[stmx] - ソーシャルマーケットプレイス
inserted by FC2 system