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;
 }
}

(0)

相关推荐

  • Python操作串口的方法

    本文实例讲述了Python操作串口的方法.分享给大家供大家参考.具体如下: 首先需确保安装了serial模块,如果没安装的话就安装一下python-pyserial. 一个Python实现的串口Echo import serial import sys try: ser = serial.Serial('/dev/ttyUSB0', 9600) except Exception, e: print 'open serial failed.' exit(1) print 'A Serial Ech

  • 深入分析Visual C++进行串口通信编程的详解

    利用Visual C++在windows环境下设计异步串行通信程序可以使用不同的方法.一种方法可以使用windows系统提供的串行口API函数:另一种方法可以直接使用Microsoft公司提供的ActiveX控件MSCOMM.OCX.利用MSCOMM.OCX控件进行串行口程序设计相对比较简单,只要对该控件的属性.事件和方法进行设置和操作,就能完成简单的串行通信功能.而直接使用windows系统提供的串行口API函数则相对较为灵活.试验中,可根据自己的情况任意其中一种进行编程.以下针对如何使用wi

  • 详细解读Java的串口编程

    常见问题 JavaComm 和 RxTX 安装时有一些与众不同的地方.强烈建议按照安装说明一点点的安装.如果安装说明要求一个jar文件或一个共享库必须在某一特定的文件夹下,那这就意味着需要严肃对待.如果说明要求一个特定的文件或设备需要拥有一个特定的所有权或访问权,这也意味着需要严肃处理.很多安装问题都只是因为没有按照安装说明要求的去做而引起的. 特别要注意的是一些版本的JavaComm会带有两个安装说明.一个用于java 1.2及以后的版本,一个用于java 1.1版本.使用错误的安装说明会导致

  • C#串口通信程序实例详解

    创建C#串口通信程序之命名空间 System.IO.Ports命名空间中最重用的是SerialPort 类. 创建C#串口通信程序之创建SerialPort 对象 通过创建SerialPort 对象,我们可以在程序中控制串口通信的全过程. 我们将要用到的SerialPort 类的方法: ReadLine():从输入缓冲区读一新行的值,如果没有,会返回NULLWriteLine(string):写入输出缓冲Open():打开一个新的串口连接Close():关闭 复制代码 代码如下: SerialP

  • nodejs简单实现操作arduino

    用Javascript来操作硬件早就不是一件稀奇的事情了. 所以作为一名电子专业出身的FE,我也打算尝试一下用js来驱动arduino: 要想操作这些底层硬件,肯定是需要一些工具的,我这里介绍的工具主要是 cylonjs 和 gort cylonjs其实就是一个操作"机器"的js框架,官网的介绍是这样的: Cylon.js is a JavaScript framework for robotics, physical computing, and the Internet of Th

  • Arduino 数据类型转换(单机片)详细介绍

    Arduino 数据类型转换 如何轻松玩转Arduino单片机,当我在进行数据转换的时候,遇到了问题,尝试了C语言和C++中的好多函数,都没有达到将float型数据转换为char型的目的.苦苦查阅资料后,终于找到了一个大神级函数!!!dtostrf(),可以轻松实现数据类型from   float   to  char .            get it 格式如下: char* dtostrf(double _val,signed char _width, unsigned char pre

  • Android开发之串口编程原理和实现方式

    提到串口编程,就不得不提到JNI,不得不提到JavaAPI中的文件描述符类:FileDescriptor.下面我分别对JNI.FileDescriptor以及串口的一些知识点和实现的源码进行分析说明.这里主要是参考了开源项目android-serialport-api. 串口编程需要了解的基本知识点:对于串口编程,我们只需对串口进行一系列的设置,然后打开串口,这些操作我们可以参考串口调试助手的源码进行学习.在Java中如果要实现串口的读写功能只需操作文件设备类:FileDescriptor即可,

  • 服务器sas硬盘+sata串口硬盘win2003系统安装方法分享

    服务器配置如下: XEON5506(2.13) 内存:KST 4GB DDR3 ECC 硬盘:ST300G SAS-15000转*1+1T 西部数据企业级硬盘 主板:华硕Z8ANA-D6+6480*1 机箱:1U机架式 电源:1U 400W 组装好以后,安装系统后发现在win2003安装界面硬盘分区都正常,但到了选择sas硬盘的c盘时,总提示1T硬盘没有可识别的分区什么的,因为跟sata接口的硬盘没有关系,为什么总提示这个,所以将sata硬盘线拔下,直接用一个sas硬盘安装系统,正常通过,安装好

  • python简单程序读取串口信息的方法

    本文实例讲述了python简单程序读取串口信息的方法.分享给大家供大家参考.具体分析如下: 这段代码需要调用serial模块,通过while循环不断读取串口数据 import time import serial ser = serial.Serial( #下面这些参数根据情况修改 port='COM1', baudrate=9600, parity=serial.PARITY_ODD, stopbits=serial.STOPBITS_TWO, bytesize=serial.SEVENBIT

  • Android 串口通信编程及串口协议分析

    Android 串口通信编程:嵌入式编程和可穿戴设备及智能设备都会用到串口,这里就带大家分析下, 一,android串口通信 串口通信采用一个第三方开源项目,实现串口数据收发. 1. 使用了http://code.google.com/p/android-serialport-api/的项目的serialport api和jni: 2. 支持4串口同时收发,有定时自动发送功能,收发模式可选Txt或Hex模式: 3.  n,8,1,没得选: 4. 为减轻界面卡顿的情况,接收区的刷新采用单独的线程进

  • PHP通过串口实现发送短信

    随技术进步,短信收发领域按时间先后产生了三种模式:BLOCK MODE,基于AT指令的TEXT MODE,基于AT指令的PDU MODE.其中,TEXT MODE比较简单,多款诺基亚手机均支持此款模式.西门子的手机大多数只支持PDU MODE.PDU 模式是收发短信的一种方法,短信正文经过十六进制编码后被传送.目前,PDU已取代BLOCK MODE. SMS是由Etsi所制定的一个规范(GSM 03.40 和GSM 03.38).当使用7-bits编码时,它可以发送最多160个字符;但用8-bi

随机推荐