@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()]);
}
通过以上方法可以获得所有的串口绝对路径。