android串口通信

来源:互联网 发布:异构数据库交互 编辑:程序博客网 时间:2024/06/06 00:15

最近又有项目要用到串口通信,想在网上找一个好用的串口调试工具他们的真难啊,95%的博客提供的demo都是个半成品,

核心代码有用,但demo不能用与调试用,给初学者带来很多不便,

主要有以下问题:

1没有选这串口文件地址的下拉框,

2也没有调节波特率的地方,

3没有定时发送数据测试的功能

4没有文本转16进制的功能(硬件数据传输一般用16进制)

下面是我在网找的demo,在修改后的例子源码

例子源码简单,这就不多介绍了

源码下载



个人理解通信流程

       1.获取安卓设备硬件通信地址集合

       2.创建SerialPort对象,SerialPort(通信地址, 波特率, int flags),获取文件输入输出流

        3.通过输入输出流进行数据通信

       硬件设备发送数据--->安卓系统--->数据被存储串口文件中(通信地址就是文件路径)--->通过SerialPort对象获取的流进行数据读取(一般定时读取检测硬件设备有没有发送数据过来)--->得到数据后进行逻辑处理--->通过SerialPort对象获取输出流写数据

一. 获取硬件通信地址
Vector<Driver> getDrivers() throws IOException {
       if (mDrivers == null) {
       mDrivers = new Vector<Driver>();
       LineNumberReader r = new LineNumberReader(new FileReader("/proc/tty/drivers"));
     String l;
     while((l = r.readLine()) != null) {
              String drivername = l.substring(0, 0x15).trim();
               String[] w = l.split(" +");
             if ((w.length >= 5) && (w[w.length-1].equals("serial"))) {
              Log.d(TAG, "---串口设备=" + drivername + " on " + w[w.length-4]);
          mDrivers.add(new Driver(drivername, w[w.length-4]));
            }
     }
     r.close();
   }
    return mDrivers;
    }
二.创建SerialPort对象    android-serialport-api

       SeriaPort  :  获取串口的类

       SerialProtFinder:  获取硬件地址的类

      SeriaPort的构造函数

      public  SerialPort(File  device, int baudrate, int flags)

                     device :  串口要操作的文件对象(安卓指定new FileReader("/proc/tty/drivers")这个路径下,

                                     文件名包含serial字符的文件,用于通信时存取数据)

                    daudrate: 波特率(衡量传输速率的参数)

                    flags:   文件操作的标识

    int open(const  pathname,int flags ,);

                  pathname  :  指向欲打开的文件路径

                  flags :  文件打开方式 O_RDONLY 只读,O_WRONLY只写,O_RDWR以可读写方式打开文件

                  返回值:若所有欲核查的权限都通过了检查则返回0 值, 表示成功, 只要有一个权限被禁止则返回-1.

package android_serialport_api;import java.io.File;import java.io.FileDescriptor;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import android.util.Log;/** 1. 串口类 2. @author qiwenming 3.  */public class SerialPort {    private static final String TAG = "SerialPort";    /*     * Do not remove or rename the field mFd: it is used by native method close();     */    private FileDescriptor mFd;//文件描述    private FileInputStream mFileInputStream;    private FileOutputStream mFileOutputStream;    /**     *获得一个窗口      * @param device 设备     * @param baudrate 波特率     * @param flags 标志     * @throws SecurityException     * @throws IOException     */    public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException {        /* 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();            }        }        //打开设备,这里面调用jni 的open方法        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 FileInputStream getInputStream() {        return mFileInputStream;    }    public FileOutputStream getOutputStream() {        return mFileOutputStream;    }    //============== JNI=========================================    /**     * 打开串口设备的方法     * @param path 设备的绝对路径     * @param baudrate 波特率     * @param flags 标志     * @return     */    private native static FileDescriptor open(String path, int baudrate, int flags);    //关闭设备    public native void close();    //加载库文件    static {        System.loadLibrary("serial_port");    }}

三.通过输入输出流进行数据通信

        mSerialPort =  new SerialPort(new File(sPort), iBaudRate, 0);
        mOutputStream = mSerialPort.getOutputStream();
        mInputStream = mSerialPort.getInputStream();

        得到流对象后就是简单的流读取了,详情看源码