android 串口一直打开_android 若何打开串口以及与串口通信

串口 若何 打开 通信 android android 串口通讯 androidusb转串口通讯 android 蓝牙串口通讯 android串口通讯demo ble串口通讯 android android 打开通讯录 android打开串口 android 打开串口失败 android如何打开串口

串口通信,对于没接触过这方面的伴侣们,确实会感应头疼,不知道从何下手。

其实,串口通信和办事器之间的通信是一样的,都是传一些参数曩昔,然后返回一些数据回来。不外串口通信管这些参数叫做指令,而这些指令是由硬件的通信和谈而定的,通信和谈分歧,指令天然也分歧。在我开辟的这个项目里,兼容了四种硬件通信和谈,这四种和谈各不不异,所以,那些指令就不在代码里面写出来了。

串口通信,第一步要做的当然是打开串口,打开串口的方式如下:

起首在app下成立一个libs文件夹,把.so文件复制到libs下

2434853-5269aef92973c052.png (64.03 KB, 下载次数: 0)

2434853-5269aef92973c052.png

2016-12-14 06:06 上传

QQ截图20161211220537.png

用android studio的伴侣们要记得在build.gradle  文件中添加这段  jniLibs.srcDirs = ['libs']  ,我有一次看见别人的代码里面可以不加这段,照样能运行,有知道的可以和大师分享一下。不外这些都不主要,只要能开串口就行。然后,在java的根目次下建一个包,留意是根目次,包名为:android_serialport_api,这个包名是固定的,不克不及少也不克不及多。然后把类SerialPort复制到包下面。

// JNI

private native static FileDescriptor open(String path, int baudrate, int flags);

public native void close();

static {   System.loadLibrary("serial_port");   }

`

上面的第一个函数open是挪用jni打开串口的方式,挪用该方式的时辰会返回一个FileDescriptor对象,经由过程该对象可以获取输入输出流。第二个close函数是封闭串口的方式,可以经由过程此方式封闭串口。这两个函数最好是能成对呈现,在法式打开的时辰把串口打开,法式退出了就把串口封闭,如许可以避免一些问题呈现。第三个是加载.so文件里面的代码的,加载了之后串谈锋能用。

···

public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException {

System.out.println("device======"+device.getAbsolutePath());

/ Check access permission /

if (!device.canRead() || !device.canWrite()) {

try {

/ Missing read/write permission, trying to chmod the file /

Process    su = Runtime.getRuntime().exec("/system/bin/su");

String cmd = "chmod 666 " + device.getAbsolutePath() + "\n"

···

上面的这段代码中,su.getOutputStream().write(cmd.getBytes());这行是获取root权限的,打开串口是需要root权限的,假如不克不及获取root权限,串口也是打不开的,其他的就是一些判定了,在这就不做具体讲解了。

上面这些是开串口之前的预备,预备完毕后,我们来打开串口,打开串口就是挪用open函数,挪用open函数需要传三个参数,第一个参数path是串口名,好比:”/dev/ttyS0“,这些是按照现实接口来定的,第二个参数baudrate是波特率,一般都是9600,15200,这个需要按照硬件来定,第三个我就不清晰了,我都是传0,有知道的可以和大师分享一下。

···

/**

//            SerialPortState = true;

mReadThreadBox.start();

if (firstRegisterBox) {

if(mContext == null){

Log.e(TAG, "mContext nulll");

}

m_SerialRecBox = new SerialBroadcastReceiverBox(mContext);

m_SerialRecBox.registerAction();

firstRegisterBox = false;

Log.i(TAG, "----locker port--- 注册完毕");

}

lockerPortInterface.onLockerOutputStream(mOutputStreamBox);

} catch (SecurityException e) {

e.printStackTrace();

DisplayError(mContext,R.string.error_security);

} catch (IOException e) {

e.printStackTrace();

DisplayError(mContext,R.string.error_unknown);

} catch (InvalidParameterException e) {

e.printStackTrace();

DisplayError(mContext,R.string.error_configuration);

}

}

···

boxPort = new SerialPort(new File(path), baudrate, 0);这行代码是挪用SerialPort的组织方式,经由过程他的组织方式去挪用open函数,然后经由过程SerialPort对象来获取输入输出流。在这里注释一下,输入流是领受串口返回的数据,输出流是向串口发指令。 挪用SerialPort的组织方式可能会发生三种异常,第一种异常(SecurityException)是串口无读写权限,抛出这种异常的话就申明你可能没有root权限,第二种异常(IOException )串口不克不及打开,可能就是你没有这个串口,第三种异常(InvalidParameterException)是传的参数有误,可能是你的波特率不合错误。我理解的就是如许的,不知道对不合错误。

这是我用模拟器测试的,只要有请求root权限的页面,而且抛的是IO异常,打开串口应该就没问题了。

最后就是向串口发指令,向串口发指令是用输出流向串口写入,至于具体的指令是什么,需要按照和谈来定。发完指令之后串口会回数据成果给你,你需要领受这些数据来做营业,硬件分歧,回数据成果的体例也分歧,有些硬件是发完指令后把成果直接回给你,有些硬件是先给你一小部门,然后等1s再回别的一部门数据。

在我写的demo里面用的方式是针对硬件一次性把数据成果全数返回的体例,onLockerDataReceived直接用这个方式领受数据,如许就比力简单了。串口通信说到这里就竣事了。

最后贴上本身写的一个小demo地址:https://github.com/fm183/SerialportDemo.git,以供大师参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值