你的位置:首页 > 操作系统

[操作系统]android 读取串口数据的服务


2016-09-1813:10:03

继承Service,定义抽象方法onDataReceived,子类通过实现抽象方法获取接收到数据的回调。

 1 package com.zrsoft.liftad.serialport; 2  3 import java.io.File; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.OutputStream; 7  8 import android.app.Service; 9 import android_serialport_api.SerialPort;10 11 import com.zrsoft.liftad.MyApp;12 import com.zrsoft.liftad.utils.Logger;13 14 public abstract class SerialPortService extends Service {15 17   protected SerialPort mSerialPort;18   protected OutputStream mOutputStream;19   private InputStream mInputStream;20   private ReadThread mReadThread;21 22   private class ReadThread extends Thread {23     byte[] buffer = new byte[128];24 25     @Override26     public void run() {27       super.run();28       while (!isInterrupted()) {29         int size;30         try {31 32           if (mInputStream == null)33             return;34           size = mInputStream.read(buffer);35           if (size > 0) {36             onDataReceived(buffer, size); 38           }39         } catch (IOException e) {40           e.printStackTrace();41           return;42         }43       }44     }45   }46 47   @Override48   public void onCreate() { 50     try { 52       mSerialPort = new SerialPort(new File("/dev/ttyS3"), 9600, 0);53       mOutputStream = mSerialPort.getOutputStream();54       mInputStream = mSerialPort.getInputStream();55 56       mReadThread = new ReadThread();57       mReadThread.start();58     } catch (Exception e) {59       e.printStackTrace();60     }61   }62 63   protected abstract void onDataReceived(final byte[] buffer, final int size);64 65   @Override66   public void onDestroy() {67     if (mReadThread != null){68       mReadThread.interrupt();69     }70     if (mSerialPort != null) {71       mSerialPort.close();72       mSerialPort = null;73     } 75     mSerialPort = null;76     super.onDestroy();77   }78 }

SerialPort 类:
 1 /* 2  * Copyright 2009 Cedric Priscal 3  *  4  * Licensed under the Apache License, Version 2.0 (the "License"); 5  * you may not use this file except in compliance with the License. 6  * You may obtain a copy of the License at 7  *  8  * http://www.apache.org/licenses/LICENSE-2.0 9  * 10  * Unless required by applicable law or agreed to in writing, software11  * distributed under the License is distributed on an "AS IS" BASIS,12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.13  * See the License for the specific language governing permissions and14  * limitations under the License. 15 */16 17 package android_serialport_api;18 19 import java.io.File;20 import java.io.FileDescriptor;21 import java.io.FileInputStream;22 import java.io.FileOutputStream;23 import java.io.IOException;24 import java.io.InputStream;25 import java.io.OutputStream;26 27 import android.util.Log;28 29 public class SerialPort {30   private static final String TAG = "SerialPort";31 32   /*33    * Do not remove or rename the field mFd: it is used by native method34    * close();35   */36   private FileDescriptor mFd;37   private FileInputStream mFileInputStream;38   private FileOutputStream mFileOutputStream;39 40   public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException {41     try {42       System.loadLibrary("serial_port");43     } catch (Exception ex) {44       Log.d("asdf", ex.getMessage());45     }46     /* Check access permission */47     if (!device.canRead() || !device.canWrite()) {48       try {49         /* Missing read/write permission, trying to chmod the file */50         Process su;51         su = Runtime.getRuntime().exec("/system/bin/su");52         String cmd = "chmod 666 " + device.getAbsolutePath() + "\n" + "exit\n";53         su.getOutputStream().write(cmd.getBytes());54         if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()) {55           throw new SecurityException();56         }57       } catch (Exception e) {58         e.printStackTrace();59         throw new SecurityException();60       }61     }62     Log.d("port", "open ready");63     mFd = open(device.getAbsolutePath(), baudrate, flags);64     if (mFd == null) {65       Log.e(TAG, "native open returns null");66       throw new IOException();67     }68     mFileInputStream = new FileInputStream(mFd);69     mFileOutputStream = new FileOutputStream(mFd);70   }71 72   // Getters and setters73   public InputStream getInputStream() {74     return mFileInputStream;75   }76 77   public OutputStream getOutputStream() {78     return mFileOutputStream;79   }80 81   // JNI82   private native static FileDescriptor open(String path, int baudrate, int flags);83 84   public native void close();85 86   static {87     System.loadLibrary("serial_port");88   }89 }