最近公司需要对接串口称,我在网上查了好多质料,遇到了很多问题,于是今天就根据自己遇到的问题做些笔记
先贴出Google给出的Demo地址 https://github.com/cepr/android-serialport-api

踩坑第一步:

需要配置NDK,我百度一番,搜索了很多文章,大致配置差不多,参照的博客如下:
https://blog.csdn.net/weixin_44151070/article/details/100627791
第一步下载LLDB,NDK,CMake

第二步配置DNK路径

第三步 在环境变量中操作了一番,最后doc命令行中编译的结果如图所示:

在这里算是告诉我配置NDK成功了
但是这些好像并没有什么用处,之前查询的博客是说通过DNK重新编译so文件来适应最新的Android studio版本,我现在的是studio是3.53,targetSdkVersion 是29,按博客上说的是不能与现在的兼容的
所以我按照博客的去编译发现无法实现,总是各种报错,并没有成功

我查阅了这篇博客后,看到了曙光
Android 串口开发(一) 串口读写操作
他将串口代码封装了一下,我下载下来后第一次运行发现是不可以的,我换了台设备在次运行,发现可以了,后来使用了我自己的Demo,发现也是可以的,这里暴露了我的第一个问题:
1.硬件需要支持串口的输出(我之前使用的是商米设备,现在使用的是新大陆的设备)
2.需要知道当前硬件的准确地址与波特率
如果在不知道准确地址与波特率的情况下运行,会报如下错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mydemo/com.example.mydemo.ThreeActivity}: java.lang.SecurityException
这个安全异常是源码中本身抛出的

看到这里我就很开心了,那我的Demo在OK之前还有一个小问题,那就是报名问题

图中圈出来的地方是我最开始放SerialPort.java与SerialPortFinder.java文件的地方
当时运行时报了如下错误
No implementation found for java.io.FileDescriptor com.example.mydemo.serial.SerialPort.open(java.lang.String, int, int) (tried Java_com_example_mydemo_serial_SerialPort_open and Java_com_example_mydemo_serial_SerialPort_open__Ljava_lang_String_2II)
告诉我报名错误,当我更换了包名为google原来包名后,发现已经可以了

总结下运行条件:
1.硬件需要支持串口的输出
2.需要知道当前硬件的准确地址与波特率
3.包名要为android_serialport_api

使用
第一步:
将jniLibs放到java文件夹下面同时将so文件拷贝过来

第二步
将java文件拷贝到android_serialport_api文件中

第三步 在defaultConfig中引用jni文件
ndk {
abiFilters “armeabi”, “armeabi-v7a”, “x86” //u的类型
}
sourceSets {
main {
jni.srcDirs = []
}
}

Demo中的代码:

public class ThreeActivity extends AppCompatActivity {private EditText et_set,et_get;private SerialPort serialPort;private SerialPortFinder serialPortFinder;private InputStream inputStream;private OutputStream outputStream;private ReadThread mReadThread;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_three);    et_set= (EditText) findViewById(R.id.et_set);    et_get= (EditText) findViewById(R.id.et_get);    serialPortFinder = new SerialPortFinder();    String[] allDevicesPath = serialPortFinder.getAllDevicesPath();    System.out.println("result-->"+allDevicesPath.length);    try {        serialPort = new SerialPort(new File("/dev/ttyHSL2"),115200,0);        inputStream = serialPort.getInputStream();        outputStream = serialPort.getOutputStream();        mReadThread = new ReadThread();        mReadThread.start();    } catch (IOException e) {        e.printStackTrace();    }}private class ReadThread extends Thread {    @Override    public void run() {        super.run();        while(!isInterrupted()) {            int size;            try {                byte[] buffer = new byte[64];                if (inputStream == null) return;                size = inputStream.read(buffer);                if (size > 0) {                    String str =  new String(buffer);                    System.out.println("result-->读取的文件"+str);                }            } catch (IOException e) {                e.printStackTrace();            }        }    }}public void setData(View view){}public void getData(View view){}@Overrideprotected void onDestroy() {    super.onDestroy();    if (inputStream!=null){        try {            inputStream.close();        } catch (IOException e) {            e.printStackTrace();        }        inputStream=null;    }    if (outputStream!=null){        try {            outputStream.close();        } catch (IOException e) {            e.printStackTrace();        }        outputStream=null;    }  }} /** * 向串口读取数据 */private void read() {    try {        Thread.sleep(1500);        final byte[] bytes = new byte[1024 * 5];        if (null != mInputStream) {            int result = mInputStream.read(bytes);            if (result > 0) {                byte[] readBytes = new byte[result];                System.arraycopy(bytes, 0, readBytes, 0, result);                KmLog.d_log_file(TAG, "读取串口数据:------------" + new String(readBytes));                parseResult(new String(readBytes));            }        }    } catch (Exception e) {        e.printStackTrace();        KmLog.d_log_file(TAG, "读取串口数据失败");    }}//写入数据数据private boolean write(byte[] data) {    mSb.setLength(0);    try {        if (null != mOutputStream) {            mOutputStream.write(data, 0, data.length);            mOutputStream.flush();        }    } catch (Exception e) {        KmLog.d_log_file(TAG, "写入串口数据失败");        return false;    }    return true;}

以上主要是业务代码,这里主要是操作流对象,没有什么特别的,但是一定要注意,如果有多个串口一定要记得关闭串口,否则会串口占用的哦
先写到这里,如果疑问请留言或者添加QQ1335745248 并留言“串口交流”,我们一起学习吧

更多相关文章

  1. Android(安卓)源码导入Eclipse技巧(Ubuntu)
  2. windows系统上安装与使用Android(安卓)NDK
  3. Android(安卓)如何建立AIDL
  4. Android(安卓)使用Post方式提交数据
  5. sqlite数据库常用命令
  6. Android应用基础知识
  7. 第1章 Android应用与开发环境
  8. Android(安卓)LCD和键盘 背光亮度数据流分析
  9. ym——Android从零开始(5)(文件操作+日记+单元测试)(新)

随机推荐

  1. [原]Android应用程序键盘(Keyboard)消息处
  2. Android HttpClient上传文件与Httpconnec
  3. 《Android Dev Guide》系列教程8:用户界面
  4. Android获取屏幕分辨率及DisplayMetrics
  5. 推荐--《Android深入浅出》
  6. Android系统架构-[Android取经之路]
  7. Android 自定义控件-SnakeLayout (仿galle
  8. Android studio获取证书指纹 (SHA1)的方
  9. Android命名规范,开发规范,注意点整理(一)
  10. Android通知系统源码解析