Android串口操作方法实例
更新时间:2015年04月24日 09:51:51 投稿:junjie
这篇文章主要介绍了Android串口操作方法实例,本文共分5个步骤讲解了Android串口操作方法,并给出代码实例,需要的朋友可以参考下
1.首先下载一个libserial_port.so,新建目录libs/armeabi,将so文件放到该目录下。
2.定义串口类,在类的构建函数中修改权限,打开设备,创建输入流和输出流,通过native接口访问串口打开关闭函数
复制代码 代码如下:
public class SerialPort {
/*Do not remove or rename the field mFd: it is used by native method close();*/
public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException, InvalidParameterException{
//如果串口权限不够,改变权限
/* 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 666 " + device.getAbsolutePath() + "\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, flags);//打开串口
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, int flags);//c文件中的串口open()函数
public native void close();//c文件中的串口close()函数
static {
System.loadLibrary("serial_port");//加载串口库
}
}
}
3.定义抽象类ServerData
复制代码 代码如下:
public abstract class ServerData {
protected SerialPort mSerialPort;
protected OutputStream mOutputStream;
private InputStream mInputStream;
private ReadThread mReadThread;
private class ReadThread extends Thread {
@Override
//在线程中读取数据并处理数据
public void run() {
super.run();
byte[] buffer = new byte[128];
int size;
while(true) {
try {
if (mInputStream == null) return;
size = mInputStream.read(buffer);//读取数据
if (size > 0) {
onDataReceived(buffer, size);//处理数据
}
} catch (IOException e) {
e.printStackTrace();
return;
}
}
}
}
4.实例化串口类,输出流和输入流,实例化读取线程并开始执行该线程
[code]
public ServerData(String path, int baudrate){
try {
mSerialPort = new SerialPort(new File(path), baudrate, 0);
mOutputStream = mSerialPort.getOutputStream();
mInputStream = mSerialPort.getInputStream();
/* Create a receiving thread */
mReadThread = new ReadThread();
mReadThread.start();
} catch (SecurityException e) {
} catch (IOException e) {
} catch (InvalidParameterException e) {
}
}
protected abstract void onDataReceived(final byte[] buffer, final int size);
}
[/code]
5.然后再新建一个类,在新建的类中实现上面的抽象函数,并写一个函数返回读取到的数据。
复制代码 代码如下:
package View;
//导入R类,所在包不同,不能直接饮用,需要导入才可以使用
import android_serialport_api.sample.R;
/* EtcView类,Etc界面管理 */
public class SerialView {
private Activity context = null;
private Serial mEtcServer = null;
/* Etc界面构造函数 */
public SerialView(Activity context) {
this.context = context;
}
public void EtcInitView() {
//这样才可以找到android_serialport_api.sample包下的id
TextView mytext=(TextView)context.findViewById(R.id.mytext);
mEtcServer = new Serial("/dev/s3c2410_serial3", 9600);
}
public void EtcRefresh() {
//返回串口线程读取的数据
byte[] buffer = mEtcServer.getdata();
String recString=new String(buffer);//将byte[]的数组转换成字符串string
mytext.setText(recString);//设置字符文本
buffer = null;
}
}
相关文章
Android使用CountDownTimer实现倒数定时器效果
这篇文章主要介绍了Android使用CountDownTimer实现倒数定时器效果的资料,这里整理了详细的代码,有需要的小伙伴可以参考下。2017-02-02Android手机号码输入框(满11位自动跳到下个输入框)实例代码
这篇文章主要介绍了Android手机号码输入框(满11位自动跳到下个输入框)实例代码,需要的朋友可以参考下2017-10-10Android性能优化之利用Rxlifecycle解决RxJava内存泄漏详解
RxJava作为一种响应式编程框架,是目前编程界网红,可谓是家喻户晓,其简洁的编码风格、易用易读的链式方法调用、强大的异步支持等使得RxJava被广泛使用。2017-01-01Android读取本地json文件的方法(解决显示乱码问题)
这篇文章主要介绍了Android读取本地json文件的方法,结合实例形式对比分析了解决显示乱码问题的方法,需要的朋友可以参考下2016-06-06Android仿银行客户签名并且保存签名的截图文件并命名为本地时间
本文通过实例代码给大家介绍了Android仿银行客户签名并且保存签名的截图文件并命名为本地时间,需要的朋友可以参考下2017-07-07
最新评论