显示串口列表这个操作还不涉及底层的东西,因为Android与Linux相似,有串口设备就会在/dev目录下生成一个文件,比如/dev/ttyS0之类的,在谷歌的ndroid-serialport-api项目中,有一个SerialPortFinder.java方法,这个方法是不涉及底层的,没有native方法,也不需要c和h文件,所以我觉得Android串口入门,应该先从这个文件开始了解。

一、准备工作

1、新建一个工程

2、选择Empty Activity程序

3、随便起个名字

4、然后将SerialPortFinder.java复制到你的目录下

这个文件可以在
https://github.com/cepr/android-serialport-api
下载,其中该文件在
android-serialport-api-master/android-serialport-api/project/src/android_serialport_api/SerialPortFinder.java

然后我们就可以使用了。

二、getAllDevicesPath()

2.1 函数说明

getAllDevicesPath()
它会返回一系列的串口名称给你,你只要拿一个字符串数组接住它就可以了

String[] devices=new SerialPortFinder().getAllDevicesPath();

之后你将devices中的字符串数组,用循环取出来,然后以TextView的方式显示出来也可以,你会发现一堆”/dev/ttyS0”,”/dev/ttyS1”之类的,这些就是串口路径,注意,Android和Linux相似,与Windows不相似,Android操作串口时操作路径,而Windows是串口名称“COMx”,示例如下:
Linux:SerialPort(“/dev/ttyS1”,9600,N,8,1)
Windows:SerialPort(“COM1”,9600,N,8,1)

这个方法的内容如下:

    public String[] getAllDevicesPath() {Log.d(TAG, "获取所有串口地址");Vector<String> devices = new Vector<>();try {// Parse each driverfor (Driver driver : getDrivers()) {for (File file : driver.getDevices()) {String device = file.getAbsolutePath();devices.add(device);}}} catch (IOException e) {e.printStackTrace();}return devices.toArray(new String[0]);}

2.2 函数详解

里面主要使用了SerialPortFinder.java中的

getDrivers()

以及
Driver类下的

getDevices()

这两个方法看起来很相似,实际上是有本质的区别,首先getDrivers()获取到的是Drivers(注意后缀s),而一个Drivers中包含多个driver,一个driver中包含多个device(File),使用driver.getDevices()可以获得Devices(注意后缀s),即多个device。

以各个变量的串口数量来排序如下:

Drivers>driver==Devices>device(1个)

getDrivers()操作的路径是

/proc/tty/drivers

而getDevices()操作的路径是

/dev

/dev下一个ttySX是一个串口device(File),那么多个device就是串口集合Devices,一个串口集合又以driver表示在/proc/tty/drivers中,getDrivers()就是获取串口集合driver的集合,所以不管是后面的getAllDevices()方法还是getAllDevicesPath()方法,都会用两个循环来取串口设备device(File)。

for (Driver driver : getDrivers()) {for (File file : driver.getDevices()) {……}}

2.3 使用ListView显示串口列表

为了方便我们选中某个就进去,然后操作它,我们还是把它放在ListView里。
我们写一个ListView用来显示串口列表
1、将原本的activity_main.xml内容修改如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/id_list"/></LinearLayout> 

2、然后在同目录下新建一个item.layout

内容如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"android:id="@+id/id_item_text"android:textSize="32sp"/></LinearLayout>

3、本来想用ListAdapter做适配器的,不过感觉里面太多方法用不上,还是BaseAdapter简单一点,实现如下:
MainActivity.java

package com.a;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final String[] devices=new SerialPortFinder().getAllDevicesPath();ListView listView=findViewById(R.id.id_list);BaseAdapter bA=new BaseAdapter() {@Overridepublic int getCount() {return devices.length;}@Overridepublic Object getItem(int position) {return devices[position];}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView==null)convertView=getLayoutInflater().inflate(R.layout.item_layout,null);TextView textView=convertView.findViewById(R.id.id_item_text);textView.setText(devices[position]);return convertView;}};listView.setAdapter(bA);}
}

4、效果如下:

补充:截图方式,点击左下角logcat,拉高,有一个照相机图标,点击即可。

三、getAllDevices()

函数getAllDevices()其实就是把device和driver结合起来,

deviceName (driverName)

将原来的getAllDevicesPath()函数改为getAllDevices()函数

final String[] devices=new SerialPortFinder().getAllDevices();

显示如下:

四、获取文件读写权限

如果用过串口设备的小伙伴知道,一些设备往往有多个串口,而有一些是不能被使用的,比如上面的GS,他们表现出来的状态就是不可读不可写,那么我们如何识别这种状态呢?

我们在onCreate的
final String[] devices=new SerialPortFinder().getAllDevicesPath();
后添加如下内容,对文件的可读可写进行判断

final List<String> data = new ArrayList<>();if (devices.length > 0) {for (String device : devices) {File file = new File(device);String path = file.getAbsolutePath();StringBuilder permission = new StringBuilder();permission.append("[");permission.append(file.canRead() ? " 可读" : "不可读");permission.append(file.canWrite() ? "  可写 " : " 不可写 ");permission.append(file.canExecute() ? "可执行" : "不可执行");permission.append("]");String msg = "(" + path + ")" + " 权限:" + permission;data.add(msg);}}

并将BaseAdapter中的TextView获取文本的方式修改如下:

textView.setText(data.get(position));

MainActivity.java完整代码

