当开始接触到传感器的时候,觉得一切都是未知的。就拿温度传感器来说,当时我在想:我怎么就通过Android板读取到当前的温度呢?我又该怎么做呢,我该怎么下手呢?于是我先上网搜了下,然后我疯狂的和传感器厂家进行交流,哈哈哈感觉人家技术支持已经烦我了。接下来,我们言归正传。

一、在什么场景下使用

一般可以通过Android板与硬件进行联动,比如温湿度的监测、蓄电池的电能、噪音监测、智能电表的相关参数、体温检测仪、血压检测仪等等,只要你能想到的,一般都能与Android板通信。当然了,前提是必须他这个硬件要支持数据的传输啦,哈哈哈。

二、常见的数据传递
我们常见的数据传递有蓝牙、串口、网口等等。而我要记录的就是网口、串口的通讯。

1、串口

  • 串口是串行接口(serialport)的简称,也称为串行通信接口或COM接口。
  • 串口通信是指采用串行通信协议(serial communication)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。
  • 常见的串口有,RS232,RS485等等,这是根据电气标准来分的,具体为什么这么分我也不知道。

这里我就简单的介绍了什么是串口,串口用的模式大多数都是FIFO(先进先出)的数据结构。
如下图所示,是常见的设备间串口通讯结构图。每个设备都有一个DB9接口,通过DB9接口连接RS-232标准的串口线进行数据传输。由于通过RS-232标准传输的电平信号到达设备后,不能直接被识别,所以会通过电平转换芯片转换成能识别的TTL电平信号,实现通讯。

相互通讯的两个设备间,一个设备发送数据,一个设备接收数据。一般情况下,发送数据的设备称为DTE,如计算机;接收数据的设备称为DCE,如调制解调器。

在写java代码之前,我们还得知道一个概念,就是波特率
波特率:在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率。比特率:9600bps,意思就是每秒中传输9600bit。

就拿我做的一个需求来说,就是对接智能电池的信息。大致流程就是,我通过串口去读取电池的信息,然后将读取到的数据解析。

因为要每隔一段时间读一次数据,所以我写了一个service,就命名为BatService好了,在onCreate()中进行串口的初始化工作。

a、首先就是先初始化串口,指定哪个串口,和使用的波特率大小。
b、接下来就是创建两个线程,一个用于读,一个用于写。所以我写了ReadBatThreadWriteBatThread,我这里为了简易说下流程,线程安全方面没有进行管理。初始化的时候读线程初始化就是getInputStream(),写线程初始化就是getOutputStream(),对inputstream和outputstream有不清楚的可以去看我之前有一篇文章提到过。
InputStream和OutputStream的用法

    @Overridepublic void onCreate() {super.onCreate();try {SerialPort mbatSerialPort = new SerialPort(new File("/dev/ttyS0"), 19200, 0);ReadBatThread readBatThread = new ReadBatThread(mbatSerialPort.getInputStream());readBatThread.start();WriteBatThread writeBatThread = new WriteBatThread(mbatSerialPort.getOutputStream());writeBatThread.start();} catch (IOException e) {e.printStackTrace();}}

c、接来下就是写具体的读写线程了
先看写线程,一般写线程就是我们给所需要的读取信息的设备(我这里就是电池)发送一条指令。像我要读取电池的信息,我这里就根据定义的协议,发送一个读指令,一般为16进制数。而与设备之间传递的一般是字节流,我们发送的时候将十六进制字符串转成字节数组就可以了。

private class WriteBatThread extends Thread {private OutputStream mOus;public WriteBatThread(OutputStream ous) {if (ous == null) {throw new NullPointerException("流异常");}mOus = ous;}@Overridepublic void run() {super.run();while (!this.isInterrupted()) {if (mOus != null) {try {//这里就是给设备发送读指令,readHex就是十六进制指令字符串mOus.write(Transform.HexString2Bytes(readHex));Thread.sleep(5000);} catch (IOException | InterruptedException | NoSuchElementException pE) {Log.e(TAG, pE.toString());}}}IOUtils.close(mOus);}}

下面是16进制字符串转换成字节数组的方法,你可以把它自己的工具类中。注意在进行写的时候,要把IO进行关闭。

