一,android串口通信
串口通信采用一个第三方开源项目,实现串口数据收发。
1. 使用了http://code.google.com/p/android-serialport-api/的项目的serialport api和jni;
2. 支持4串口同时收发,有定时自动发送功能,收发模式可选Txt或Hex模式;
3. n,8,1,没得选;
4. 为减轻界面卡顿的情况,接收区的刷新采用单独的线程进行定时刷新;
5. 发送区的数据以及一些设置项,在程序关闭时会自动保存,打开时自动载入;
6. jni使用最新的NDKr8b重新编译了一下
简单编写步骤:
1.新建一个项目,自己起个名字
2.直接复制serialport api和jni文件夹到新建的工程,如果不想自己编译jni,就连libs文件夹也一起复制
3.去android官方网站下载NDK,解压,在CMD中转到jni目录,并执行 绝对路径\ndk-build
4.自己再封装一个工具类或直接使用SerialPort类都行,举个直接使用的例:
直接剽窃原项目的SerialPortActivity.java,并稍微改一下,重点改这里
mSerialPort = mApplication.getSerialPort();
这里可以改成
new SerialPort(new File("/dev/s3c2410_serial0"), 9600, 0);//COM0,波特率9600
5. SerialPortFinder的使用就没什么好讲的了,实例化后用.getAllDevicesPath()就能获取到所有设备了。
其它如数据转换等请参考源码
源码可以参考谷歌android-serialport-api例子
http://code.google.com/p/android-serialport-api/source/checkout
svn checkout http://android-serialport-api.googlecode.com/svn/trunk
二,串口通信协议解析
1.通信基本格式
字段
描述
长度(字节)
起始符
0F,十六进制码
1
信息类型
一个字节,十六进制码(0F,F0,FF等保留码不用)
1
信息长度
是信息内容的长度,ASCII码表示(0~9,A~F,最大长度为256)(例如长为11个,十六进制是0B,则两个字节就写0x30 0x42)。
注:因为最大长度256不能满足有些指令的要求,所以对长度做了扩展,下面是扩展说明:
如果第一个字节的最高位为1,则表示扩展长度。在扩展长度状态下,其他15个字节通过16进制大端模式来保存长度。比如:0x80 0x12表示长度为0x001 2,0x81 0x12表示长度为0x0112。
2
信息内容
一组十六进制码
N
校验
一个字节,十六进制码,是自信息类型起至对象号止所有码的异或。
1
结束符
F0,一个字节,十六进制码 (为了保证可靠性,车机下发的结束符为F0 FF)
1
2.协议解析
/**
* 读取终端设备数据
* @author Administrator
*/
private class ReadThread extends Thread {
@Override
public void run() {
super.run();
// 定义一个包的最大长度
int maxLength = 2048;
byte[] buffer = new byte[maxLength];
// 每次收到实际长度
int available = 0;
// 当前已经收到包的总长度
int currentLength = 0;
// 协议头长度4个字节(开始符1,类型1,长度2)
int headerLength = 4;
while (!isInterrupted()) {
try {
available = mInputStream.available();
if (available > 0) {
// 防止超出数组最大长度导致溢出
if (available > maxLength - currentLength) {
available = maxLength - currentLength;
}
mInputStream.read(buffer, currentLength, available);
currentLength += available;
}
}
catch (Exception e) {
e.printStackTrace();
}
int cursor = 0;
// 如果当前收到包大于头的长度,则解析当前包
while (currentLength >= headerLength) {
// 取到头部第一个字节
if (buffer[cursor] != 0x0F) {
--currentLength;
++cursor;
continue;
}
int contentLenght = parseLen(buffer, cursor, headerLength);
// 如果内容包的长度大于最大内容长度或者小于等于0,则说明这个包有问题,丢弃
if (contentLenght <= 0 || contentLenght > maxLength - 5) {
currentLength = 0;
break;
}
// 如果当前获取到长度小于整个包的长度,则跳出循环等待继续接收数据
int factPackLen = contentLenght + 5;
if (currentLength < contentLenght + 5) {
break;
}
// 一个完整包即产生
// proceOnePacket(buffer,i,factPackLen);
onDataReceived(buffer, cursor, factPackLen);
currentLength -= factPackLen;
cursor += factPackLen;
}
// 残留字节移到缓冲区首
if (currentLength > 0 && cursor > 0) {
System.arraycopy(buffer, cursor, buffer, 0, currentLength);
}
}
}
}
/**
* 获取协议内容长度
* @param header
* @return
*/
public int parseLen(byte buffer[], int index, int headerLength) {
// if (buffer.length - index < headerLength) { return 0; }
byte a = buffer[index + 2];
byte b = buffer[index + 3];
int rlt = 0;
if (((a >> 7) & 0x1) == 0x1) {
rlt = (((a & 0x7f) << 8) | b);
}
else {
char[] tmp = new char[2];
tmp[0] = (char) a;
tmp[1] = (char) b;
String s = new String(tmp, 0, 2);
rlt = Integer.parseInt(s, 16);
}
return rlt;
}
protected void onDataReceived(final byte[] buffer, final int index, final int packlen) {
System.out.println("收到信息");
byte[] buf = new byte[packlen];
System.arraycopy(buffer, index, buf, 0, packlen);
ProtocolAnalyze.getInstance(myHandler).analyze(buf);
}
分享到:
相关推荐
安卓串口通讯源代码,实现了数据解析,1秒钟定时更新,用于疫情期间温度传感器读取体温,完整的android studio 3.6.1项目,可以直接编译使用
这是我当时在网上找资料是找到的代码合集,怕自己丢了,就打了个包传上来,就不要多了,就5分吧,里面有5个例程,附全部源码
主要介绍了Android 串口通信编程及串口协议分析的相关资料,这里对Android 串口通信进行详解,及简单实现步骤和协议进行分析,需要的朋友可以参考下
Android串口通信的标准格式代码,包含完整的数据发送解析,底层ndk的串口驱动
实现与蓝牙串口HC_05模块之间的通讯,解析接收到的数据并显示出来。主要功能:1、通过蓝牙串口实现控制小车 2、接收DHT11温湿度传感器、PM2.5传感器、MQ2烟雾传感器等数据,并且显示出来。
使用类接口封装的UART,带有完整的通讯协议解析方式,包括重发机制,timeout,可以在linux或是Android下编译程共享库使用,带有test demo
在双机通讯中,第九位一般是奇偶校验位。 可以发9位数据,8个数据为,第九位是校验位,校验位有4个状态可设置,基校验,偶校验,总为1,总为0。
主要介绍了Android Socket 线程连接openwrt与arduino单片机串口双向通信的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
PLC上位机之Android客户端,PLC 是smart200,Android作为Android上位机,控制PLC,采用串口通讯,Modbus rtu 通信协议,此文档是源码解析ppt
Android的蓝牙编程例子,基于SPP协议与蓝牙串口设备通信,本文程序作为客户端使用。 这里提供实例代码和详细解析实现方法,对开发Android蓝牙开发的朋友提供简单示例,有需要的朋友可以参考下
SerialPort迈冲科技串口库串口通信由上位机(Android 开发板)和下位机(硬件设备)联合制定一套协议。协议由 byte 数组构成,一般包括起始位、数据位、校验位和结束位,通过对数组数据的解析来达到通信目的。一、...
本人做了GPS相关的嵌入式软件已经几年了,所以说起要做个测试GPS定位模块的程序,第一反应就是串口读取GPS模块的数据,然后解析GPS的NMEA格式数据。NMEA是一种标准化数据格式,不仅仅GPS上应用了,其他一些工业通信...
安卓蓝牙4.0BLE通信,这是与智能体重秤通信的demo,同样适合其他设备,只需根据协议传值取值解析即可!
Android 4.3才开始支持BLE API,所以请各位客官把本文代码运行在蓝牙4.0和Android 4.3及其以上的系统,另外本文所用的BLE终端是一个蓝牙4.0的串口蓝牙模块。因为我的是4.2的机子所以测试的时候直接跳出解析包失败,...
它是一个在安卓上使用的modbus客户端程序,实现了基于RTU模式的TCP通讯和串口通讯,支持HR、AR、DO、DI寄存器和常用格式解析。
Android和单片机通信的时候 负数的问题,采用16位2个byte的长度来传输负数(单片机负数已补码的形式传输)1.解析读到的串口数据的负数 2 个byte 2.将负数转化为 2 个byte 发送给单片机
Android 4.3才开始支持BLE API,所以请各位客官把本文代码运行在蓝牙4.0和Android 4.3及其以上的系统,另外本文所用的BLE终端是一个蓝牙4.0的串口蓝牙模块。因为我的是4.2的机子所以测试的时候直接跳出解析包失败,...
概述 该项目是库的一个分支,该库从开始。 除了支持JUnit测试外,还对该库进行了大量的重构和代码修复...串行通信由JSerialComm处理,其中包括大多数平台的本机实现。 记录外观以适合您的应用程序记录框架 包括j2mod