android串口通信——电子扫描枪
我们这里开始介绍电子扫描枪(串口的),在开发中我们可能用到电子扫描枪这么一个玩意。比如,我们在做一个可以说扫描条码的app的时候,就会用到,这种情况一般都是运行在终端上,往往不是我们手机上,那么我们来看看扫描枪这个玩意吧。串口的调用我们是基于android-serialport-api的,如有疑问,请看 android串口通信——android-serialport-api
一、扫描枪基础
1.基础指令
下面介绍的只是其中一种,具体使用的是哪一种看具体的文档。
指令 | 说明 |
---|---|
02820383 | 扫描指令 |
06 | 成功的标志(这个是一个坑,实际在用的时候,有可能只返回06,就不返回数据了,所以不能把它当做唯一成功的标志) |
15 | 失败的标志 |
0d0a | 结束标志,如果一个返回的数据中,是个字符串结尾,那么说明数据读取结束 |
2.基本操作说明
当我们需要扫描条码时候,发送 02820383 指令即可启动扫描枪扫描条码,然后我们根据上面的状态说明,来操作放回的数据。特此说明,串口的数据可能不是一次读完的,有时一个数据可能分好几次来读才读完,有时候一次就读完了,由此应该知道我们结束标志是多么的重要了。 所以我们在读完时,需要不数据先保存下来,等到读取完了了,再返回数据。
二、扫描工具类的实现
主要说明:
1.读取数据的线程我们必须只能使用一个线程,不然会造成数据读取不正确。
2.我们发送和读取到得数据都是十六进制。
3.读取到数据是ascii值,我们需要自己转换为对应的值。
package com.qiwenming.scandemo.utils;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidParameterException;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;
import android_serialport_api.SerialPort;
import android_serialport_api.SerialPortFinder;
import com.qiwenming.scandemo.MainActivity;
import com.qiwenming.scandemo.bean.SerialPortSendData;
/**
* @author qiwenming
* @date 2015-11-2 下午2:00:12
* @ClassName ScanUtils
* @Package com.qiwenming.scandemo.utils
* @Description: 串口工作类
*/
public class ScanUtils {
protected static OutputStream mOutputStream=null;
private static InputStream mInputStream = null;
private ReadThread mReadThread;
public SerialPortFinder mSerialPortFinder = new SerialPortFinder();
private SerialPort mSerialPort;
private Context context;
public static ReadThread thread = null;
/**
* @author qiwenming
* @creation 2015-6-18 下午4:38:54
* @instruction 读取类
*/
private class ReadThread extends Thread {
private ScanReciverListener listener;
private SerialPortSendData sendData;
public ReadThread() {
}
public void setDataListener(SerialPortSendData sendData, ScanReciverListener listener) {
this.listener = listener;
this.sendData = sendData;
}
@Override
public void run() {
thread = this;
StringBuffer sb = new StringBuffer();
super.run();
while (!isInterrupted()) {
int size;
try {
byte[] buff