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 }
 
时间: 2024-11-07 12:56:37

android 读取串口数据的服务的相关文章

在VMware里的linux用minicom读取串口数据

在VMware里的linux装minicom读取串口数据: 软件环境:在win7上装VMwave,在VMware里装的Ubuntu,在Ubuntu 里装的串口工具minicom. 硬件:Z-Tek的usb转串口 (内部的IC:PL2303) 1,给电脑插上USB转串口的硬件,打开WMware,如果VMware检测到该硬件,则打开VMware时会出现对应的提示: 打开ubuntu后,同时在VMware软件的右下角也会有该设备的小图标,右键选择connect: 同时也要connect    Real

Android 读取 json 数据(遍历jsonarray和jsonboject)-FenGKun

Android 读取 json 数据(遍历jsonarray和jsonboject) public String getJson(){ String jsonString = "{\"FLAG\":\"flag\",\"MESSAGE\":\"SUCCESS\",\"name\":[{\"name\":\"jack\"},{\"name\"

Android 读取网络数据

通过HttpResponse  实现 首先在AndroidManifest中配置允许网络访问    <uses-permissionandroid:name="android.permission.INTERNET"/> 然后实现代码 示例代码如下 String url = "http://www.baidu.com"; HttpGet request = new HttpGet(url); try { HttpResponseresponse = ne

Qt监控Arduino开关状态(读取串口数据)

setup.ini配置文件内容 [General] #游戏所在主机IP GameIp1=192.168.1.151 GameIp2=192.168.1.152 GameIp3=192.168.1.153 GameIp4=192.168.1.154 GameIp5=192.168.1.155 GameIp6=192.168.1.156 GameIp7=192.168.1.157 GameIp8=192.168.1.158 #游戏中监听的UDP端口 GamePort=3000 #延迟发送指令时间(单

Android 读取后台数据并显示。模拟小区车辆管理系统

帮别人做的演示系统,只具有基本的增删查改功能. 核心是android端和后台通过http传输数据 后台是asp.net,数据库是ms sql 2008 android端 private void getData() { RequestParams params = new RequestParams(); params.put("action", "getlista"); params.put("chepai", etSearch.getText

一种非常巧妙的读取串口数据的方法--C#

读取不完就一直等待,读完了就立刻走,之前都是设置一个溢出时间,不管是不是早就读取完了都要在这等着,有一定的时间浪费. 注意,用之前要设置好SerialPort类的TimeOut属性:

Android读取JSON格式数据

Android读取JSON格式数据 1. 何为JSON? JSON,全称为JavaScript Object Notation,意为JavaScript对象表示法. JSON 是轻量级的文本数据交换格式 JSON 独立于语言 JSON 具有自我描写叙述性,更易理解 相比 XML 的不同之处: 没有结束标签 更短 读写的速度更快 使用数组 不使用保留字 JSON 使用 JavaScript 语法来描写叙述数据对象,可是 JSON 仍然独立于语言和平台.JSON 解析器和 JSON 库支持很多不同的

WEB页获取串口数据

最近做一个B/S的项目,需要读取电子秤的值,之前一直没做过,也没有经验,于是在网上找到很多  大致分两种 使用ActiveX控件,JS调用MSCOMM32.dll的串口控件对串口进行控制 使用C#语言的控件对串口进行控制,然后使用JS+AJAX与C#进行交互获得串口数据 详情见  使用JS获得串口数据 http://blog.csdn.net/xuing/article/details/6688306    但是小弟用这两种办法都获取到数据 串口配置如下: 1 serialPort1.PortN

asp.net 使用JS获得串口数据

使用JS获得串口数据 JavaScript语言通常是一种网页编程语言,比较适合前台的一些应用设计.对于本地设备和数据的操作有比较大的限制.由于项目的需要,我需要获得本机的串口数据并显示在web端.我们有很多中方法实现功能,在实际的操作过程中我测试两种方式获得数据.第一种方法是使用ActiveX控件,JS调用MSCOMM32.dll的串口控件对串口进行控制.第二种方法是使用C#语言的控件对串口进行控制,然后使用JS+AJAX与C#进行交互获得串口数据. 先说说两种方法各自的特点:方法一使用的是微软