Seriport实现串口数据发送和接收

serialport是谷歌的一个关于串口通信的框架,它封装了方法,帮助我们更好的使用串口,进行软件和硬件之前的通信

效果图:手机效果图是大屏android,无截图按钮,图片可能和结果稍有出处

1.在app下的builder.gradle下面添加依赖:

  //gogle serialPort
    implementation 'com.aill:AndroidSerialPort:1.0.8'

2.封装一个串口传输类

package com.example.administrator.testz;


import java.io.InputStream;
import java.io.OutputStream;

/**
 * 串口传输类。在这个类里会启动两个线程分别对串口进行监听输入与数据输出。
 *
 * @author xxs
 */
public class SerialTransceiver {

    private InputStream inputStream;
    private OutputStream outputStream;
    private WriteRunnable write;
    private ReadRunnable read;
    private ReceiverListener listener;

    private byte[] writeBuffer;
    private int writeIn, writeOut;

    /**
     * 构造函数
     */
    public SerialTransceiver() {
        writeBuffer = new byte[1024];
        writeIn = 0;
        writeOut = 0;
    }

    /**
     * 启动线程
     */
    public void start() {
        write = new WriteRunnable();
        write.isRunnung = true;
        (new Thread(write)).start();

        read = new ReadRunnable();
        read.isRunnung = true;
        (new Thread(read)).start();
    }

    /**
     * 停止线程
     */
    public void stop() {
        if (write != null) {
            write.isRunnung = false;
            synchronized (writeBuffer) {
                writeBuffer.notifyAll();
            }
        }

        if (read != null)
            read.isRunnung = false;
    }

    /**
     * 写入数据。这个数据会先写入到一个缓存里,然后再通知输出线程将数据发送出去。
     *
     * @param data   数据
     * @param offset 有效偏移量
     * @param size   数据大小
     * @return 成功返回true,否则返回false
     */
    public boolean write(byte[] data, int offset, int size) {
        if (data == null)
            throw new NullPointerException("data = null");
        if (offset + size > data.length)
            throw new IndexOutOfBoundsException("offset + size > data.length");

        synchronized (writeBuffer) {
            if (size > 1024 - writeIn)
                return false;

            System.arraycopy(data, offset, writeBuffer, writeIn, size);
            writeIn += size;
            writeBuffer.notifyAll();
        }

        return true;
    }

    /**
     * 设置输入流。这个输入流应是串口输入流。监听线程就是监听这个输入流。
     *
     * @param inputStream 串口输入流。
     */
    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    /**
     * 设置输出流。这个输出流应是串口输出流。发送线程会将数据从这个输出流发凌空出去。
     *
     * @param outputStream 串口输出流。
     */
    public void setOutputStream(OutputStream outputStream) {
        this.outputStream = outputStream;
    }

    /**
     * 设置接收监听器。当从输入流收到数据后会通过这个监听器通知设置监听器的类。
     *
     * @param listener
     */
    public void setListener(ReceiverListener listener) {
        this.listener = listener;
    }

    /**
     * 数据输出线程主体。
     *
     * @author Hong
     */
    private class WriteRunnable implements Runnable {

        private boolean isRunnung = false;

        @Override
        public void run() {
            System.out.println("Start WriteRunnable!");
            if (outputStream == null)
                isRunnung = false;

            try {
                while (isRunnung) {
                    synchronized (writeBuffer) {
                        // 当缓存为空时会阻塞
                        while (isRunnung && (writeIn == writeOut))
                            writeBuffer.wait();
                        if (!isRunnung)
                            break;

                        // 将数据写入输出流
                        int size = writeIn - writeOut;
                        outputStream.write(writeBuffer, writeOut, size);
                        writeOut += size;
                        if (writeIn == writeOut) {
                            writeIn = 0;
                            writeOut = 0;
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            isRunnung = false;
            System.out.println("finish WriteRunnable!");
        }
    }

    /**
     * 监听输入线程主体。
     *
     * @author Hong
     */
    private class ReadRunnable implements Runnable {

        private boolean isRunnung = false;

        @Override
        public void run() {
            System.out.println("Start ReadRunnable!"
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值