Android 串口通讯 获取卡号

首先你的andoridstudio 需要配置ndk 环境 

然后在去下载谷歌的的demo 

下载地址

Android 串口通讯 获取卡号_第1张图片

把这些直接复制到代码中

一般  jni C语言调用java 是指定包名调用的 所有android_serialport_api的包名不要改变 

直接复制过去就行

对了 jniLibs 需要指向下,如果不想指向可以把里面的内容复制到 libs里面

我写的指向

    sourceSets {
        main {
            jni.srcDirs = []
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
    }

准备好之后就可以开始写了,,为了更好的了解串口我拍了一张我们机器上的图片如下

Android 串口通讯 获取卡号_第2张图片

 这个名字不要弄错了

完整的demo如下

package com.hly.main;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android_serialport_api.SerialPort;
public class Good extends AppCompatActivity {
    protected SerialPort mSerialPort;
    protected InputStream mInputStream;
    protected OutputStream mOutputStream;
    private ReadThread mReadThread;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.text_layout);
                try {
                    //临时卡
                    mSerialPort = new SerialPort(new File("/dev/ttyS4"), 19200, 0);
                    mInputStream = mSerialPort.getInputStream();
                    mOutputStream = mSerialPort.getOutputStream();
                    mReadThread = new ReadThread();
                    Toast.makeText(Good.this, "串口已经打开", Toast.LENGTH_SHORT).show();
                    mReadThread.start();
                } catch (SecurityException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    Log.v("test", "启动失败");
                    e.printStackTrace();
                }
    }

 private class MReadThread extends Thread {
        @Override
        public void run() {
            super.run();
            while (!isInterrupted()) {
                try {
                    if (mInputStream == null)
                        return;
                    byte[] buffer = new byte[64];
                    int mcount;
                    if (mInputStream.available() <= 0) {
                        continue;
                    } else {
                        Thread.sleep(300);
                    }
                    mcount = mInputStream.read(buffer);
                    if (mcount > 8) {
                      //根据自己的情况添加
                        onDataReceived(buffer, mcount, 1);//根据自己需要的情况添加内容
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                    return;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    return;
                }
            }
        }
    }
    
  
    protected void onDataReceived(final byte[] buffer, final int size) {
        runOnUiThread(new Runnable() {
            public void run() {
                    String msg = new String(buffer);
                    Toast.makeText(Good.this, msg, Toast.LENGTH_SHORT).show();
                    //这个是需要截取的卡号
//                    byte[] bytes = buffer;
//                    String mealCardData = HexUtils.bytes2Hex(bytes);
//                    //截取餐卡卡号,临时餐卡为AA55打头
//                    if (mealCardData != null && mealCardData.length() >= 14) {
//                        String cardNo = mealCardData.substring(10, 12);
//                        cardNo = cardNo + mealCardData.substring(8, 10);
//                        cardNo = cardNo + mealCardData.substring(6, 8);
//                        cardNo = cardNo + mealCardData.substring(4, 6);
//                        Toast.makeText(Good.this, cardNo, Toast.LENGTH_SHORT).show();
                }
                
        });
    }
}

需要注意的地方就是 地址与波特率 不要弄错了

这样就拿到卡号了,如果项目需要截取卡号之类的,自己在处理就行了 。。。

如果有不懂的可以提问,谢谢。。。。

 

你可能感兴趣的:(Android,Android,知识点记录)