0

会社のカフェテリアの消費を制御するアプリケーションを開発しています。基本的に、各従業員はバーコード付きのバッジ ID を持っており、毎日無料で食事をすることができます。アプリケーションはバッジをスキャンし、各従業員の食事を記録します。これは、スキャナが統合され、Windows CE で動作する Motorola MK4000 デバイスで動作します。

デバイス スキャナに問題があります。実行してスキャンすることはできますが、数分間アイドル状態のままになると、「待機中」ステータスになり、レーザーがオフになり、オンになりません。ステータスを監視し、そのステータスに変化したときに新しい読み取りを開始しようとしましたが、その後、誤った読み取りを無期限にスキャンし続けます。

私が間違っていることを理解するのを手伝ってもらえますか?

これは、スキャナー機能に使用しているクラスです。これは私が開発したものではありませんが、同じデバイス上の他のアプリケーションで使用され始めました (主にエラー メッセージにいくつかの変更を加えました)。

using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace MK4000
{
class BarCode
{
    #region Fields

    private Symbol.Barcode.Reader myReader = null;
    private Symbol.Barcode.ReaderData myReaderData = null;
    private System.EventHandler myReadNotifyHandler = null;
    private System.EventHandler myStatusNotifyHandler = null;

    #endregion Fields

    #region Properties

    /// <summary>
    /// Provides the access to the Symbol.Barcode.Reader reference.
    /// The user can use this reference for his additional Reader - related operations.
    /// </summary>
    public Symbol.Barcode.Reader Reader
    {
        get
        {
            return myReader;
        }
    }

    public String ErrorMessage
    {
        get
        {
            return "Error";
        }
    }

    #endregion Properties

    #region Methods

    /// <summary>
    /// Attach a ReadNotify handler.
    /// </summary>
    public void AttachReadNotify(System.EventHandler ReadNotifyHandler)
    {
        // If we have a reader
        if (myReader != null)
        {
            // Attach the read notification handler.
            myReader.ReadNotify += ReadNotifyHandler;
            myReadNotifyHandler = ReadNotifyHandler;
        }
    }

    /// <summary>
    /// Attach a StatusNotify handler.
    /// </summary>
    public void AttachStatusNotify(System.EventHandler StatusNotifyHandler)
    {
        // If we have a reader
        if (myReader != null)
        {
            // Attach status notification handler.
            myReader.StatusNotify += StatusNotifyHandler;
            myStatusNotifyHandler = StatusNotifyHandler;
        }
    }

    /// <summary>
    /// Detach the ReadNotify handler.
    /// </summary>
    public void DetachReadNotify()
    {
        if ((myReader != null) && (myReadNotifyHandler != null))
        {
            // Detach the read notification handler.
            myReader.ReadNotify -= myReadNotifyHandler;
            myReadNotifyHandler = null;
        }
    }

    /// <summary>
    /// Detach a StatusNotify handler.
    /// </summary>
    public void DetachStatusNotify()
    {
        // If we have a reader registered for receiving the status notifications
        if ((myReader != null) && (myStatusNotifyHandler != null))
        {
            // Detach the status notification handler.
            myReader.StatusNotify -= myStatusNotifyHandler;
            myStatusNotifyHandler = null;
        }
    }

    /// <summary>
    /// Initialize the reader.
    /// </summary>
    public bool InitReader()
    {
        // If the reader is already initialized then fail the initialization.
        if (myReader != null)
        {
            return false;
        }
        else // Else initialize the reader.
        {
            try
            {
                // Get the device selected by the user.
                Symbol.Generic.Device MyDevice =
                    Symbol.StandardForms.SelectDevice.Select(
                    Symbol.Barcode.Device.Title,
                    Symbol.Barcode.Device.AvailableDevices);

                if (MyDevice == null)
                {
                    MessageBox.Show(ErrorMessage);
                    return false;
                }

                // Create the reader, based on selected device.
                myReader = new Symbol.Barcode.Reader(MyDevice);

                // Create the reader data.
                myReaderData = new Symbol.Barcode.ReaderData(
                    Symbol.Barcode.ReaderDataTypes.Text,
                    Symbol.Barcode.ReaderDataLengths.MaximumLabel);

                // Enable the Reader.
                myReader.Actions.Enable();

                // In this sample, we are setting the aim type to trigger.
                switch (myReader.ReaderParameters.ReaderType)
                {
                    case Symbol.Barcode.READER_TYPE.READER_TYPE_IMAGER:
                        myReader.ReaderParameters.ReaderSpecific.ImagerSpecific.AimType = Symbol.Barcode.AIM_TYPE.AIM_TYPE_TRIGGER;
                        //myReader.Parameters.Feedback.Success.BeepTime = 0;
                        break;
                    case Symbol.Barcode.READER_TYPE.READER_TYPE_LASER:
                        myReader.ReaderParameters.ReaderSpecific.LaserSpecific.AimType = Symbol.Barcode.AIM_TYPE.AIM_TYPE_TRIGGER;
                        break;
                    case Symbol.Barcode.READER_TYPE.READER_TYPE_CONTACT:
                        // AimType is not supported by the contact readers.
                        break;
                }
                myReader.Actions.SetParameters();

            }

            catch (Symbol.Exceptions.OperationFailureException ex)
            {
                MessageBox.Show(ex.Message);

                return false;
            }
            catch (Symbol.Exceptions.InvalidRequestException ex)
            {
                MessageBox.Show(ex.Message);

                return false;
            }
            catch (Symbol.Exceptions.InvalidIndexerException ex)
            {
                MessageBox.Show(ex.Message);

                return false;
            };

            return true;
        }
    }

    /// <summary>
    /// Start a read on the reader.
    /// </summary>
    public void StartRead(bool toggleSoftTrigger)
    {
        // If we have both a reader and a reader data
        if ((myReader != null) &&
            (myReaderData != null))

            try
            {
                if (!myReaderData.IsPending)
                {
                    // Submit a read.
                    myReader.Actions.Read(myReaderData);

                    if (toggleSoftTrigger && myReader.Info.SoftTrigger == false)
                    {
                        myReader.Info.SoftTrigger = true;
                    }
                }
            }

            catch (Symbol.Exceptions.OperationFailureException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Symbol.Exceptions.InvalidRequestException ex)
            {
                MessageBox.Show(ex.Message);

            }
            catch (Symbol.Exceptions.InvalidIndexerException ex)
            {
                MessageBox.Show(ex.Message);

            };
    }

    /// <summary>
    /// Stop all reads on the reader.
    /// </summary>
    public void StopRead()
    {
        //If we have a reader
        if (myReader != null)
        {
            try
            {
                // Flush (Cancel all pending reads).
                if (myReader.Info.SoftTrigger == true)
                {
                    myReader.Info.SoftTrigger = false;
                }
                myReader.Actions.Flush();
            }

            catch (Symbol.Exceptions.OperationFailureException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Symbol.Exceptions.InvalidRequestException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Symbol.Exceptions.InvalidIndexerException ex)
            {
                MessageBox.Show(ex.Message);
            };
        }
    }

    /// <summary>
    /// Stop reading and disable/close the reader.
    /// </summary>
    public void TermReader()
    {
        // If we have a reader
        if (myReader != null)
        {
            try
            {
                // stop all the notifications.
                StopRead();

                //Detach all the notification handler if the user has not done it already.
                DetachReadNotify();
                DetachStatusNotify();

                // Disable the reader.
                myReader.Actions.Disable();

                // Free it up.
                myReader.Dispose();

                // Make the reference null.
                myReader = null;
            }

            catch (Symbol.Exceptions.OperationFailureException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Symbol.Exceptions.InvalidRequestException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Symbol.Exceptions.InvalidIndexerException ex)
            {
                MessageBox.Show(ex.Message);
            };
        }

        // After disposing the reader, dispose the reader data.
        if (myReaderData != null)
        {
            try
            {
                // Free it up.
                myReaderData.Dispose();

                // Make the reference null.
                myReaderData = null;
            }

            catch (Symbol.Exceptions.OperationFailureException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Symbol.Exceptions.InvalidRequestException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Symbol.Exceptions.InvalidIndexerException ex)
            {
                MessageBox.Show(ex.Message);
            };
        }
    }

    #endregion Methods

}
}

