Android串口通信
使用Google的开源库android-serialport-api
一、搭建项目环境
-
在Main文件夹下创建 libs 与 jniLibs 文件夹,然后将库中对应的文件拷入
-
在 java 文件夹下创建 android_serialport_api (注意:因为用的谷歌原生so库,所以SerialPort类的包名一定要是android_serialport_api,如果想修改这个包名,就需要重新生成对应的so库)
-
然后在 build.gradle 中添加
sourceSets { main { jni.srcDirs = [] } }
二、数据通信
-
创建串口工具类:
public class SerialPortUtil { private static volatile SerialPortUtil serialPortUtil; private SerialPortUtil() { } public static SerialPortUtil getInstance() { if (serialPortUtil == null) { synchronized (SerialPortUtil.class) { if (serialPortUtil == null) { serialPortUtil = new SerialPortUtil(); } } } return serialPortUtil; } private SerialPort serialPort; private OutputStream outputStream; private InputStream inputStream; /** * 打开串口 */ public void openSerialPort() { try { /*设置打开的串口*/ final String portPath = "/dev/ttyS0"; /*设置波特率*/ final int baudRate = 115200; serialPort = new SerialPort(new File(portPath), baudRate, 0); outputStream = serialPort.getOutputStream(); inputStream = serialPort.getInputStream(); /*开启线程读取数据*/ new ReadThread().start(); } catch (IOException e) { e.printStackTrace(); } } /** * 读取数据的线程 */ private class ReadThread extends Thread { @Override public void run() { super.run(); while (!isInterrupted()) { int size; try { byte[] buffer = new byte[64]; if (inputStream == null) return; size = inputStream.read(buffer); if (size > 0) { if (dataReceiveListener != null) { dataReceiveListener.receiveData(buffer, size); } } } catch (IOException e) { e.printStackTrace(); return; } } } } /** * 关闭串口 */ public void closeSerialPort() { try { inputStream.close(); outputStream.close(); serialPort.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 发送数据到串口 * * @param data 需要发送的数据 */ public void sendDataToSerialPort(byte[] data) { try { int dataLength = data.length; if (dataLength > 0) { outputStream.write(data); outputStream.write('\n'); outputStream.flush(); } } catch (IOException e) { e.printStackTrace(); } } public interface DataReceiveListener { void receiveData(byte[] data, int size); } private DataReceiveListener dataReceiveListener; public void setOnDataReceiveListener(DataReceiveListener dataReceiveListener) { this.dataReceiveListener = dataReceiveListener; } }
-
创建串口信息获取类:
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 = null; 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) { // Issue 3: // Since driver name may contain spaces, we do not extract driver name with split() String drivername = l.substring(0, 0x15).trim(); String[] w = l.split(" +"); if ((w.length >= 5) && (w[w.length-1].equals("serial"))) { Log.d(TAG, "Found new driver " + drivername + " on " + w[w.length-4]); mDrivers.add(new Driver(drivername, w[w.length-4])); } } r.close(); } return mDrivers; } public String[] getAllDevices() { Vector<String> devices = new Vector<String>(); // Parse each driver Iterator<Driver> itdriv; try { itdriv = getDrivers().iterator(); while(itdriv.hasNext()) { Driver driver = itdriv.next(); Iterator<File> itdev = driver.getDevices().iterator(); while(itdev.hasNext()) { String device = itdev.next().getName(); String value = String.format("%s (%s)", device, driver.getName()); devices.add(value); } } } catch (IOException e) { e.printStackTrace(); } return devices.toArray(new String[devices.size()]); } public String[] getAllDevicesPath() { Vector<String> devices = new Vector<String>(); // Parse each driver Iterator<Driver> itdriv; try { itdriv = getDrivers().iterator(); while(itdriv.hasNext()) { Driver driver = itdriv.next(); Iterator<File> itdev = driver.getDevices().iterator(); while(itdev.hasNext()) { String device = itdev.next().getAbsolutePath(); devices.add(device); } } } catch (IOException e) { e.printStackTrace(); } return devices.toArray(new String[devices.size()]); } }
-
使用方法
SerialPortUtil.getInstance().openSerialPort(); SerialPortFinder finder = new SerialPortFinder(); String[] allDevices = finder.getAllDevices(); Log.e("LHG", Arrays.toString(allDevices)); SerialPortUtil.getInstance().setOnDataReceiveListener(new SerialPortUtil.DataReceiveListener() { @Override public void receiveData(byte[] data, int size) { } });
网友评论