安卓串口通訊三

核心代碼如下:

java 复制代码
package com.example.comandroid;

import static android.content.ContentValues.TAG;

import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.jackiepenghe.serialportlibrary.MultipleSerialPortManager;
import com.jackiepenghe.serialportlibrary.OnSerialPortDataChangedListener;
import com.jackiepenghe.serialportlibrary.SerialPortManager;
import com.sscl.baselibrary.utils.ConversionUtil;
import com.sscl.baselibrary.utils.DebugUtil;
import com.sscl.baselibrary.utils.ToastUtil;

import java.nio.charset.Charset;

/**
* 功能描述:
* 版权所有:
* 版本:1.0
* 作者:
* 创建时间 ${DATE} ${hour}
* 邮箱 :2848444745@qq.com
*
*/

public class MainActivity extends AppCompatActivity {
    private Button btnOpen;
    private Button btnClose;
    private Button btnSend;
    private TextView text;
    private String serialPort="/dev/ttyS1";//串口路徑
//    private String serialPort="/dev/ttyS2";//串口路徑
//    private String serialPort="/dev/ttyS3";//串口路徑
//    private String serialPort="/dev/ttyS4";//串口路徑
    private int baudRate = 9600;//波特率
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnClose=findViewById(R.id.btn_close);
        btnOpen=findViewById(R.id.btn_open);
        btnSend=findViewById(R.id.btn_send);
        text=findViewById(R.id.textView);

        //打開串口
        btnOpen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openSerialPort();
            }
        });

        //關閉串口
        btnClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MultipleSerialPortManager.closeSerialPort(serialPort);
            }
        });
        //發送數據
        btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendData("發送測試");
            }
        });

    }

    /**
     * 串口监听
     */
    private final OnSerialPortDataChangedListener onSerialPortDataChangedListener = (data, size) -> {
        byte[] cache = new byte[size];
        System.arraycopy(data, 0, cache, 0, size);
        DebugUtil.warnOut(TAG, "cache = " + ConversionUtil.byteArrayToHexStr(cache));
        DebugUtil.warnOut(TAG, "cache = " + new String(cache));
        String result = ConversionUtil.byteArrayToHexStr(cache);
        text.setText(result);


    };

    /**
     * 打开串口
     */
    private void openSerialPort() {
        boolean open = MultipleSerialPortManager.openSerialPort(serialPort, baudRate, onSerialPortDataChangedListener);
        if (open) {
            ToastUtil.toastLong(this, "串口打開成功");
            DebugUtil.warnOut(TAG, "串口打開成功");
            this.serialPort = serialPort;
        } else {
            DebugUtil.warnOut(TAG, "串口打開失敗");
            ToastUtil.toastLong(this, "串口打開失敗");
        }


    }

    /**
     * 获取串口信息
     */
    private void getSerialPortInfo() {
        String[] allDevices = MultipleSerialPortManager.getAllDevices();
        if (allDevices.length == 0) {
            DebugUtil.warnOut(TAG, "allDevices length == 0");
        }
        for (int i = 0; i < allDevices.length; i++) {
            DebugUtil.warnOut(TAG, "allDevices[" + i + "] = " + allDevices[i]);
        }
        String[] allDevicesPath = MultipleSerialPortManager.getAllDevicesPath();
        if (allDevicesPath.length == 0) {
            DebugUtil.warnOut(TAG, "allDevicesPath length == 0");
        }
        for (int i = 0; i < allDevicesPath.length; i++) {
            DebugUtil.warnOut(TAG, "allDevicesPath[" + i + "] = " + allDevicesPath[i]);
        }

    }

   // 关闭串口
    private void closeSerialPort() {
        if (serialPort == null) {
            return;
        }
        MultipleSerialPortManager.closeSerialPort(serialPort);
    }

    // 發送數據
    private void sendData(String data) {
        boolean succeed= MultipleSerialPortManager.writeData(serialPort, "1234567890", Charset.forName("UTF-8"));
        if (!succeed){
            ToastUtil.toastLong(this, "發生失敗");
        }else{
            ToastUtil.toastLong(this, "發送成功");
        }

    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        closeSerialPort();
    }
}

想要完整的了解,可以看下完整的dome,這我也給出來了完整dome如下:

https://download.csdn.net/download/qq_41733851/89288862?spm=1001.2014.3001.5503

相关推荐
消失的旧时光-19432 分钟前
Kotlin 协程设计思想(七):为什么 Kotlin 要设计 SupervisorJob 和 supervisorScope?
android·开发语言·kotlin
故渊at14 分钟前
第一板块:Android 系统基石与运行原理 | 第五篇:Context 上下文与资源配置体系
android·人工智能·opencv·context·上下文·资源配置体系
故渊at25 分钟前
第一板块:Android 系统基石与运行原理 | 第四篇:进程孵化(Zygote)与 Low Memory Killer 机制
android·虚拟机·zygote·系统启动·low memory·进程孵化
JohnnyDeng9431 分钟前
【Android】RecyclerView性能优化与缓存机制:从卡顿到丝滑的完整指南
android·性能优化·kotlin·mvvm
zfoo-framework32 分钟前
kotlin中体会到一些比较好用的点
android·开发语言·kotlin
●VON3 小时前
AtomGit Flutter鸿蒙客户端:文件树与代码浏览
android·服务器·安全·flutter·harmonyos·鸿蒙
故渊at9 小时前
系列三:组件化与模块化进阶 | 第11篇 组件化项目规范与问题根治:依赖、资源、Manifest 与混淆的全链路管控
android·架构·mvvm·模块化·组件化
故渊at9 小时前
系列二:MVVM 深度实战与项目重构 | 第7篇 LiveData & StateFlow 状态管理实战:从“粘包弹”到“丝滑流式”
android·重构
是阿建吖!10 小时前
【Linux】信号
android·linux·c语言·c++
alexhilton12 小时前
AppFunctions:让你的Android应用更容易被AI智能体发现
android·kotlin·android jetpack