 // 把16进制字符串转换成字节数组public static byte[] HexString2Bytes(String hexStr) {byte[] b = new byte[hexStr.length() / 2];for (int i = 0; i < b.length; i++) {b[i] = (byte) Integer.parseInt(hexStr.substring(2 * i, 2 * i + 2), 16);}return b;}

这时候你已经给设备发送了你想要读取他电池信息的指令了,接下来是不是他就要给你返回电池信息了,所以就要写一个读线程。

 class ReadBatThread extends Thread {InputStream ins;public ReadBatThread(InputStream pInputStream) {if (pInputStream == null) {throw new NullPointerException("流异常");}ins = pInputStream;}@Overridepublic void run() {super.run();int count = -1;byte[] buf = new byte[500];byte[] temp;String data;ArrayList<Integer> procotol;while (!interrupted()) {try {if ((count = ins.read(buf)) != -1) {temp = new byte[count];System.arraycopy(buf, 0, temp, 0, count);data = Transform.bytesToHexString(temp);procotol = new ArrayList<>((data.length()) / 2);String item;int element;for (int i = 0; i < (data.length()) / 2; i++) {item = data.substring(i * 2, i * 2 + 2);element = Integer.parseInt(item, 16);procotol.add(element);}//上面的操作是为了把byte转成hexString,便于观察,在这个协议中,最终又转换为了10进制数进行处理//接下来就是根据指定的协议进行解析了,哪几位代表的是什么,怎么计算。举个例子,比如地址码是一个byte,你就可以用procotol.get(0),得到地址码的十进制数。}} catch (IOException pE) {}}IOUtils.close(ins);}}

同样的不要忘记关流,下面是将字节数组转换成16进制字符串的方法。

 // 把字节数组转换成16进制字符串public static String bytesToHexString(byte[] byteArray) {StringBuffer hexStr = new StringBuffer(byteArray.length * 2);for (int i = 0; i < byteArray.length; i++) {String sTemp = Integer.toHexString(0xFF & byteArray[i]);int j = 0;while (j < 2 - sTemp.length()) {sTemp = "0" + sTemp;j++;}hexStr.append(sTemp.toUpperCase());}return hexStr.toString();}

上面就是串口的读取方式了,这样就可以使android板与外设进行通讯数据传递了。

2、网口
其实网口通讯的原理和串口通讯差不多,只是他们初始化的时候不一样,后面数据的读取可以说是一模一样。就是要让外设与你的android程序在同一个局域网内就可以进行通讯了,主要用到的就是socket。初始化的时候用socket对象的getOutputStream()和getInputStream()方法就可以了。

     String host = "1.1.1.1";//网络ip地址int port = 9999;//端口号Socket mSocket = new Socket(host, port);mSocket.getOutputStream();mSocket.getInputStream();

其实socket这个知识点可以去深入的了解一下,我这里就不说了,哈哈哈哈~~~
这样就串口和网口与外设信息交互的流程大致就到这里啦,如果有什么错误或不足的地方请各位大佬指出来哦,嘻嘻!!!

android——串口、网口与外设进行数据交互相关推荐

  1. 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互

    基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互 一.前言 1.Java服务端程序代码的项目名为TcpSocketServerOfJava,包名为com.exam ...

  2. Android客户端与后台服务器的数据交互

    Android客户端与服务器的数据交互 这是今年7月份时在一家公司实训时自己做的一个小项目,仅仅是一个简单的模拟Android客户端与服务器的数据交互,中间会有串口通信,以及利用JDBC连接Mysql ...

  3. Android开发之Service与Activity数据交互(源代码分享)

    Service想要与Activity进行数据交互,首先Activity先得绑定Service.bound service是service 的实现,它允许其他应用程序绑定到它并与之交互.要提供bound ...

  4. Android 客户端与服务端的数据交互问题

