android串口通信
来源:互联网 发布:异构数据库交互 编辑:程序博客网 时间:2024/06/06 00:15
最近又有项目要用到串口通信,想在网上找一个好用的串口调试工具他们的真难啊,95%的博客提供的demo都是个半成品,
核心代码有用,但demo不能用与调试用,给初学者带来很多不便,
主要有以下问题:
1没有选这串口文件地址的下拉框,
2也没有调节波特率的地方,
3没有定时发送数据测试的功能
4没有文本转16进制的功能(硬件数据传输一般用16进制)
下面是我在网找的demo,在修改后的例子源码
例子源码简单,这就不多介绍了
源码下载
个人理解通信流程
1.获取安卓设备硬件通信地址集合
2.创建SerialPort对象,SerialPort(通信地址, 波特率, int flags),获取文件输入输出流
3.通过输入输出流进行数据通信
硬件设备发送数据--->安卓系统--->数据被存储串口文件中(通信地址就是文件路径)--->通过SerialPort对象获取的流进行数据读取(一般定时读取检测硬件设备有没有发送数据过来)--->得到数据后进行逻辑处理--->通过SerialPort对象获取输出流写数据
一. 获取硬件通信地址
Vector<Driver> getDrivers() throws IOException {
if (mDrivers == null) {
mDrivers = new Vector<Driver>();
LineNumberReader r = new LineNumberReader(new FileReader("/proc/tty/drivers"));
String l;
while((l = r.readLine()) != null) {
String drivername = l.substring(0, 0x15).trim();
String[] w = l.split(" +");
if ((w.length >= 5) && (w[w.length-1].equals("serial"))) {
Log.d(TAG, "---串口设备=" + drivername + " on " + w[w.length-4]);
mDrivers.add(new Driver(drivername, w[w.length-4]));
}
}
r.close();
}
return mDrivers;
}
二.创建SerialPort对象 android-serialport-api
SeriaPort : 获取串口的类
SerialProtFinder: 获取硬件地址的类
SeriaPort的构造函数
public SerialPort(File device, int baudrate, int flags)
device : 串口要操作的文件对象(安卓指定new FileReader("/proc/tty/drivers")这个路径下,
文件名包含serial字符的文件,用于通信时存取数据)
daudrate: 波特率(衡量传输速率的参数)
flags: 文件操作的标识
int open(const pathname,int flags ,);
pathname : 指向欲打开的文件路径
flags : 文件打开方式 O_RDONLY 只读,O_WRONLY只写,O_RDWR以可读写方式打开文件
返回值:若所有欲核查的权限都通过了检查则返回0 值, 表示成功, 只要有一个权限被禁止则返回-1.
package android_serialport_api;import java.io.File;import java.io.FileDescriptor;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import android.util.Log;/** 1. 串口类 2. @author qiwenming 3. */public class SerialPort { private static final String TAG = "SerialPort"; /* * Do not remove or rename the field mFd: it is used by native method close(); */ private FileDescriptor mFd;//文件描述 private FileInputStream mFileInputStream; private FileOutputStream mFileOutputStream; /** *获得一个窗口 * @param device 设备 * @param baudrate 波特率 * @param flags 标志 * @throws SecurityException * @throws IOException */ public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException { /* Check access permission */ //检查权限 if (!device.canRead() || !device.canWrite()) { try { //如果丢失权限,就再获取权限 /* Missing read/write permission, trying to chmod the file */ Process su; su = Runtime.getRuntime().exec("/system/bin/su"); String cmd = "chmod 666 " + device.getAbsolutePath() + "\n" + "exit\n"; //写命令 su.getOutputStream().write(cmd.getBytes()); if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()) { throw new SecurityException(); } } catch (Exception e) { e.printStackTrace(); throw new SecurityException(); } } //打开设备,这里面调用jni 的open方法 mFd = open(device.getAbsolutePath(), baudrate, flags); if (mFd == null) { Log.e(TAG, "native open returns null"); throw new IOException(); } mFileInputStream = new FileInputStream(mFd); mFileOutputStream = new FileOutputStream(mFd); } // Getters and setters public FileInputStream getInputStream() { return mFileInputStream; } public FileOutputStream getOutputStream() { return mFileOutputStream; } //============== JNI========================================= /** * 打开串口设备的方法 * @param path 设备的绝对路径 * @param baudrate 波特率 * @param flags 标志 * @return */ private native static FileDescriptor open(String path, int baudrate, int flags); //关闭设备 public native void close(); //加载库文件 static { System.loadLibrary("serial_port"); }}
三.通过输入输出流进行数据通信
mSerialPort = new SerialPort(new File(sPort), iBaudRate, 0);
mOutputStream = mSerialPort.getOutputStream();
mInputStream = mSerialPort.getInputStream();
得到流对象后就是简单的流读取了,详情看源码
- Android串口通信:串口读写
- Android串口通信:串口读写
- Android串口通信
- Android Bluetooth 串口通信
- android串口通信
- android串口通信
- Android串口通信
- android串口通信
- android串口通信
- android串口通信
- android串口通信
- android串口通信
- android串口通信
- android串口通信
- 【Android】串口通信
- android串口通信实例
- Android串口通信访问
- Android数据通信--串口通信
- 程序员必备:用 ultraiso装系统
- 带时间的日历控件
- 关于引用
- 《深入理解java虚拟机》学习-第七章-虚拟机类加载机制
- vue router 记住页面位置
- android串口通信
- HDU
- 利用递归思想删除php数组中特定value的元素
- 关于Malloc和free
- android图片处理方法
- BZOJ1014: [JSOI2008]火星人prefix
- 关于自媒体平台运营分析
- CSS选择符权重、CSS Sprite技术和CSS hack
- display兼容写法