そして、これは実際のフォームのコードです:

using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MK4000
{
public partial class Form1 : Form
{

    private bool isReaderInitiated;        
    private BarCode myScanner;
    private EventHandler myStatusNotifyHandler = null;
    private EventHandler myReadNotifyHandler = null;
    private String MacAddress = "00-00-00-00-00-00";
    private String strIPAddress = "000.000.000.000";
    private String version = "0.0.0.1";
    public static int TaskbarHeight = Screen.PrimaryScreen.Bounds.Height - Screen.PrimaryScreen.WorkingArea.Height;
    private int counter = 0;
    private int itemLimit = 10;

    public String ErrorMessage
    {
        get
        {
            return "Error";
        }
    }

    public Form1()
    {
        InitializeComponent();

        this.Width = Screen.PrimaryScreen.Bounds.Width;
        this.Height = Screen.PrimaryScreen.Bounds.Height - TaskbarHeight;
        this.FormBorderStyle = FormBorderStyle.None;
        this.ControlBox = false;
        this.MinimizeBox = false;
        this.EmpID.Visible = false;
        this.EmpName.Visible = false;
        this.messageLabel.Visible = false;
        this.lblCounter.Text = counter.ToString();
        this.lblCounter.Visible = false;
        this.statusBar1.Text = "Initializing.. Reticulating Splines            " + MacAddress + " | " + strIPAddress + " | " + version;
        this.listView1.View = View.Details;
        this.listView1.Columns.Add("EmployeeID", 150, HorizontalAlignment.Left);
        this.listView1.Columns.Add("EmployeeName", 330, HorizontalAlignment.Left);
        this.listView1.Columns.Add("Time", 250, HorizontalAlignment.Left);


        this.Closing += new CancelEventHandler(Form1_OnClosing);

        this.myScanner = new BarCode();
        this.isReaderInitiated = this.myScanner.InitReader();

        if (!(this.isReaderInitiated))// If the reader has not been initialized
        {
            // Display a message & exit the application.
            MessageBox.Show(ErrorMessage);
            Application.Exit();
        }
        else // If the reader has been initialized
        {
            // Attach a status natification handler.
            myScanner.AttachStatusNotify(myScanner_StatusNotify);
            // Start a read operation & attach a handler.
            myScanner.StartRead(true);
            myScanner.AttachReadNotify(myScanner_ReadNotify);
        }
    }

    private void myScanner_ReadNotify(object Sender, EventArgs e)
    {

        // Get ReaderData
        Symbol.Barcode.ReaderData TheReaderData = this.myScanner.Reader.GetNextReaderData();
        processData(TheReaderData.ToString());


        this.myScanner.StopRead();

        System.Threading.Thread.Sleep(1000);

        this.myScanner.StartRead(true);

    }

    private void processData(string readerData)
    {
        string EmployeeName = "";
        string EmployeeID = readerData;

        hideMessage();


        //This will query the employee database and proceed if employee exists, right now i just give it a random name
        EmployeeName = "John Doe";

        if (EmployeeName != "")
        {
            addToList(EmployeeID, EmployeeName);
            counter += 1;
            this.lblCounter.Text = counter.ToString();
            this.EmpID.Visible = true
            this.EmpName.Visible = true
            this.lblCounter.Visible = true;
            showMessage("Thank You!", System.Drawing.Color.LimeGreen);

        }

    }

    private void showMessage(string messageText, System.Drawing.Color messageColor)
    {
        this.messageLabel.Text = messageText;
        this.messageLabel.BackColor = messageColor;
        this.messageLabel.Visible = true;

    }

    private void hideMessage()
    {
        this.messageLabel.Text = "";
        this.messageLabel.BackColor = System.Drawing.Color.Black;
        this.messageLabel.Visible = false;
    }

    private void addToList(string EmployeeID, string EmployeeName)
    {
        if (this.listView1.Items.Count >= itemLimit)
        {
            this.listView1.Items.RemoveAt(0);
        }
        ListViewItem item = new ListViewItem(EmployeeID);
        //item.Text = EmployeeID;
        item.SubItems.Add(EmployeeName);
        item.SubItems.Add(DateTime.Now.ToString());

        this.listView1.Items.Add(item);
        this.listView1.Refresh();    
    }

    private void myScanner_StatusNotify(object Sender, EventArgs e)
    {
        // Get ReaderData
        Symbol.Barcode.BarcodeStatus TheStatusData = this.myScanner.Reader.GetNextStatus();

        switch (TheStatusData.State)
        {
            case Symbol.Barcode.States.IDLE:
                this.statusBar1.Text = "Idle - Scan ID Barcode                      " + MacAddress + " | " + strIPAddress + " | " + version;
                break;
            case Symbol.Barcode.States.READY:
                this.statusBar1.Text = "Ready - Scan ID Barcode                     " + MacAddress + " | " + strIPAddress + " | " + version;
                break;                
            case Symbol.Barcode.States.WAITING:
                //this.myScanner.StopRead();
                //this.myScanner.StartRead(true);                    
                this.statusBar1.Text = "Waiting- Scan ID Barcode                    " + MacAddress + " | " + strIPAddress + " | " + version;
                break;
            default:
                this.statusBar1.Text = TheStatusData.Text + "                     " + MacAddress + " | " + strIPAddress + " | " + version;
                break;
        }
    }

    private void Form1_OnClosing(object Sender, EventArgs e)
    {
        if (isReaderInitiated)
        {
            myScanner.DetachReadNotify();
            myScanner.DetachStatusNotify();
            myScanner.TermReader();
        }
    }

    private void pictureBox1_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void pictureBox2_Click(object sender, EventArgs e)
    {
        this.myScanner.StopRead();
        this.myScanner.StartRead(true); 
    }



}
}

これはまだ進行中の作業であるため、いくつかの機能が不足していますが、先に進む前にスキャナーを完全に機能させたいと考えています。どんな助けでも大歓迎です、ありがとう。

4

1 に答える 1

0

わかりました。スキャナが Idle と Waiting の状態を切り替えるサイクルに入ったことがわかりました。これが、私の StatusNotify イベント ハンドラがスキャナ レーザーのオンとオフを繰り返し行っていた理由です。

以前のステータスを保存し、以前のステータスがこれら2つのいずれでもない場合にのみスキャナーを再起動することで解決しました。

case Symbol.Barcode.States.WAITING:
                if (lastScannerStatus != "WAITING" && lastScannerStatus != "INIT" && lastScannerStatus != "IDLE")
                {
                    this.myScanner.StopRead();
                    this.myScanner.StartRead(true);
                }
                this.statusBar1.Text = "Waiting- Scan ID Barcode                    " + MacAddress + " | " + strIPAddress + " | " + version;

                break;
于 2014-02-10T16:18:39.853 に答える