Android 之 串口通信

Android 串口通信主要用于与嵌入式设备(如传感器、打印机、工业控制器等)进行数据交互。以下是核心实现方案、代码示例及注意事项。

1. 串口类型​

  • ​直接硬件串口​ :Android 设备自带串口(如 /dev/ttyS0),常见于工业平板或定制设备。
  • ​USB 转串口​:通过 OTG 连接 USB 转串口适配器(需支持 USB Host 模式)

2、代码实现(以 licheedev 库为例)

1. 添加依赖​

Groovy 复制代码
// build.gradle
dependencies {
    implementation 'com.github.licheedev:Android-SerialPort-API:2.0.0'
}
//仓库配置​​:在 settings.gradle 添加 maven { url "https://jitpack.io" }

2. 封装串口工具类​

Groovy 复制代码
import android.serialport.SerialPort;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class SerialPortHelper {
    private SerialPort serialPort;
    private InputStream inputStream;
    private OutputStream outputStream;

    // 打开串口
    public boolean open(String devicePath, int baudRate, int dataBits, int stopBits, int parity) {
        try {
            serialPort = new SerialPort.Builder(new File(devicePath), baudRate)
                .dataBits(dataBits)    // 数据位(5~8)
                .stopBits(stopBits)    // 停止位(1或2)
                .parity(parity)        // 校验位(0:无, 1:奇, 2:偶)
                .build();
            inputStream = serialPort.getInputStream();
            outputStream = serialPort.getOutputStream();
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    // 发送数据(十六进制指令)
    public void send(String hexCommand) {
        try {
            byte[] data = hexStrToBytes(hexCommand);
            outputStream.write(data);
            outputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 接收数据(循环监听)
    public void startReading(DataReceivedListener listener) {
        new Thread(() -> {
            byte[] buffer = new byte[1024];
            while (!Thread.interrupted()) {
                try {
                    int size = inputStream.read(buffer);
                    if (size > 0) {
                        byte[] received = new byte[size];
                        System.arraycopy(buffer, 0, received, 0, size);
                        listener.onDataReceived(received);
                    }
                } catch (IOException e) {
                    break;
                }
            }
        }).start();
    }

    // 关闭串口
    public void close() {
        if (serialPort != null) {
            serialPort.close();
        }
    }

    // 十六进制字符串转字节数组
    private byte[] hexStrToBytes(String hex) {
        // 转换逻辑(参考[8](@ref))
    }

    public interface DataReceivedListener {
        void onDataReceived(byte[] data);
    }
}

3. Activity 调用示例​

Groovy 复制代码
public class MainActivity extends AppCompatActivity {
    private SerialPortHelper serialHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        serialHelper = new SerialPortHelper();
        // 打开串口(参数需根据硬件手册设置)
        boolean success = serialHelper.open("/dev/ttyS1", 9600, 8, 1, 0);

        if (success) {
            // 发送指令(示例:AA 01 02 DD)
            serialHelper.send("AA0102DD");

            // 监听返回数据
            serialHelper.startReading(data -> {
                String hex = bytesToHex(data); // 字节转十六进制
                runOnUiThread(() -> Log.d("SerialPort", "Received: " + hex));
            });
        }
    }

    @Override
    protected void onDestroy() {
        serialHelper.close(); // 关闭串口
        super.onDestroy();
    }
}
相关推荐
alexhilton6 分钟前
Kotlin DSL深度解析:从Gradle脚本到构建你自己的DSL
android·kotlin·android jetpack
烽火聊员26 分钟前
查看Android Studio错误日志
android·ide·android studio
星空语6 小时前
音频001_Android+Linux车载/手机音频全链路分层架构图
android·linux·音视频
CyL_Cly6 小时前
解决官网下载慢!Android Studio 最新版网盘下载
android·ide·android studio
智塑未来6 小时前
鸿蒙系统对比安卓、iOS,核心优势是什么?
android·ios·harmonyos
AI刀刀7 小时前
豆包智能体对话导出后,如何构建长期归档与高效检索体系?
android·人工智能·word·excel·ai导出鸭
初雪云8 小时前
iOS 上架入门:证书、描述文件、IPA 上传到底是什么关系?
android·ios·自动化·产品经理·iphone
玩机达人8811 小时前
一加12/Ace5/Ace3pro手机ColorOS16降级回锁BL熔断变黑砖怎么办
android·智能手机·电脑
Digitally11 小时前
使用 USB 数据线将文件从安卓设备传输到电脑
android·电脑
xieliyu.12 小时前
MySQL 六大基础约束详解:NOT NULL/DEFAULT/UNIQUE/ 主键 / 外键 / CHECK
android·数据库·sql·mysql