Intermec CK30 BarcodeReader 错误

Posted

技术标签:

【中文标题】Intermec CK30 BarcodeReader 错误【英文标题】:Intermec CK30 BarcodeReader error 【发布时间】:2013-04-11 18:44:16 【问题描述】:

我正在使用 .NET CF 2.0 为 Intermec CK3 和 CK30 开发应用程序。

我在两个版本的应用程序中使用最新且相同版本的 IntermecDataCollection,并使用相同的代码读取条形码。

该应用程序在 CK3(最新型号)上完美运行,但是当我尝试使用 CK30 读取某些内容时,结果代码与预期不同。

通常一些字符出现在正确代码的前面,但在某些情况下,结果与原始代码完全不同。

已经成功地在谷歌上搜索了。

谁能帮帮我?

适用于 CK3 而不是 CK30 的代码示例:

using System;

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

using WOPT_Coletor.ConectorWOPT;

using Intermec.DataCollection;


namespace WOPT_Coletor.view.CriarOT

    public partial class frmCriarOT_5 : Form
    

        public BarcodeReader leitor;

        public frmCriarOT_5(int areaSelecionada, int tipoOT, long nlenr, int qtdEtq)
        
            InitializeComponent();


            //Instanciete the barcode reader class.
            model.LeitorCodigoDeBarras classeLeitor = new model.LeitorCodigoDeBarras();
            leitor = classeLeitor.LerCodigoDeBarras();
            leitor.BarcodeRead += new BarcodeReadEventHandler(this.eventoLeitorCodigoDeBarras);


        

        void eventoLeitorCodigoDeBarras(object sender, BarcodeReadEventArgs e)
        
            tbMaterial.Text = e.strDataBuffer.Trim().ToUpper();
        

       



using System;

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

using Intermec.DataCollection;

namespace WOPT_Coletor.model

    class LeitorCodigoDeBarras
    
        public BarcodeReader LerCodigoDeBarras()
        
            try
            
                BarcodeReader meuLeitor = new BarcodeReader("default", 4096);
                meuLeitor.ScannerEnable = true;
                meuLeitor.ThreadedRead(true);

                return meuLeitor;
            
            catch (BarcodeReaderException bx)
            
                MessageBox.Show("Não foi possível inicializar o leitor de código de barras. Contate seu supervisor. \n" + bx.Message, "Erro", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);

                return null;
            
        
    

【问题讨论】:

【参考方案1】:

想到了一些事情。

首先,您的BarcodeReadEventHandler 可能无法保证一次性发送所有数据。

您如何处理您的 BarcodeReadEventHandler 触发多个事件?

换句话说,此代码可能收集整个条形码:

void eventoLeitorCodigoDeBarras(object sender, BarcodeReadEventArgs e)

  tbMaterial.Text = e.strDataBuffer.Trim().ToUpper();

接下来,Trim()ToUpper() 可能会弄乱您的数据。您可以尝试删除这些以查看您的数据是否已清除。

您可能希望使用静态缓冲区来存储数据,这样您就可以确定您正在显示发送的所有内容。

我没有你的 Intermec BarcodeReader 控件,所以我无法测试和验证下面的代码是否有效,但这是我建议的方法。

private const int BARCODE_BEGIN = '\u001C'; // our devices start a barcode with a File Separator
private const int BARCODE_END = '\u000A'; // our devices are set to send a Line Feed
private const int MAX_BUFFER = 1024; // set to whatever you want
private const int NULL_CHAR = '\u0000';
private static byte[] buffer;
public BarcodeReader leitor;

public frmCriarOT_5(int areaSelecionada, int tipoOT, long nlenr, int qtdEtq)

  InitializeComponent();
  //Instanciete the barcode reader class.
  model.LeitorCodigoDeBarras classeLeitor = new model.LeitorCodigoDeBarras();
  leitor = classeLeitor.LerCodigoDeBarras();
  leitor.BarcodeRead += new BarcodeReadEventHandler(this.eventoLeitorCodigoDeBarras);
  ResetBuffer();


private void ResetBuffer()

  buffer = new byte[MAX_BUFFER];
  for (int i = 0; i < MAX_BUFFER; i++) 
    buffer[i] = NULL_CHAR;
  


void eventoLeitorCodigoDeBarras(object sender, BarcodeReadEventArgs e)

  byte[] data = Encoding.UTF8.GetBytes(e.strDataBuffer);
  int buffIndex = 0;
  for (int i = 0; i < MAX_BUFFER; i++) 
    if (buffer[i] == NULL_CHAR) 
      buffIndex = i;
      break;
    
  
  for (int i = 0; (i < data.Length) && (i < MAX_BUFFER); i++) 
    byte c = data[i];
    if (c != BARCODE_END) 
      buffer[i + buffIndex] = c;
     else 
      tbMaterial.Text = Encoding.UTF8.GetString(buffer, buffIndex, i);
      ResetBuffer();
    
  

【讨论】:

另外,许多阅读器可以配置为在硬件级别插入前缀和后缀,因此阅读器的配置可能不同。 对于每个条码,barcoderead 事件总是只触发一次。如果缓冲区 (4096) 太小,到达事件的条形码数据将被截断。 CK30 和 CK3 的内部条码阅读器配置可能不同。例如,一个配置为使用 AIM 条形码类型 ID,而另一个不配置。条形码 ID (AIM) 以 ^] 开头,您看到的可能是什么特殊字符? Intermec 条码阅读器 args 还在 DataBuffer 中提供二进制数据,在 BytesInBuffer 中提供缓冲区长度。如果您阅读 EAN128 条码,它们可能包含控制字符为 (也称为 FNC1)。 再提示:请贴出您在设备上看到的条码图片和样本数据。可能有一种我们知道的模式。提示 2:当您可能以多种形式使用条形码阅读器时,请将您的条形码阅读器初始化代码更改为 Singleton。 Intermec 条码阅读器仅支持每个应用一个实例。 Josef 的提示解决了这个问题:导致后缀出现的是 AIM 条形码类型 ID 配置。我将其更改为禁用它解决了问题!非常感谢!

以上是关于Intermec CK30 BarcodeReader 错误的主要内容,如果未能解决你的问题,请参考以下文章

Java Intermec ITCScan 无法加载

Intermec 打印机中的 DP 命令问题

Intermec 打印机在发送 IPL 命令后停止打印

intermec pd43 无法打印像 é 这样的字符

使用 Intermec 打印语言版本 12 在字段中居中非固定宽度字体

从 ZPL(斑马编程语言)翻译成 IPL(Intermec 编程语言)