产品名称 StudyBarcode
文档版本 StudyBarcode 测试程序设计说明

[J2ME]华禹工控条码测试程序设计说明

1 背景和功能

1.1. 条码测试程序的概念

一个可以下载到华禹手持设备(P1300、P1220、P1500系列)的Java应用程序,用于测试华禹手持设备的条码扫描功能。

1.2. 如何体验条码测试程序

下载StudyBarcode.jad 和StudyBarcode.jar 到华禹手持设备上,执行Java程序,可体验条码测试程序。

1.3. 条码测试程序界面

下面是StudyBarcode程序的界面(从模拟器中抓取):

图1:
图2:
打开之后会进入到图1,点击进入测试后进入图2。
第一个选项为进入扫描界面,第二个是设置,第三个是使用说明。

2 设计思路

2.1. JNI 的概念

Java 本地接口(Java Native Interface (JNI))允许运行在Java 虚拟机(JVM)上的代码调用本地程序和类库,或者被它们调用,这些程序和类库可以是其它语言编写的,比如C、C++或者汇编语言。
当一个程序无法完全使用Java 编写时,开发者可以通过JNI 来编写本地方法。

2.2. StudyBarcode中的包

2.2.1 com.mtk

com.mtk包中的Gpio.java中操作GPIO的方法为华禹提供的JNI方法。

2.2.2 com.huayu.gpio

com.huayu.gpio包中的GpioPort.java定义了华禹手持设备的GPIO控制引脚。
对Gpio操作更详细的介绍见 华禹工控手持设备GPIO测试程序设计说明

2.2.3 其它

2.3条码程序工作原理

基于华禹平台的手持条码扫描由两部分组成:
1. java 程序:演示程序是StudyBarcode。
2. java 程序通过串口与条码头通信,并通过gpio 控制条码头的电源及条码头数据传输方式。
结构如下图所示:

扫描条码时,java 程序将TRIG 引脚电平拉低,条码头开始扫描,扫描到条码信息后将信息返回串口,串口接收信息解析后显示。
设置模式时,java 程序发送模式变更命令,条码头接收后返回ACK 并变更模式。

2.4扫描条码具体程序示例

2.4.1 打开串口

打开串口前判定是否在手持机上使用,调用
System.getProperty("microedition.platform");
如果得到值为" Sun",判定其在模拟器上使用
s_commUrl = s_commUrlEmu;
当值不为" Sun",判定其在真机上使用
s_commUrl = s_commUrlDevice;
s_commUrlEmus_commUrlDevice赋值与说明:
s_commUrlDevice = "tckcomm:1;baudrate=9600;blocking=off;autocts=off;autorts=off";
s_commUrlEmu= "comm:COM3;baudrate=9600;blocking=off;autocts=off;autorts=off";
COM3 为实际使用的串口。

查看实际使用的串口的方法:
打开我的电脑属性选项,然后点开设备管理器,可看见实际使用的串口。
图3:

打开串口线程:

cc = (CommConnection) Connector.open(s_commUrl);
in = cc.openInputStream();
out = cc.openOutputStream();
m_start = true;
new readT().start();

通过Connector.open打开串口,通过openInputStream 得到输入流,
openOutputStream 得到输出流,同时启动数据接收线程。

接收线程:

While(m_start) {
    int len = in.available();
    if(len != 0) {
        byte[] bData = new byte[len];
        int iRet = in.read(bData);
    }
    Thread.sleep(100);
}

2.4.2 打开模拟开关连接串口与条码头的串口

在华禹平台上,可能存在一个串口两种用途的情况。例如,条码和RFID 共用一个串口,模拟开关用于控制串口的实际用途。

P1220 平台:
P1220:HuayuNative.writeIO(ContentManager.P1220_SWITCH_PIN,ContentManager.P1220_BARCODE_SWITCH );

2.4.3 打开条码头的电源

P1220:HuayuNative.writeIO(ContentManager.P1220_BARCODE_POWER_PIN,ContentManager.P1220_BARCODE_POWER_ON);

2.4.4 设置CTS脚为高电平,让条码头处于向串口发送数据状态

P1220:HuayuNative.writeIO(ContentManager.P1220_BARCODE_CTS,ContentManager.P1220_BARCODE_CTS_HIGH);

2.4.5 设置trig 引脚触发条码

HuayuNative.writeIO(ContentManager.P1220_BARCODE_TGIG,ContentManager.P1220_BARCODE_TGIG_OFF);
Thread.sleep(1);
HuayuNative.writeIO(ContentManager.P1220_BARCODE_TGIG,ContentManager.P1220_BARCODE_TGIG_ON);

2.4.6 接收数据并解析

串口接收到的数据即为条码信息,直接解析即可。
在实现为产品时,建议为条码数据设置格式信息。设置命令见:SE955 FINAL IG.pdf

2.4.7 关闭电源

P1220:HuayuNative.writeIO(ContentManager.P1220_BARCODE_POWER_PIN,ContentManager.P1220_BARCODE_POWER_OFF);

2.4.8. 关闭串口

if(out != null) {
    out.close();
}
if(in != null) {
    in.close();
}
if(cc != null) {
    cc.close();
}

2.5模式设置具体程序示例

2.5.1 设置CTS脚,让条码头处于等待接收串口数据状态

P1220:HuayuNative.writeIO(ContentManager.P1220_BARCODE_CTS,ContentManager.P1220_BARCODE_CTS_LOW);

2.5.2 向条码头发送命令

设置连续扫描模式:

byte[] bData = com.huayu.barcodemode.ModeData.enpacketContinues();

设置按键扫描模式:

byte[] bData = com.huayu.barcodemode.ModeData.enpacketPulse();
if(out != null) {
    if(bData.length != 0) {
        try {
            out.write(bData,0,bData.length);
            out.flush();
        } catch (IOException e) {
        // TODO 自动生成catch 块
        
e.printStackTrace();
        }
    }
}

bData 的意义:向条码头发送变换模式的命令。
简单解释:
bData[0] 不包括校验字节的消息长度,最大值为0xFF;
bData[1] 表示此类型的数据包为发送数据类型。
bData[2] 表示此消息出处;
bData[3] 传送状态:0表示第一次传送,1表示后续传送。
bData[4] bData[5] bData[6] 扫描模式设定。
bData[7] bData[8]: 校验码.
命令更详细的格式,见SE955 FINAL IG.pdf

2.5.3 设置CTS脚,让条码头处于向串口发送数据状态

P1220:HuayuNative.writeIO(ContentManager.P1220_BARCODE_CTS,ContentManager.P1220_BARCODE_CTS_HIGH);

3 资源

华禹工控资源:
1. SE955 FINAL IG.pdf
2. 华禹工控手持设备GPIO测试程序设计说明
3. 一维条码测试程序源码包下载:StudyBarcode

购买信息:

1. 创易电子淘宝店

编写者 日期 关键词
华禹工控 2010-06-04 BARCODE、J2ME、华禹手机模块、JNI
302 Found

302 Found


nginx/1.8.0