基于Android 的串口工具类

2023-05-16

欢迎使用串口通讯, 首先说明下我这里使用的是RS485通讯,采用的是半双工通讯, 所以收和发不能同时操作需要发送等待一段时间来接收完数据在发送其他指令了, 这里顺便在说下RS232, 它采用的是全双工通讯, 可以同时收发,但是只能一对一, 不像RS485可以串联同时最大128个收发器。好了,废话不多说,代码整起。

初始化操作

    private InputStream inputStream = null;
    private OutputStream outputStream = null;
    //串口连接状态
    private boolean serialState = false;
    private String PORT;
    private int BANDAGE;
    //处理接收串口数据的线程池
    private ExecutorService fixedThreadPool;
    //接收串口的接口回调
    private OnRequireSerialData listen;
    //判断是那个串口
    private String type = motorType;

    public void setOnRequireSerialData(OnRequireSerialData onRequireSerialData) {
        this.listen = onRequireSerialData;
    }

    //0、电机 1、电源
    public static String motorType = "motorType";
    public static String powerType = "powerType";


    //初始化操作
    public SerialPortUtils(String PORT, int BANDAGE,  String type) {
        this.PORT = PORT;
        this.BANDAGE = BANDAGE;
        this.type = type;
        fixedThreadPool = Executors.newFixedThreadPool(4);
    }

