基于Android 的串口工具类

欢迎使用串口通讯, 首先说明下我这里使用的是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);    
            }
        });```

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android串口工具是一种可以在Android设备上实现串口通信工具串口通信是一种基于串行通信方式的数据传输方式,常用于连接不同设备之间进行数据交互。 Android串口工具通过手机或平板电脑的USB接口,将串口设备连接到Android设备上。它可以帮助我们在Android设备上读取和发送串口数据,实现与其他设备的通信。例如,我们可以使用串口工具与单片机、传感器、PLC等设备进行通信,实现数据的采集、控制和实时监测等功能。 Android串口工具通常提供了一系列的API供开发者使用,开发者可以根据自己的需求调用相关方法,实现对串口的读写操作。通过这些API,我们可以设置串口的波特率、数据位、停止位、校验位等参数,以及读取串口数据、发送串口指令等操作。 Android串口工具的使用范围广泛,可以应用于智能家居、工业自动化、物联网等领域。比如,在智能家居中,我们可以通过串口工具与智能设备进行通信,实现对家庭电器的远程控制;在工业自动化中,我们可以通过串口工具与PLC等设备进行通信,实现生产线的监控和控制;在物联网中,我们可以通过串口工具与传感器进行通信,实现对环境参数的实时采集和分析。 总之,Android串口工具是一种非常重要的工具,它为Android设备提供了与其他设备进行串口通信的能力,具有广泛的应用前景。 ### 回答2: Android 串口工具是一种用于在Android设备上进行串口通信工具串口通信是一种将数据逐位地传输的通信方式,常用于连接计算机和外部设备,如传感器、打印机、扫码枪等。 Android系统自带的串口通信功能有限,因此需要借助第三方的串口工具来实现串口通信Android上常用的串口工具有多个选择,如PL2303HXD、CP210x、CH340等。这些工具通常是通过USB转串口线或串口转WiFi模块与Android设备连接。 使用Android串口工具,我们可以实现通过串口与外部设备进行数据的发送和接收。通过串口工具提供的API,我们可以在Android应用程序中通过打开串口、设置波特率、发送数据包等方式来进行串口通信操作,并接收外部设备返回的数据。 Android串口工具的使用可以应用于多个领域,如物联网、嵌入式系统开发、机器人控制等。通过串口通信,我们可以实现与各种外部设备的连接和数据传输,扩展Android设备的功能。 总的来说,Android串口工具是一种方便快捷的工具,可以帮助我们在Android设备上实现串口通信,与外部设备进行数据交互,提升设备的应用能力和扩展性。 ### 回答3: Android串口工具是一种可以在Android设备上连接串口设备进行通信的工具串口通信是一种通过串行接口进行传输的通信方式,常用于嵌入式设备间的无线通信。 Android串口工具可以通过OTG线连接串口设备与Android设备,实现设备之间的数据传输。它可以提供串口的打开关闭、数据的读写等基本操作,并支持多种波特率、数据位、校验位和停止位的设置,以满足不同串口设备的要求。 Android串口工具还提供了多种数据格式的解析和转换功能,例如可以将串口接收到的二进制数据转换成ASCII码进行显示,或者将ASCII码转换成二进制数据进行发送。此外,还可以进行数据的自动发送和循环发送,方便进行数据的测试和调试。 在嵌入式系统开发、通信设备接入等领域,Android串口工具具有重要的作用。它可以方便地将Android设备与其他串口设备进行连接,实现设备之间的数据交互。同时,通过串口工具,可以方便地对串口设备进行调试和测试,提高开发效率。 总之,Android串口工具Android设备提供了方便的串口通信能力,可以满足嵌入式系统开发和通信设备接入的需求,是一种非常实用的工具
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值