    Android客户端是如何与服务端的数据进行交互的呢? 一般就是客户端向服务端发送请求,服务端对数据进行相关处理,返回json数据返回给客户端,客户端再进行相关操作. 说明:主要是用登录功能来进行详解 ...

  5. matlab串口陀螺仪,matlab通过串口接收ARM7外设陀螺仪数据并绘图有困难急求解答...

    我用STM32的板子接了个陀螺仪,想用matlab画个图看看数据,但是从网上扒了个代码不好用,,,,串口应该是连上了,就是数据送不到matlab里,也不报错,就是显示不出来,哪位大神帮忙看看问题在哪啊 ...

  6. android-async-http框架之与服务器进行数据交互

    一 服务器准备: 本文使用Tomcat 6做服务器. 本文搭建服务器端使用MyEclipse 10. 首先准备好Tomcat 6与MyEclipse 10,并且将服务器配置到MyEclipse中,对于 ...

  7. Android开发之Fragment与Activity的数据交互通过回调机制实现(源代码分享)

    上一篇文章简单介绍了Android的回调机制的使用,这一篇博文将重点介绍Fragment碎片与activity的数据交互,fragment在Android开发中起着至关重要的作用,通过官方Androi ...

  8. 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!...

    今天讲下在Surfaceview中如何实现两个或者多个Activity之间的切换与数据交互,为了更形象一些我做了一个游戏登录界面的demo,其中对于输入界面的布局这些我也是随意写了下,主要是实现功能并 ...

  9. (转载)Android项目实战(二十七):数据交互(信息编辑)填写总结

    Android项目实战(二十七):数据交互(信息编辑)填写总结 前言: 项目中必定用到的数据填写需求.比如修改用户名的文字编辑对话框,修改生日的日期选择对话框等等.现总结一下,方便以后使用. 注: 先 ...

最新文章

  1. iOS支付宝(Alipay)接入详细流程,比微信支付更简单,项目实战中的问题分析
  2. HDU - 3974 Assign the task (DFS建树+区间覆盖+单点查询)
  3. oozie案例——自定义MapReduce workflow
  4. 关于zendframework中的Zend_Db_Expr(不自动加引号)
  5. no awt in java.libary.path
  6. C++ Primer 5th笔记(chap 15 OOP)访问控制与继承
  7. 汇编层探索与讨论c++引用
  8. 141. Linked List Cycle 环形链表
  9. variable not availabe in Chrome debugger
  10. 机器学习模型部署_9月版部署机器学习模型
  11. Laravel核心解读--ENV的加载和读取
  12. 大屏设计-大数据综合展示可视化平台
  13. UNIX网络编程:unpv13e编译错误:net/if_dl.h:没有那个文件或目录
  14. 零基础自学python-零基础如何自学python?
  15. UGUI源码之绘制初探
  16. HDU1527——取石子游戏(威佐夫博弈)
  17. Linux 内核md5sum使用,linux命令详解:md5sum命令(示例代码)
  18. git remote: error: hook declined to update
  19. U盘启动BIOS设置
  20. 网站漏洞修复之metinfo SQL注入漏洞

热门文章

  1. 导数的应用如何运用计算机教学,如何运用多媒体数学教学
  2. 855 Plus+四摄+90Hz流体屏,这款新旗舰给力不贵
  3. Java基础课程设计-模拟ATM银行管理系统《控制台版本》
  4. Ubuntu环境安装redash
  5. 什么是按位或|,什么是按位与,什么是按位异或^ (双目运算符)
  6. 追逐算法之--牛鞭的子弹是怎样练成的(2)--简单追逐
  7. lambda演算解释器java,λ演算(Lambda Calculus)入门基础(二):丘奇编码(Church Encoding)...
  8. 「艺蜂酒店管理系统」 · Java Swing + mysql 开发 学生毕业设计项目
  9. 追女生不需要花费太多,只要掌握这五个技巧
  10. 简易模型计算机设计仿真,体视学虚拟实验模型的计算机仿真设计与实现