Android 串口的踩坑之路

本文记录了在Android上对接串口称时遇到的困难,包括配置NDK、解决安全异常和报名错误。关键步骤包括确认硬件支持、确定正确地址和波特率,以及处理包名问题。运行条件为硬件支持串口输出、知晓准确硬件参数和正确引用jniLibs。作者提供了详细的操作指南和解决方法。
摘要由CSDN通过智能技术生成

最近公司需要对接串口称,我在网上查了好多质料,遇到了很多问题,于是今天就根据自己遇到的问题做些笔记
先贴出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_serial

android 串口驱动源代码 package android.serialport; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.util.Log; public class SerialPort { private static final String TAG = "SerialPort"; /* * Do not remove or rename the field mFd: it is used by native method close(); */ private FileDescriptor mFd; private FileInputStream mFileInputStream; private FileOutputStream mFileOutputStream; public SerialPort(File device, int baudrate) throws SecurityException, IOException { /* Check access permission */ if (!device.canRead() || !device.canWrite()) { try { /* Missing read/write permission, trying to chmod the file */ Process su; su = Runtime.getRuntime().exec("/system/bin/su"); /*String cmd = "chmod 777 " + device.getAbsolutePath() + "\n" + "exit\n";*/ String cmd = "chmod 777 /dev/s3c_serial0" + "\n" + "exit\n"; su.getOutputStream().write(cmd.getBytes()); if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()) { throw new SecurityException(); } } catch (Exception e) { e.printStackTrace(); throw new SecurityException(); } } mFd = open(device.getAbsolutePath(), baudrate); if (mFd == null) { Log.e(TAG, "native open returns null"); throw new IOException(); } mFileInputStream = new FileInputStream(mFd); mFileOutputStream = new FileOutputStream(mFd); } // Getters and setters public InputStream getInputStream() { return mFileInputStream; } public OutputStream getOutputStream() { return mFileOutputStream; } // JNI private native static FileDescriptor open(String path, int baudrate); public native void close(); static { System.loadLibrary("serial_port"); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值