打开串口

    public void openSerialPort(){
        new Thread(){
            @Override
            public void run() {
                super.run();
                try {
                    if(!serialState){
                        SerialPort s = new SerialPort(new File(PORT), BANDAGE);
                        writeServiceLogsAndShowToast("串口打开成功:  " + type);
                        inputStream = s.getInputStream();
                        outputStream = s.getOutputStream();
                        serialState = true;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

关闭串口

public void closeSerialPort(){
        try {
            if(serialState){
                if(inputStream != null) {
                    inputStream.close();
                }
                if(outputStream != null){
                    outputStream.close();
                }
                serialState = false;
                writeServiceLogsAndShowToast("关闭串口:  " + type);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

发送串口数据(防止发送指令太频繁, 这个有个等待时间)

private long beforeSendDate = 0;
    public void sendSerialPort(final byte[] sendData){
        try {
            if(serialState){
                long d = System.currentTimeMillis();
                if(d - beforeSendDate > sendSerialInterval){
                    beforeSendDate = d;
                    outputStream.write(sendData);
                    outputStream.flush();
                    LoggerUtils.showLog(getClass(), getPortTypeString(serialType) + "串口数据发送成功");
                    fixedThreadPool.execute(receiveRunnable);
                }else{
                    writeServiceLogsAndShowToast("指令发送太频繁了:  " + type);
                }
            }else{
                writeServiceLogsAndShowToast("请先打开串口:  " + type);
            }
        } catch (IOException e) {
            e.printStackTrace();
            writeServiceLogsAndShowToast("串口数据发送失败:  " + type);
        }
    }

读取接收字节

 private byte[] readFromPort() {
        byte[] b = null;
        try {
            int buffets = inputStream.available();
            while (buffets != 0) {
                b = new byte[buffets];
                inputStream.read(b);
                buffets = inputStream.available();
            }
        } catch (IOException e) {
            e.fillInStackTrace();
        }
        return b;
    }

处理接收数据(这里接收数据有三种情况, 一种是没数据返回, 一种有数据返回但是校验不对, 一种是正确的)(这里接收串口的数据也需要等待一段时间大概在200ms左右, 应为是RS485串口, 所以需要等待一下)

public final static long receiveDataDate = 300;
    private Runnable receiveRunnable = new Runnable() {
        public void run() {
            try {
                Thread.sleep(receiveDataDate);
                byte[] b = readFromPort();
                if(b != null){
                    MotorData f = getMotorData(b);
                    if(f != null){
                        if(listen != null){
                            listen.getSerialData(f);
                        }
                    }else{
                        if(listen != null){
                            listen.getSerialError(parsingErrorCode);
                        }
                    }
                }else{
                    if(listen != null){
                        listen.getSerialError(noDataErrorCode);
                    }
                }
            } catch (InterruptedException ex) {
                ex.fillInStackTrace();
            }
        }
    };

使用串口工具

        int carBandage = 19200;
        String carPort = "/dev/ttyS7";
        carSerialUtl = new SerialPortUtils(carPort, carBandage, motorType);
        carSerialUtl.openSerialPort();
        carSerialUtl.setOnRequireSerialData(new OnRequireSerialData() {
            @Override
            public void getSerialData(MotorData motorData) { 
                  LoggerUtils.showLog(getBaseServiceContext(), "motorError:  " + code);          
             }

            @Override
            public void getSerialError(int code) {
                LoggerUtils.showLog(getBaseServiceContext(), "motorError:  " + code);    
            }
        });```

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Android 的串口工具类 的相关文章

随机推荐

  • UCOSIII的基础知识讲解

    功能 帮助初学者初识UCOSIII掌握UCOSIII的基本知识 xff0c 具体包括任务的创建与删除 任务的挂起与恢复 软件定时器 信号量和互斥信号量 消息的传递等 一 简介 C OS II由Micrium公司提供 xff0c 是一个可移植
  • J-001 Jetson硬件电路设计概论--NANO & XAVIER NX

    Jetson硬件设计概论 1 Jetson板卡简介2 Jetson产品组合3 模组对比4 电路分析4 1 电源设计4 1 1 原理图设计4 1 2 引脚描述4 1 3 电源框图4 1 4 上电时序 4 2 USB设计4 2 1 USB 2
  • J-002 Jetson电路设计之电源设计--NANO && XAVIER NX

    Jetson电源设计 1 电源说明1 1 电源和系统引脚描述1 2 电源控制框图详情 2 上电的时许2 1 框图分析2 2 上电时序 3 GND引脚 1 电源说明 Jetson NANO和XAVIER NX核心板的电源为DC 5V 1 1
  • J-004 Jetson电路设计之HDMI设计--NANO && XAVIER NX

    HDMI电路设计 1 简介2 框图介绍3 原理图介绍 1 简介 NANO amp XAVIER NX提供一路HDMI接口 xff0c DP接口与HDMI是兼容的 xff0c 可用于扩展一路HDMI 其中引脚说明 PIN名称描述方向类型63H
  • 树莓派入坑第一天——系统烧录以及SSH登录问题

    1 首先下载镜像https www raspberrypi org downloads xff0c Raspbian系统是树莓派官方推荐的系统 xff0c 解压出img镜像文件 注意树莓派3B可能不支持老版本镜像 2 下载一个格式化SD卡的
  • c++学习之路

    3 19 内存分区模型 内存四区意义 不同区域存放的数据 xff0c 赋予不同的生命周期 给我们更大的灵活编程 程序exe 运行前分为 代码区和全局区 xff1b 运行后分为 栈区和堆区 1 代码区 存放CPU执行的机器指令 存放函数体的二
  • 写程序的步骤

    xff08 1 xff09 xff1a 一 要把实际问题提取为数学问题 相当于数学中的建模 抽象问题具体化 二 把其分解为若干个小的函数 并明白每个小函数怎样实现其功能 同时注意功能函数与主函数间的数据交互问题 三 作出 流程图 xff0c
  • Conda_安装库失败:Collecting package metadata (current_repodata.json): failed

    具体原因 xff1a update repo信息时网络有问题 于是就出现了污染 解决方法 xff1a conda clean i 然后重新随便install一个库 会重新下载repo信息 xff0c 问题解决
  • scrapy爬虫实战——抓取NBA吧的内容

    scrapy爬虫 步骤1 进入虚拟环境2 测试爬取页面3 进入开发者模式4 剥离页面中的数据5 在pycharm中码代码scrapy框架的目录 xff08 之前创建虚拟环境自动搭建 xff09 nba py源码详解 6 Debug第一步 点
  • ubuntu系统版本查询命令方法

    目录 一 使用命令 xff1a cat proc version 查看 二 使用命令 xff1a uname a 查看 三 使用命令 xff1a lsb release a 查看 四 使用命令 xff1a hostnamectl 查看 五
  • python解析xml文件(解析、更新、写入)

    Overview 这篇博客内容将包括对XML文件的解析 追加新元素后写入到XML xff0c 以及更新原XML文件中某结点的值 使用的是python的xml dom minidom包 xff0c 详情可见其官方文档 xff1a xml do
  • 一阶微分方程

    传送门https jingyan baidu com article 8065f87fb7f0652331249822 html 1 可分离变量的微分方程解法 一般形式 g y dy 61 f x dx 直接解得 g y dy 61 f x
  • C#多线程--信号量(Semaphore)

    Semaphore 是负责协调各个线程 以保证它们能够正确 合理的使用公共资源 也是操作系统中用于控制进程同步互斥的量 Semaphore常用的方法有两个WaitOne 和Release xff0c Release 的作用是退出信号量并返回
  • 【总结】C++工程师学习路线|推荐视频|推荐书籍

    前言 由于博主秋招拿到的offer有限 xff0c 经过对比 xff0c 决定转到C 43 43 开发技术栈 xff0c 此篇文章用于规划自己今后的成长路线并分享给大家 学习路线 C 43 43 语言本身 xff1a 我们可以将这个部分分为
  • 面试被问到的promise总结

    promise all的使用 promise all可以将多个promise实例包装成一个新的promise实例 xff0c 并且返回的值也不相同 xff0c 成功使 xff0c promise返回的值是一个结果数组 xff0c 而失败的话
  • ROS节点,消息,话题,服务的介绍

    整理结合机器人操作系统 xff08 ros xff09 浅析和网址http wiki ros org cn NODE node几乎是无处不在 xff0c 这个东西相当于可执行文件 xff0c 目前我更愿意把它当做cpp文件 xff0c 通过
  • vue实现表格的更多查询功能

    场景一 xff1a 一行足够显示完所有的查询条件 场景二 xff1a 需要多行才能显示完所有的查询条件 1 首先创建一个按钮组件SearchButton lt template gt lt el form inline class 61 3
  • FreeROTS原理学习笔记

    前言 xff1a 这仅是一篇学习笔记记录 xff0c 无指导意义 想详细了解的人 可看CSDN博主 zhzht19861011 的原创文章 FreeROTS系统 xff1a 使用习惯 xff1a 1 一般来说 xff0c 都是利用下载好的例
  • RuntimeError: dataset.make_initializable_iterator is not supported when eager execution is enabled.

    这是由于代码的接口更改 xff0c 无法正常连接数据集 xff0c 即新版本接口变了 需要按照第4章的数据集部分 xff0c 改一下数据集接口
  • 基于Android 的串口工具类

    欢迎使用串口通讯 xff0c 首先说明下我这里使用的是RS485通讯 xff0c 采用的是半双工通讯 xff0c 所以收和发不能同时操作需要发送等待一段时间来接收完数据在发送其他指令了 xff0c 这里顺便在说下RS232 xff0c 它采