[关闭]
@Awille 2018-11-26T15:35:41.000000Z 字数 2567 阅读 123

获得所有的串口路径

串口开发


串口设备基本参数

public class SerialPortDevice {
    /**
     * 串口映射地址
     */
    public String path;
    /**
     * 串口波特率
     */
    public int baudrate;
    /**
     * 0代表以只读方式读取
     */
    public int flag = 0;
}

关于第三个标志位,其代表的是读取串口数据的方式。之前在串口开发的文章中已经提过,在编写c++串口读写的时候,其默认读写方式是 0_WRRD | flag, 0_WRRD代表是可读写,我们一般使用flag标志位置零,0表示只读,当以可读写方式读取失败的时候,尝试只读的方式读取。在c++的open函数中,可以用 | 传参表示并行读取。

串口路径存储文件

串口路径的存储文件为 /proc/tty/drivers
我们用adb shell ,c进入设备的文件系统,cat查看drivers文件的内容:

2|T2lite-HM:/proc/tty $ cat drivers
/dev/tty             /dev/tty        5       0 system:/dev/tty
/dev/console         /dev/console    5       1 system:console
/dev/ptmx            /dev/ptmx       5       2 system
rfcomm               /dev/rfcomm   216 0-255 serial
g_serial             /dev/ttyGS    236 0-3 serial
usbserial            /dev/ttyUSER  188 0-511 serial
acm                  /dev/ttyACM   166 0-31 serial
smd_tty_driver       /dev/smd      245 0-36 serial
msm_serial_hsl       /dev/ttyHSL   246 0-3 serial
msm_serial_hs        /dev/ttyHS    247 0-255 serial
pty_slave            /dev/pts      136 0-1048575 pty:slave
pty_master           /dev/ptm      128 0-1048575 pty:master

每一行代表的是所有的设备信息,而最后一个字符串为 serial的为串口设备,每一行的第二个字符串为设备的具体地址。第一个字符串为设备名字。
我们把串口设备的名字具体路径都给存储下来。
设备信息记录类:

public class Driver {
    Vector<File> mDevices = null;
    private String mDriverName;
    private String mDeviceRoot;
    //方法略 ... 
}

获取设备:

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, "Found new driver " + drivername + " on " + w[w.length - 4]);
                mDrivers.add(new Driver(drivername, w[w.length - 4]));
            }
        }
        r.close();
    }
    return mDrivers;
}

读取串口设备的绝对路径

在android6.0 以上的系统,是无法直接访问/dev文件夹的。

T2lite-HM:/ $ cd /dev
    T2lite-HM:/dev $ ls
ls: .: Permission denied

但是你是可以读取部分路径的,猜测应该是/dev路径之下某些文件是开放权限的,但是某些文件是不开放的,adb shell 进入设备文件系统无法直接访问所有的/dev文件下的路径,但是以代码的方式是可以读出部分文件的。
下面这个函数是Driver类的一个方法,是获得/dev路径下,开头符合deviceroot的全部文件。

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;
}

下面可以遍历全部的串口设备(getDrivers()函数获得)下的全部文件(Driver类内部方法getDevices()获得),将文件的绝对路径存储下来:

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()]);
}

通过以上方法可以获得所有的串口绝对路径。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注