设备:Newland NLS-PT982便携式数据采集器
设备系统:Win CE 6.0
开发工具:vs2008,Newland官网上下载的uToolsCE_NET
背景:需要扫描自定义的编码为UTF-8的二维码,读取并访问其中的网址。
private NLSScanner scaner = new NLSScanner();//这个在手持设备的库NLSCAN.MacCtrl里面
public Form1()
{
InitializeComponent();
scaner.OnDecodeEvent += new DecodeEventHandler(scan_OnDecodeEvent);//每次扫描后执行OnDecodeEvent
int i = scaner.G_SetScannerEnabled(true);//如果为0,打开扫描设备成功,否则失败
}
private void scan_OnDecodeEvent(object sender, ScannerEventArgs e)
{
for (int i = 0; i < e.DataLen; i++)
{
if (e.ByteData[i] == 0)
{
//如果数据中存在0,把它替换为0x20
e.ByteData[i] = 0x20;
NLSSysCtrl.NKDbgPrintfW("ByteData[" + i.ToString() + "] = 0\r\n");
}
if (e.ByteData[i] < 0x20)
{
NLSSysCtrl.NKDbgPrintfW("ByteData[" + i.ToString() + "] = " + e.ByteData[i].ToString() + "\r\n");
}
}
//如果是unicode编码,用这一行:
//textBox1.Text = NLSScanner.MultiByteToUnicodeString(e.ByteData, e.DataLen);
//如果是unicode编码,用这一行:
textBox1.Text = Encoding.UTF8.GetString(e.ByteData, 0, e.DataLen);
webBrowser1.Navigate(new Uri("about:blank"));//处理一下扫出来的二维码,取出其中的网址,用webbrowser访问一下
}
程序很简单,但是有两个麻烦的地方,都出在红色且下划线的那一句代码:
1、字符编码。测试中发现中文不能正确显示,遂查询自定义二维码的生成代码,发现是UTF-8编码的,而库函数自带的只有unicode函数,于是自己写了一句:
textBox1.Text = Encoding.UTF8.GetString(e.ByteData, 0, e.DataLen);
2、条码长度。最开始,e.DataLen的位置我写的是e.ByteData.Length,出现这样一种情况,第一次假设扫描结果是QWERTYU,第二次扫描内容是123,那么第二次扫描的结果会变成123RTYU,单步调试发现,byte[]类型的e.ByteData没有清空。费劲一番周折,在文档中找到一个e.DataLen的属性,可以按照本次扫描条码的长度来取值,才算解决了这个问题。