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 条码,它们可能包含控制字符为以上是关于Intermec CK30 BarcodeReader 错误的主要内容,如果未能解决你的问题,请参考以下文章