串口相关 二

注意该代码并不能直接运行,仅仅起到展示效果

EventBus.getDefault().post(new EventBusBean(Constants.EventBus.SERIAL_PORT_CMD, new UartEvent(buf)));
此处代码可以负责发送读取到的信息发送出去
项目内部可以开启一个service 在service内部接受该信息,并执行业务逻辑处理;


import android.os.SystemClock;
import android.util.Log;

import com.hjq.toast.ToastUtils;
import com.qsinong.qlog.QLog;

import org.greenrobot.eventbus.EventBus;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.HexUtil;
import cn.pda.serialport.SerialPort;



public class SerialPortlUtils {
    private final String TAG = "SerialPortUtils";
    private String path = "/dev/ttyMT1";
    private int baudrate = 115200;
    private int port = 13; // COM13
    public boolean serialPortStatus = false; //是否打开串口标志
    public boolean threadStatus; //线程状态,为了安全终止线程
    private static SerialPortlUtils instance;
    public SerialPort serialPort = null;
    public InputStream inputStream = null;
    public OutputStream outputStream = null;

    public SerialPortlUtils() {
        openSerialPort();
    }

    public static SerialPortlUtils getInstance() {
        synchronized (SerialPortlUtils.class) {
            if (instance == null) {
                instance = new SerialPortlUtils();
            }
        }
        return instance;
    }

    /**
     * 打开串口
     *
     * @return serialPort串口对象
     */
    public SerialPort openSerialPort() {
        if (serialPort == null) {
            Log.d(TAG, "openSerialPort-------------");
            try {
                //serialPort = new SerialPort(new File(path), baudrate, 0);
                serialPort = new SerialPort(port, baudrate, 0);
                serialPort.power3v3on();
                this.serialPortStatus = true;
                threadStatus = false; //线程状态
                //获取打开的串口中的输入输出流,以便于串口数据的收发
                inputStream = serialPort.getInputStream();
                outputStream = serialPort.getOutputStream();
                new ReadThread((FileInputStream) inputStream).start(); //开始线程监控是否有数据要接收
            } catch (Throwable e) {
                QLog.e("openSerialPort: 打开串口异常:" + Log.getStackTraceString(e));
                return serialPort;
            }
            QLog.i("openSerialPort: 打开串口成功");
        }
        return serialPort;
    }

    /**
     * 时间
     */
    public void updateTime() {
        long timestamp = (System.currentTimeMillis() / 1000);
        //long timestamp = 1650009677;
        String strCommand = "A5000100000200080030000400000000AA5A";
        byte[] buffer = DataTools.HexString2Bytes(strCommand);
        timestamp += 3600 * 8;
        buffer[12] = (byte) (timestamp >> 24);
        buffer[13] = (byte) (timestamp >> 16);
        buffer[14] = (byte) (timestamp >> 8);
        buffer[15] = (byte) (timestamp & 0xff);
        byte bcc = DataTools.makeBCC(buffer, buffer.length);
        buffer[buffer.length - 2] = bcc;
        sendSerialPort(buffer);
        QLog.i("SerialPort_send_cmd_log", String.format(BaseApplication.i().getResources().getString(R.string.SerialPort_send_cmd), "同步时间", "cmd:"+ DataTools.Bytes2HexString(buffer, buffer.length))+";---时间戳:"+timestamp);
    }
   
    /**
     * 单开一线程,来读数据
     */
    private class ReadThread extends Thread {
        FileInputStream inputStream;

        ReadThread(FileInputStream inputStream) {
            this.inputStream = inputStream;
            this.setPriority(MAX_PRIORITY);
        }

        @Override
        public void run() {
            super.run();
            int maxLength = 1024 * 1024;
            int curLength = 0;
            int size = 0;
            byte[] buffer = new byte[maxLength];
            //判断进程是否在运行,更安全的结束进程
            while (!threadStatus) {
                try {
                    int available = inputStream.available();
                    if (available > 0) {
                        if (available > maxLength - curLength) {
                            available = maxLength - curLength;
                        }
                        int left = available;
                        while (left > 0) {
                            size = inputStream.read(buffer, curLength, left);
                            if (size > 0) {
                                curLength += size;
                                left -= size;
                            }
                            SystemClock.sleep(1);
                        }
                    }
                } catch (IOException e) {
                    QLog.d("run: 数据读取异常:" + e.toString());
                } finally {
                }
                if (curLength > 0) {
                    boolean flag = false;
                    while (!flag) {
                        int sPos = 0;
                        while (sPos < curLength && (buffer[sPos] & 0xff) != 0xa5) sPos += 1;
                        if (sPos >= curLength) {
                            curLength = 0;
                            flag = true;
                        } else {
                            int ePos = sPos + 1;
                            while (ePos < curLength && (buffer[ePos] & 0xff) != 0x5a) ePos += 1;
                            if (ePos >= curLength) {
                                if (sPos > 0) {
                                    curLength -= sPos;
                                    System.arraycopy(buffer, sPos, buffer, 0, curLength);
                                }
                                break;
                            } else {
                                int factLength = ePos - sPos + 1;
                                byte[] data = new byte[factLength];
                                System.arraycopy(buffer, sPos, data, 0, factLength);
                                byte[] buf = DataTools.transFrom(data);
                                if (DataTools.checkBCC(buf, buf.length)) {

                                    UartEvent event = new UartEvent(buf);
//                                    statisticsOnSecond(event);
                                    Log.d(TAG, "run: 收到全部发到该设备的指令"+ DataTools.Bytes2HexString(buf, buf.length) +" cmd指令为:="+event.cmd);
                                    if (event.cmd == Constants.SerialPortCmd.UPGRAD){
                                        QLog.i("SerialPort_send_cmd_log", String.format(BaseApplication.i().getResources().getString(R.string.SerialPort_send_cmd), "收到", DataTools.Bytes2HexString(DataTools.transTo(buf), DataTools.transTo(buf).length)));
                                        if (data[2] == 0x02){
                                        }
                                    }
                                    /**
                                     * 除升级指令外其他全部发送到对应页面接收处理
                                     */
                                    EventBus.getDefault().post(new EventBusBean(Constants.EventBus.SERIAL_PORT_CMD, new UartEvent(buf)));
                                }
                                curLength -= ePos + 1;
                                System.arraycopy(buffer, ePos + 1, buffer, 0, curLength);
                            }
                        }
                    }
                }
                SystemClock.sleep(1);
            }
        }


    }


}```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有时有晌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值