package com.a;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;import java.io.File;
import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final String[] devices=new SerialPortFinder().getAllDevicesPath();final List<String> data = new ArrayList<>();if (devices.length > 0) {for (String device : devices) {File file = new File(device);String path = file.getAbsolutePath();StringBuilder permission = new StringBuilder();permission.append("[");permission.append(file.canRead() ? " 可读" : "不可读");permission.append(file.canWrite() ? "  可写 " : " 不可写 ");permission.append(file.canExecute() ? "可执行" : "不可执行");permission.append("]");String msg = "(" + path + ")" + " 权限:" + permission;data.add(msg);}}ListView listView=findViewById(R.id.id_list);BaseAdapter bA=new BaseAdapter() {@Overridepublic int getCount() {return devices.length;}@Overridepublic Object getItem(int position) {return devices[position];}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView==null)convertView=getLayoutInflater().inflate(R.layout.item_layout,null);TextView textView=convertView.findViewById(R.id.id_item_text);textView.setText(data.get(position));return convertView;}};listView.setAdapter(bA);}
}

显示效果:

#technology/Android/SerialPort

【Android】SerialPortFinder学习笔记,显示串口列表相关推荐

  1. Android:日常学习笔记(8)———探究UI开发(2)

    Android:日常学习笔记(8)---探究UI开发(2) 对话框 说明: 对话框是提示用户作出决定或输入额外信息的小窗口. 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件. 提示 ...

  2. Android Studio --- [学习笔记]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手

    说明 源代码 在2.x里有TCP的三次挥手与四次握手,先对它进行简单的回答(百度).预计在下一篇里,会继续说明TCP 接上一篇: Android Studio - > [学习笔记]Button. ...

  3. 疯狂Android讲义 - 学习笔记(二)

    疯狂Android讲义 - 学习笔记(二) Android应用的用户界面编程 2.1 界面编程与视图(View)组件 Android应用的绝大部分UI组件放在android.widget.androi ...

  4. JavaWeb-综合案例(用户信息)-学习笔记01【列表查询】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...

  5. Android:日常学习笔记(8)———探究UI开发(5)

    Android:日常学习笔记(8)---探究UI开发(5) ListView控件的使用 ListView概述 A view that shows items in a vertically scrol ...

  6. Android动画学习笔记

    Android实战经验之图像处理及特效处理的集锦 https://www.oschina.net/question/231733_44154 Android动画学习笔记 3.0以前,android支持 ...

  7. Qt5学习笔记之串口助手四:增加16进制/ASCII切换、周期发送

    目录 1. 概述 2. 16进制/ASCII发送 2.1 功能实现 2.2 界面修改 3. 接收框显示发送内容 3.1 以16进制/ASCII显示 3.1.1 界面修改 3.1.2 功能实现 3.2 ...

  8. 安卓开发Android studio学习笔记12:读取解析XML(案例演示)

    Android studio学习笔记 第一步:配置Student.XML 第二步:配置activity_main.xml 第三步:配置student.xml 第四步:配置Student用户类 第五步: ...

  9. KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记3——串口Stdio实现

    KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记3--串口Stdio实现 一.介绍 任务目标 二.工程创建 三.软件设计 第一步,BSP构建 1, 添加前面的pll_config文件 2 ...

最新文章

  1. date(w) 输出后对应的周几不对的问题
  2. R语言版本查询以及line 1 of `undefined.cases': bad value of `47.25' for attribute `A2'的解决
  3. 如何自行查询SAP Spartacus Organization Unit List的取数逻辑
  4. 常用事务代码 sap_SAP_PS_事务代码
  5. docker启动odoo提示module没有安装_Ubuntu20.04通过docker安装微信
  6. vsCode 设置vue 保存自动格式化代码
  7. Docker系列一 ~docker的安装
  8. Linux操作系统基础解析之(四)——Linux基本命令剖析(2)
  9. 微型计算机 总结,微机室活动总结
  10. 【wpf】在win10系统上弹出toast和notification
  11. 限量!“Java 成长笔记” Spring Boot/Sentinel/Nacos 高并发
  12. 有关计算机编程论文,有关计算机程序的论文范文
  13. python解释器调用_Python3.x那些事儿:[2]如何调用解释器-百度经验
  14. linux编译命令io,Hadoop 用命令行编译URLCat
  15. linux界面安装mysql_linux安装mysql可视化界面
  16. 2020年第十届C/C++ B组第二场蓝桥杯省赛真题
  17. python 背单词_python实现艾宾浩斯背单词功能,实现自动提取单词、邮件发送,部署在阿里云服务器......
  18. background-color:transparent
  19. 电大计算机绘图本任务检测,(更新版)国家开放大学电大《计算机绘图》网考形考作业试题及答案-20210724215340.pdf-原创力文档...
  20. Oracle 12c之Oracle 12c与云计算

热门文章

  1. Flappy bird模式值得追捧么?
  2. 如何顺利通过 PMP 考试?
  3. OPPO发布旗舰电视、真无线降噪耳机,智美生活更近一步
  4. 怎么接收layui上传的文件_如何接收layui上传excel上传及php处理【】
  5. MP3落幕,未来的音乐格式在哪里?
  6. 地震灾后36天!!成都彭州市龙门山镇团山村的一头肥猪废墟存活36天续:获名朱坚强将在博物馆终老
  7. nas文件服务器web接口,nas配置web服务器
  8. 快消品企业为什么要上专业的费用管理系统
  9. Gym - 102569A
  10. PTAJava实验六