热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android串口操作方法实例

这篇文章主要介绍了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;
 }
}


推荐阅读
  • 本文介绍了用户界面(User Interface, UI)的基本概念,以及在iOS应用程序中UIView及其子类的重要性和使用方式。文章详细探讨了UIView如何作为用户交互的核心组件,以及它与其他UI控件和业务逻辑的关系。 ... [详细]
  • 本文探讨了线性表中元素的删除方法,包括顺序表和链表的不同实现策略,以及这些策略在实际应用中的性能分析。 ... [详细]
  • LeetCode 102 - 二叉树层次遍历详解
    本文详细解析了LeetCode第102题——二叉树的层次遍历问题,提供了C++语言的实现代码,并对算法的核心思想和具体步骤进行了深入讲解。 ... [详细]
  • JavaScript 中引号的多层嵌套使用技巧
    本文详细介绍了在 JavaScript 编程中如何处理引号的多级嵌套问题,包括双引号、单引号以及转义字符的正确使用方法。 ... [详细]
  • 解决UIScrollView自动偏移问题的方法
    本文介绍了一种有效的方法来解决在使用UIScrollView时出现的自动向下偏移的问题,通过调整特定的属性设置,可以确保滚动视图正常显示。 ... [详细]
  • 如何高效渲染JSON数据
    本文介绍了在控制器中返回JSON结果的方法,并详细说明了如何利用jQuery处理和展示这些数据,为Web开发提供了实用的技巧。 ... [详细]
  • Awk是一款功能强大的文本分析与处理工具,尤其在数据解析和报告生成方面表现突出。它通过读取由换行符分隔的记录,并按照指定的字段分隔符来划分和处理这些记录,从而实现复杂的数据操作。 ... [详细]
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • 本文探讨了一种常见的C++面试题目——实现自己的String类。通过此过程,不仅能够检验开发者对C++基础知识的掌握程度,还能加深对其高级特性的理解。文章详细介绍了如何实现基本的功能,如构造函数、析构函数、拷贝构造函数及赋值运算符重载等。 ... [详细]
  • 随着Linux操作系统的广泛使用,确保用户账户及系统安全变得尤为重要。用户密码的复杂性直接关系到系统的整体安全性。本文将详细介绍如何在CentOS服务器上自定义密码规则,以增强系统的安全性。 ... [详细]
  • 本文介绍了通过ADB命令查询Android设备CPU的当前频率、最小频率和最大频率的方法。 ... [详细]
  • 在Android中实现黑客帝国风格的数字雨效果
    本文将详细介绍如何在Android平台上利用自定义View实现类似《黑客帝国》中的数字雨效果。通过实例代码,我们将探讨如何设置文字颜色、大小,以及如何控制数字下落的速度和间隔。 ... [详细]
  • 3DSMAX制作超现实的体育馆模型
    这篇教程是向脚本之家的朋友介绍3DSMAX制作超现实的体育馆模型方法,教程制作出来的体育馆模型非常地不错,不过教程有点难度,需要有一定基础的朋友学习,推荐到脚本之家,喜欢的朋友可 ... [详细]
  • 本文介绍了如何在AngularJS应用中使用ng-repeat指令创建可单独点击选中的列表项,并详细描述了实现这一功能的具体步骤和代码示例。 ... [详细]
  • 在项目冲刺的最后一天,团队专注于软件用户界面的细节优化,包括调整控件布局和字体设置,以确保界面的简洁性和用户友好性。 ... [详细]
author-avatar
云匢天仙草
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有