android 读取串口数据的服务,android串口

android 读取串口数据的服务,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         @Override
26         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     @Override
48     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     @Override
66     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, software
11  * 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 and
14  * 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 method
34      * 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 setters
73     public InputStream getInputStream() {
74         return mFileInputStream;
75     }
76 
77     public OutputStream getOutputStream() {
78         return mFileOutputStream;
79     }
80 
81     // JNI
82     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 }

你可能感兴趣的:(Android)