zoukankan      html  css  js  c++  java
  • 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() + "
    " + "exit
    ";
    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 }
     
  • 相关阅读:
    Thymeleaf标签使用
    mybatis映射和条件查询
    开发模型
    Sentinel降级服务
    Sentinel
    Nacos注册中心
    SpringCloudAlibaba简介
    Sleuth
    Stream消息驱动
    如何用JAVA爬取AJAX加载后的页面(利用phantomjs)【以天眼查为例】
  • 原文地址:https://www.cnblogs.com/slz-bky/p/5881312.html
Copyright © 2011-2022 走看看