Android 硬件设备串口通信

Android 硬件设备串口通信

前言

项目最近主要都是android设备通过串口与硬件模块通信,所以研究了如何通过串口收发命令。

so库

1.在android串口开发有个开源的项目:android-serialport-api。这个库在网上都能下载。所以在下载到这个库后我们首先新建项目,将库放入jniLibs文件夹中,如果没有这个文件夹就在main目录下新建文件夹。
jniLibs文件夹位置
so库
PS:可能会下载到版本比较低的so库,所以在api23以上会报错,不过将api指定在22以下也能使用,虽然也会报错,但也能使用。不过尽量还是使用高版本的。

2.有了so库还有相应的类来供我们调用。
串口java文件
注意 文件夹的名字:android_serialport_api,以及这两个文件的包路径:package android_serialport_api;
这两个地方不能修改,否则会报错无法调用方法或者无法找到方法,原因是so库编译的时候已经指定了相关包名和目录,如果修改了就找不到了。当然如果你自己修改so库也是可以的。

SerialPort和SerialPortFinder

SerialPort类中主要是 加载so库,获取串口权限,提供打开和关闭串口的方法。

public class SerialPort {
   
	
	static {
   
		System.loadLibrary("serial_port");  //加载SO库
	}
	
	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;

	//获取串口权限
	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();
			}
		}

		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 InputStream getInputStream() {
   
		return mFileInputStream;
	}

	public OutputStream getOutputStream() {
   
		return mFileOutputStream;
	}

	// JNI
	private native FileDescriptor open(String path, int baudrate, int flags);  //打开串口
	public native void close();   //关闭串口

}

而在SerialPortFinder类中,主要都是一些获取硬件串口路径的方法。

public class SerialPortFinder {
   

	public class Driver {
   
		public Driver(String name, String root) {
   
			mDriverName = name;
			mDeviceRoot = root;
		}
		private String mDriverName;
		private String mDeviceRoot;
		Vector<File> mDevices = null;
		public Vector<File> getDevices() {
   
			if (mDevices == null) {
   
				mDevices = new Vector<File>();
				File dev = new File("/dev");
				File[] files = dev.listFiles();
				int i;
				for (i=0; i<files.length; i++) {
   
					if (files[i].getAbsolutePath().startsWith(mDeviceRoot)) {
   
						Log.d(TAG, "Found new device: " + files[i]);
						mDevices.add(files[i]);
					}
				}
			}
			return mDevices;
		}
		public String getName() {
   
			return mDriverName;
		}
	}

	private static final String TAG = "SerialPort";

	private Vector<Driver> mDrivers 
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值