2014-01-30 63 views
0

我正在開發一個應用程序來控制我公司的食堂消費。基本上每個員工都有一個帶有條形碼的徽章標識,並且他們每天都有權享用免費餐。應用程序將掃描徽章並記錄每位員工的餐食。它將在Motorola MK4000設備上運行,該設備具有集成的掃描儀並可在Windows CE上運行。Windows ce應用程序中的條形碼掃描器問題

我遇到了設備掃描儀的問題。我可以讓它運行並且掃描正常,但是如果它保持閒置幾分鐘,它會進入「等待」狀態,激光熄滅,並且不會重新開始。我試着監視狀態並在更改狀態時開始新的讀取,但是它只是無限期地持續掃描錯誤讀取。

你們能幫我弄清楚我做錯了什麼嗎?

這是我用於掃描儀功能的類。它不是我開發的,但它開始用於同一設備上的其他應用程序(我對它進行了一些更改,主要針對錯誤消息)。

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); 
    } 



} 
} 

這仍然是一項正在進行的工作,你要知道,所以有一些功能缺失,但我希望有掃描儀workingfull繼續前進。任何幫助將不勝感激,謝謝。

+0

首先確保您擁有Symbol的條碼SDK和操作系統映像的最新版本。這可能是他們在新版本中修復的問題。如果這沒有幫助,請嘗試替換您的StartRead(); StopRead();在WAYTING案例中,完全終止並關閉條形碼讀取器,然後重新初始化它。 – PaulH

回答

0

好吧,我發現掃描儀進入了在空閒和等待狀態之間切換的循環,這就是爲什麼我的StatusNotify事件處理程序正在使掃描儀激光器反覆打開和關閉。

我通過保存以前的狀態解決了這個問題,並且只有在以前的狀態不是這兩個狀態之一時才重新啓動掃描器。

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; 
相關問題