一,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);
}
分享到:
相关推荐
串口通信,也称为串行通信,是一种数据传输方式,通过串行线逐位传输数据。在Android设备上,通常使用USB转串口适配器或者集成在硬件中的UART(通用异步收发传输器)接口来实现串口通信。 此项目的核心功能包括数据...
串口通信,也称为串行通信,是指数据以串行方式按位发送和接收。在Android系统中,串口通信通常涉及到UART(通用异步收发传输器)接口,它允许设备间进行全双工通信。Android设备通常不直接支持串口API,但可以通过...
本文将深入探讨“android串口通讯demo”所涉及的关键知识点,并结合提供的压缩包文件`MySerialPort`,来解析Android串口通信的基本原理、实现步骤以及注意事项。 1. **Android串口基础**: Android系统对串口的...
为了克服这一难题,开发者们构建了各种Android串口开发框架,以便于应用程序能够方便地与外部硬件设备(如传感器、打印机等)通过串行接口进行数据交换。本文将深入探讨“Android串口开发框架”的核心概念、应用场景...
串口通讯,也称为串行通信,是计算机通信的一种常见方式,它通过串行数据传输线进行数据交换。在Android设备上,通常需要借助特定的库或API来实现串口操作,因为原生的Android SDK并不直接支持串口通讯。这里提到的...
本文将详细解析"Android串口通信Demo"的实现原理、关键步骤及注意事项,帮助开发者理解如何在Android应用中实现串口通信。 串口通信,也称为串行通信,是一种数据传输方式,通过串行数据线一次传输一个比特位。在...
一,android串口通信 串口通信采用一个第三方开源项目,实现串口数据收发。 1. 使用了http://code.google.com/p/android-serialport-api/的项目的serialport api和jni; 2. 支持4串口同时收发,有定时自动发送功能...
本文将详细讲解如何使用`android-serialport-api`库来实现Android串口通信,并通过`MySerialTest`这个示例代码进行解析。 首先,我们要了解Android系统对串口访问的限制。由于安全性和权限问题,Android原生并不...
串口通信,也称为串行通信,是一种数据传输方式,数据按位顺序发送或接收。在Android设备上,串口通常用于连接外部硬件设备,如Arduino、蓝牙模块或GSM模块等。由于Android系统基于Linux内核,因此它支持标准的串口...
"Android 串口开发demo"是一个实例,它展示了如何在Android应用中通过串行通信接口(Serial Port)发送命令到硬件设备,并接收其反馈。下面将详细阐述Android串口开发的相关知识点。 1. **Android权限管理**: 在...
总的来说,理解和运用大华计价秤串口通讯协议,需要熟悉串行通信的基本原理,掌握相关协议文档中的细节,并能够熟练使用SDK进行程序开发。这样的知识对于实现零售、物流等行业的自动化和信息化至关重要。通过有效的...
首先,要理解Android串口通信的基本原理。在Android系统中,串口通信通常通过Java的串口库如RXTX或Android的`android.hardware.usb` API来实现。在本文中,开发者可能使用了第三方库如`SerialPort`或者自定义实现了...
《Android串口通信实战教程——基于Android Studio的Demo解析》 在移动开发领域,尤其是在物联网应用中,Android设备与外部硬件设备的交互是常见的需求,其中串口通信扮演着重要的角色。本文将深入探讨如何在...
通过理解和实践这些知识点,开发者可以构建自己的Android串口通信解决方案,实现与外部设备的有效交互。在实际项目中,可能还需要考虑性能优化、多线程并发处理和兼容性等问题,以满足不同场景的需求。
在Android开发中,有时我们需要与外部硬件设备进行通信,例如Arduino、Raspberry Pi等,这时就需要用到串口通信技术。本文将详细讲解如何在Android Studio环境下实现串口通信,并提供一个名为`SerialPort_Test`的...
总结,开发一个Android串口测试工具,关键在于理解串口通信的基本原理,选用合适的第三方库,并设计符合用户操作习惯的界面,以及编写健壮的串口读写逻辑。通过这样的工具,开发者可以方便地测试和调试与Android设备...
通过理解和运用这个Android串口通信库源码,开发者可以在Android应用中轻松实现与外部设备的串口通信,极大地拓展了Android应用的功能范围。在实际项目中,可以根据需求进行二次开发和优化,以满足特定场景的需求。
下面我们将详细探讨Android串口通信的基本概念、实现步骤以及如何构建一个简单的串口通信DEMO。 **串口通信基本概念:** 串口通信是一种基于串行数据传输的方式,通常涉及两个或多个设备之间的通信。每个数据位按...