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使用GridView实现日历的方法

    Android使用GridView实现日历的方法

    本篇文章主要介绍了Android使用GridView实现日历的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Android适配器Adapter与ListView和RecycleView的简单使用

    Android适配器Adapter与ListView和RecycleView的简单使用

    本文将为大家介绍Android开发中常用的适配器(Adapter)概念,以及ListView和RecycleView的简单使用方法,需要的朋友可以参考下
    2023-05-05
  • Android实现CoverFlow效果控件的实例代码

    Android实现CoverFlow效果控件的实例代码

    这篇文章主要介绍了Android实现CoverFlow效果控件的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Android WebView缓存机制优化加载慢问题

    Android WebView缓存机制优化加载慢问题

    我知道你一定在烦恼Android Webview的性能问题,特别突出的是-加载速度慢、消耗流量,针对Android Webview的性能问题,提出一些有效解决方案
    2023-02-02
  • java  深入理解内存映射文件原理

    java 深入理解内存映射文件原理

    这篇文章主要介绍了java 深入理解内存映射文件原理的相关资料,虚拟内存与内存映射文件的区别与联系,内存映射文件的原理和效率,需要的朋友可以参考下
    2016-11-11
  • flutter BottomAppBar实现不规则底部导航栏

    flutter BottomAppBar实现不规则底部导航栏

    这篇文章主要为大家详细介绍了flutter BottomAppBar实现不规则底部导航栏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Android中用Builder模式自定义Dialog的方法

    Android中用Builder模式自定义Dialog的方法

    在任何软件操作系统中,Dialog即对话框都是一种重要的交互模式与信息载体,而Android系统本身的Dialog拥有固定的样式,并且在5.0后采用Material Design设计风格的Dialog美观大气。这篇文章将详细介绍Android中用Builder模式自定义Dialog的方法,有需要的可以参考借鉴。
    2016-10-10
  • Android 反射注解与动态代理综合使用详解

    Android 反射注解与动态代理综合使用详解

    本篇文章主要介绍了Android 反射注解与动态代理综合使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Android指纹识别认识和基本使用详解

    Android指纹识别认识和基本使用详解

    这篇文章主要为大家详细介绍了Android指纹识别认识和基本的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • 使用android studio导入模块的两种方法(超详细)

    使用android studio导入模块的两种方法(超详细)

    这篇文章主要介绍了使用android studio导入模块的两种方法,本文通过图文并茂的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09

最新评论