Android使用线程池实现多串口同时通讯

在Android中,串口通信是一种与外部设备进行数据交换的常见方式,是一种用于将数据按位传输的通信接口,它可以连接各种外部设备,如传感器、显示器、打印机等.
串口主要作用:

  1. 数据传输:串口提供了一种可靠的、逐位地传输数据的方式。通过串口,计算机可以与其他设备进行数据的交互,实现信息的传输和控制。
  2. 远程控制:串口可以用于远程操作和控制外部设备。例如,通过串口连接到调制解调器,可以实现计算机与远程网络之间的通信。
  3. 接口扩展:串口可以扩展计算机的功能,允许连接各种外部设备,如打印机、扫描仪、传感器等,从而实现更多的功能和应用。
  4. 调试和通信:串口常用于调试和通信过程中的数据传输。开发人员可以通过串口与外部设备进行交互,进行调试和故障排除。

话不多说直接上代码

一、在build.gradle中添加依赖

//串口调试
implementation 'com.github.licheedev:Android-SerialPort-API:2.0.0'

二、添加串口管理类

创建了一个线程池来管理所有线程,使用ConcurrentHashMap来保证线程队列安全。

/**
 * 串口管理类
 */
public class SerialManager {
   

    private ScheduledExecutorService scheduledExecutor;//线程池 同一管理保证只有一个

    //Map 中的键表示串口地址,值为对应的 SerialHandle 对象和队列
    private Map<String, SerialHandle> serialHandleMap = new ConcurrentHashMap<>();//串口连接 发送 读取处理对象

    //不同队列处理不同串口之间的数据流,避免数据收发冲突
    private Map<String, Queue<String>> queueMsgMap = new ConcurrentHashMap<>();//线程安全到队列
    private Map<String, ScheduledFuture> sendStrTaskMap = new ConcurrentHashMap<>();//循环发送任务
    private Map<String, Boolean> isConnectMap = new ConcurrentHashMap<>();//串口是否连接

    //打开的串口
    private List<String> serialPortList = new LinkedList<>();

    private SerialManager() {
   
        scheduledExecutor = Executors.newScheduledThreadPool(8);//初始化8个线程
    }

    private static final class InstanceHolder {
   
        static final SerialManager instance = new SerialManager();
    }

    public static SerialManager getInstance() {
   
        return InstanceHolder.instance;
    }

    /**
     * 获取线程池
     *
     * @return
     */
    public ScheduledExecutorService getScheduledExecutor() {
   
        return scheduledExecutor;
    }

    /**
     * 串口初始化
     */
    public void init() {
   
        if (serialHandleMap.isEmpty()) {
   
            //串口初始化成功,开始遍历队列中是否有消息发送
            startSendTask();
        }
    }

    /**
     * 打开串口
     */
    public void open(String devicePath, int baudRate, boolean isRead, SerialListener serialListener) {
   
        //设置地址,波特率,开启读取串口数据
        SerialHandle serialHandle = new SerialHandle();
        //添加监听回调
        serialHandle.addSerialListener(serialListener);
        //判断是否打开成功
        if (serialHandle.open(devicePath, baudRate, isRead)) {
   
            //将串口路径跟回调绑定
            serialHandleMap.put(devicePath, serialHandle);
            //创建消息队列
            q
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值