条码的开发使用介绍文档
第一部分 条码的简介绍
1.介绍条码的生成和使用方法
条码是由一组按一定编码规则排列的条、空符号,用以表示一定的字符、数字及符号组成的信息。
条码系统是由条码符号设计、制作及扫描阅读组成的自动识别系统。它的主要好处是:1.可靠准确,2。数据传输速度快,3。经济便宜,4。灵活,实用,5。自由度大,6。设备简单,7。易于制作。
条码的识别原理如下:
由于不同颜色的物体,其反射的可见光的波长不同,白色物体能反射各种波长的可见光,黑色物体则吸收各种波长的可见光,所以当条码扫描器光源发出的光经光阑及凸透镜1后,照射到黑白相间的条码上时,反射光经凸透镜2聚焦后,照射到光电转换器上,于是光电转换器接收到与白条和黑条相应的强弱不同的反射光信号,并转换成相应的电信号输出到放大整形电路。白条、黑条的宽度不同,相应的电信号持续时间长短也不同。但是,由光电转换器输出的与条码的条和空相应的电信号一般仅10mV左右,不能直接使用,因而先要将光电转换器输出的电信号送放大器放大.放大后的电信号仍然是一个模拟电信号,为了避免由条码中的疵点和污点导致错误信号,在放大电路后需加一整形电路,把模拟信号转换成数字电信号,以便计算机系统能准确判读。整形电路的脉冲数字信号经译码器译成数字、字符信息。它通过识别起始、终止字符来判别出条码符号的码制及扫描方向;通过测量脉冲数字电信号0、1的数目来判别出条和空的数目.通过测量0、1信号持续的时间来判别条和空的宽度。这样便得到了被辩读的条码符号的条和空的数目及相应的宽度和所用码制,根据码制所对应的编码规则,便可将条形符号换成相应的数字、字符信息,通过接口电路送给计算机系统进行数据处理与管理,便完成了条码辨读的全过程。
2.条码的码制种类
一维条码:
EAN 8 (2 or 5 digit supplement)
EAN 13(2 or 5 digit supplement)
Codabar (Monarch, NW-7, USD-4, 2 of 7 code)
Code 39 Standard
Code 39 Extended
Code 93 Standard
Code 93 Extended
Code 128
AbcCodabar
2/5 Datalogic,Code25, 2 of 5
Code 11 (USD-8)
Code25, 2 of 5, ITF
Code25, 2/5 Matrix
Code25, 2/5 Industrial
Code25, 2/5 IATA
Code25, 2/5 INVERT
ITF6, ITF14 (SSC14), ITF16
ISBN (International Standard Book Number)
ISSN (International Standard Serial Number)
ISMN (International Standard Music Number)
UPC-A (with or without supplements)
UPC-E0 (with or without supplements)
UPC-E1 (with or without supplements)
UPC-Shipping
PostNet (ZIP, ZIP+4, DPBC)
OPC (Optical Industry Association)
UCC/EAN 128
说明:
EAN码
EAN条码是国际物品编码协会制定的一种条码,已用有于全球90多个国家和地区,EAN条码符号有标准版和缩短版两种,标准版是由13位数字构成,缩短版是由8位数字构成,我国于1991年加入EAN组织。
UPC码
和EAN条码一样,UPC条码也是一种用于商品的条码,UPC条码是由美国统一代码委员会制定的一种条码,主要用于美国和拿大地区。我国有些出口到北美地区的商品为适应北美地区的需要,也申请了UPC条码。UPC条码有标准版和缩短版两种,标准版由12位数字构成,缩短版的由8位数字构成。
三九码:
三九码是一种条、空均表示信息的非连续型打码,它可表示数字0-9、字母A-Z和八个控制字符(-,空格,/,$,+,%,·,*)等44个字符,主要用于工业、图书以及票据的自动化管理上。
库德巴(Codebar)码:
库德巴(Codebar)码是一种条、空均表示信息的非连续、可变长度、双向自检的条码,可表示数字0-9、字母A-D及特殊字符(+,—,$,:,/,·)。主要用于医疗卫生、图书情报、物资等领域的自动认别。
二五码:
二五条码是一种只有条表示信息的非连续型条码,每个字符由五个条组成,其中两个宽条,萨那个窄条。用来表示数字0-9。符号结构如图五:
交叉二五码:
交叉二五码的编码优良同二五码、只是将条码与之间的间隔作为信息的一部分进行编制一种连续码。
二维条码:
一维条码所携带的信息量有限,如商品上的条码仅能容纳13位(EAN-13码)阿拉伯数字,更多的信息只能依赖商品数据库的支持,离开了预先建立的数据库,这种条码就没有意义了,因此在一定程度上也限制了条码的应用范围。基于这个原因,啊90年代发明了二维条码。二维条码除了具有一维条码的优点外,同时还有信息量大、可靠性高,保密、防伪性强等优点。从诞生之日起,即受到国际社会的广泛关注。
目前二维条码主要有PDF417码、Code49码、Code 16k码、Data MatxiCode码等,主要分为堆积或层排式和棋盘或矩阵式两大类。
PDF417码: PDF417码是由美国SYMBOL公司研制的,是目前应用最为广泛的一种二维码。
Data Matrix码: Data Matrix主要用于电子行业小零件的标识,如Intel的奔腾处理器的背面就印制了这种码。
Maxi Code码 : Maxi Code是由美国联合包裹服务(UPS)公司研制的,用于包裹的分拣和跟踪等领域。
第二部分 条码的开发(分别针对Motorolor MC3090和Honeywell 6100)
一. 环境的搭建
开发平台VS2005或者VS2008,安装其中的任意一个。安装过程省略。
微软提供的平台发包“Windows Mobile 5.0 Pocket PC SDK.msi” ,安装过程省略
获得针对MC3090的激光头接口函数包“Symbol.Barcode.Design.dll”和Honeywell 6100
的激光接口函数包“Honeywell.DataCollection.WinCE.Common.dll”和“Honeywell.DataCollection.WinCE.Decoding.dll”
使用过程如下:
- 运行VS2008,文件——》新建——》项目
这里的目标平台显示的就是刚才安装的微软提供的平台SDK包。
2.添加引用对用的采集器的激光头的DLL文件
3.激光头的调用程序部分代码
MC3090的应用
全局参数的初始化
Barcode.Barcode barcode1 = new Barcode.Barcode();
激光头的开始
barcode1.EnableScanner = true;
激光头的关闭,在窗体关闭时, 一定将该窗体开始的激光头资源关闭。
barcode1.EnableScanner = false;
Honeywell 6100的激光头启动步骤,两个DLL文件的调用如上。
using Honeywell.DataCollection.Decoding;
using Honeywell.DataCollection.WinCE.Decoding;
//界面初始化时,激光头的初始化同步进行
try
{
this.DecodeAssemblyInitialize();
this.KeyPreview = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
private DecodeControl oDecode;
private void DecodeAssemblyInitialize()
{
try
{
oDecode = new DecodeControl();
oDecode.DecodeEvent += new DecodeBase.DecodeEventHandler(oDecode_DecodeEvent);
oDecode.TriggerKey = TriggerKeyEnum.TK_ONSCAN;
oDecode.EnableSymbology(SymID.SYM_ALL, true);
oDecode.ScanTimeout = 2147483647;
oDecode.AutoSounds = false;
oDecode.LightsMode = ScanLightsMode.LM_ILLUM_AIMER;
SymbologyConfig code39 = new SymbologyConfig(SymID.SYM_CODE39);
code39.ReadConfig(SetupType.ST_CURRENT);
code39.flags |= SymFlags.SYMBOLOGY_ENABLE_FULLASCII;
code39.WriteConfig();
oDecode.AutoSounds = true;
oDecode.Connect();
}
catch (DecodeException dex)
{
MessageBox.Show(dex.ToString());
}
}
private void DecodeAssemblyRelease()
{
try
{
oDecode.DecodeEvent -= new DecodeBase.DecodeEventHandler(oDecode_DecodeEvent);
oDecode.CancelScanBarcode();
oDecode.Disconnect();
oDecode.Dispose();
}
catch (DecodeException dex)
{
MessageBox.Show(dex.ToString());
}
}
private void oDecode_DecodeEvent(object sender, DecodeBase.DecodeEventArgs e)
{
try
{
if (this.InvokeRequired == true)
{
this.Invoke(new DelegateMethodAccessDecodeData(this.OnAccessDecode), new object[] { e });
}
else
{
this.OnAccessDecode(e);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
internal void OnAccessDecode(DecodeBase.DecodeEventArgs e)
{
try
{
if (e.DecodeResults.rResult != Result.RESULT_ERR_NODECODE)
{
//这里就是激光读条码得到的结果。
textBox2.Text = e.DecodeResults.pchMessage; }
}
catch (DecodeException dex)
{
MessageBox.Show(dex.ToString());
}
}
//窗体响应按钮按下时的事件
private void check_KeyDown(object sender, KeyEventArgs e)
{
if (oDecode.TriggerKeyIsDown() == true)
{
this.KeyDown -= new KeyEventHandler(check_KeyDown);
try
{
oDecode.ScanBarcode(true);
e.Handled = true;
}
catch (DecodeException dex)
{
MessageBox.Show(dex.ToString());
}
}
}
//窗体响应按钮弹起来时事件
private void check_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == (Keys)oDecode.TriggerKey)
{
if (oDecode.ContinuousScan)
oDecode.ContinuousScan = false;
oDecode.CancelScanBarcode();
this.KeyDown += new KeyEventHandler(check_KeyDown);
}
}
//窗体关闭时一定要将该窗体打开的激光头资源关闭
try
{
this.DecodeAssemblyRelease();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
4.条码采集器通过OpenNETCF.Desktop.Communication.dll和PC机进行数据的交换
OpenNETCF.Desktop.Communication 命名空间提供以下类
OpenNETCF.Desktop.Communication 命名空间中提供的类 类 | 说明 |
ActiveSync | 提供对 Microsoft ActiveSync 底层功能的访问。 |
AutoStartApps | 提供配置 ActiveSync 会话开始时运行的应用程序的功能及相关信息。 |
FileInformation | 描述 FindFirstFile 和 FindNextFile 方法返回的文件信息结构。 |
FileList | FileInformation 类的集合。桌面应用程序经常用它查询和管理连接设备的文件结构。 |
RAPI | 提供对基础 RAPI 函数的简便包装。 |
RAPIException | 定义 RAPI 类发生的例外。 |
Registry | 提供对基础 RegistryKey 类的访问,这些类反过来又用来访问并修改连接设备的注册表值和注册表子项。 |
RegistryKey | 定义连接设备注册表中的一个项节点。 |
如上表所示,OpenNETCF.Desktop.Communication 命名空间提供了大量的桌面功能,这些无法在一篇文章中详细说明。本文的重点是 RAPI 类,特别是 RAPI 类的 3 个主要功能:
- 管理设备中的目录文件。
- 启动设备中的应用程序。
- 检索设备中的系统信息。
之所以选择这 3 项,是因为这 3 部分在开发移动解决方案中起着特别的帮助作用。
使用 OpenNETCF 的 Communication 库
OpenNETCF Communication 库是通过 OpenNETCF.Desktop.Communication.DLL 文件提供的。您需要在桌面应用程序中包括这个库的引用。要添加引用,请执行以下步骤:
- 在“解决方案资源管理器”中,右键单击“References”文件夹。显示弹出菜单。
- 在菜单中,选择“添加引用”。
- 显示“添加引用”对话框。选择“OpenNETCF.Desktop.Communication”组件。
单击“确定”按钮,将所选组件添加到您的项目中。
RAPI 类
表 2 列出的 RAPI 类方法对开发移动应用程序最有帮助。
表 2:对开发移动应用程序有用的 RAPI 类方法。 方法 | 说明 |
Connect | 建立与设备的同步连接。 |
CopyFileFromDevice | 将设备中的文件复制到 PC。 |
CopyFileOnDevice | 将设备某个位置的文件复制到设备的另一新位置。 |
CopyFileToDevice | 将 PC 中的文件复制到设备。 |
CreateDeviceDirectory | 在设备中创建目录。 |
CreateProcess | 启动设备中的应用程序。 |
DeleteDeviceFile | 删除设备中的文件。 |
DeviceFileExists | 检查设备中是否存在文件。 |
Disconnect | 中断与设备的连接。 |
EnumFiles | 提供与 FileName 参数提供的条件相匹配的 FileInformation 类数组列表。 |
GetDeviceCapabilities | 检索设备的特定设备信息。 |
GetDeviceFileAttributes | 检索特定设备文件的属性。 |
GetDeviceFileSize | 检索设备文件的大小,以字节为单位。 |
GetDeviceFileTime | 检索设备文件的日期时间。 |
GetDeviceMemoryStatus | 检索设备的内存使用信息。 |
GetDeviceSystemFolderPath | 检索到设备系统文件夹的路径。 |
GetDeviceSystemInfo | 检索设备的系统详细信息。 |
GetDeviceSystemPowerStatus | 检索设备的电源状态。 |
GetDeviceVersion | 检索设备的操作系统版本。 |
MoveDeviceFile | 将现有设备文件移到或重命名到一个新位置。 |
RemoveDeviceDirectory | 删除设备中的目录。 |
SetDeviceFileAttributes | 设置设备中文件的属性。 |
SetDeviceFileTime | 设置设备中文件的日期时间。 |
附带三个源程序供参考