tj_duan 2024-03-22 16:10 采纳率: 41.2%
浏览 8

Android 串口通信如何优化

Android 使用modbus协议进行串口通信,目前离散输入寄存器和输入寄存器都需要定时获取数据,时间很短,所以目前采用handler定时器的方式每隔一段时间就执行这两个方法,在获取线圈寄存器或者保持寄存器时,先停止这个定时器,等保持寄存器或线圈寄存器返回值以后 才会重新开启,这种方式有没有问题? 感觉时间长以后设备会很卡,有没有什么优化的办法?

  • 写回答

2条回答 默认 最新

  • 码农阿豪@新空间 优质创作者: Java、后端开发技术领域 2024-03-22 16:10
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题:Android串口通信下使用handler定时器定时获取离散输入寄存器和输入寄存器,在获取线圈寄存器或保持寄存器时,需要先停止定时器,再重新开启。这种方式存在问题吗?如何优化? 回答:
    1. 这种方式并不是最优的,因为使用handler定时器会在UI线程中执行,如果定时器时间太短,会导致UI线程比较繁忙,从而导致设备比较卡顿。建议使用Timer或Thread定时器进行定时任务的执行,这样可以避免UI线程的负担,提高设备的性能。
    2. 在获取离散输入寄存器和输入寄存器时,可以采用同步或异步方式进行获取。同步方式可以确保获取数据的准确性,但会阻塞当前线程,异步方式可以避免阻塞当前线程,但需要注意线程安全性。
    3. 在获取线圈寄存器或保持寄存器前,可以使用RxJava或AsyncTask进行任务的异步处理,这样可以提高任务的并发性,减少等待时间,从而提高设备的响应速度。 示例代码: 使用Timer或Thread进行定时任务的执行:
    private Timer timer;
    private TimerTask task;
    private void startTimer() {
        timer = new Timer();
        task = new TimerTask() {
            @Override
            public void run() {
              //执行任务
            }
        };
        timer.schedule(task, 0, 1000);//第一个参数是要执行的任务,第二个参数是延迟时间,第三个参数是循环周期
    }
    private void stopTimer() {
        if (timer != null) {
            task.cancel();//取消定时任务
            timer.cancel();//取消定时器
            timer = null;
            task = null;
        }
    }
    

    使用RxJava进行异步处理:

    Observable.defer(() -> {
        //执行耗时任务
        return Observable.just("");
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Observer<String>() {
        @Override
        public void onSubscribe(Disposable d) {
        }
        @Override
        public void onNext(String s) {
            //执行回调操作
        }
        @Override
        public void onError(Throwable e) {
        }
        @Override
        public void onComplete() {
        }
    });
    
    评论

报告相同问题?

问题事件

  • 创建了问题 3月22日