Android-SerialPort 科普文章

1. 简介

Android-SerialPort 是一个在 Android 平台上用于串口通信的开源库。它提供了一套简单易用的 API,使开发者能够轻松地与硬件设备进行串口通信。

2. 为什么要使用串口通信

在很多场景下,我们需要与外部硬件设备进行通信。例如,通过串口接口连接到打印机、传感器、条码扫描器等设备,以实现数据的传输和控制。而 Android 设备本身并没有提供原生的串口通信功能,因此我们需要借助第三方库来实现。

3. Android-SerialPort 库的使用

3.1 导入库文件

首先,在你的 Android 项目中添加 Android-SerialPort 库的依赖。你可以通过 Gradle 或 Maven 来导入,以下是 Gradle 的示例:

dependencies {
    implementation 'android_serialport_api:android-serialport-api:1.2.0'
}

3.2 打开串口

在使用串口之前,我们需要先打开串口。通过 SerialPort 类的构造方法来创建一个串口对象,指定串口设备的路径和波特率:

String devicePath = "/dev/ttyS3";
int baudRate = 9600;
SerialPort serialPort = new SerialPort(new File(devicePath), baudRate, 0);

3.3 发送和接收数据

打开串口后,我们可以通过 OutputStream 向串口发送数据,通过 InputStream 接收串口返回的数据。以下是一个发送和接收数据的示例:

OutputStream outputStream = serialPort.getOutputStream();
InputStream inputStream = serialPort.getInputStream();

// 发送数据
byte[] sendData = "Hello, SerialPort".getBytes();
outputStream.write(sendData);

// 接收数据
byte[] receiveData = new byte[1024];
int size = inputStream.read(receiveData);
String receiveString = new String(receiveData, 0, size);
System.out.println("Received data: " + receiveString);

3.4 关闭串口

在不需要使用串口时,记得关闭串口以释放资源:

serialPort.close();

4. 示例应用

假设我们有一个串口设备连接到 Android 设备的 /dev/ttyS3 端口,并且串口设备每隔 1 秒发送一条数据。我们可以编写一个 Android 应用来接收并显示这些数据。

首先,在布局文件中添加一个 TextView 用于显示串口返回的数据:

<LinearLayout xmlns:android="
    xmlns:tools="
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp" />

</LinearLayout>

然后,在 MainActivity 中初始化串口,并通过一个后台线程循环接收并更新 TextView 的内容:

public class MainActivity extends AppCompatActivity {

    private SerialPort serialPort;
    private TextView textView;

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

        textView = findViewById(R.id.textView);

        // 初始化串口
        try {
            String devicePath = "/dev/ttyS3";
            int baudRate = 9600;
            serialPort = new SerialPort(new File(devicePath), baudRate, 0);
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(this, "Failed to open serial port", Toast.LENGTH_SHORT).show();
        }

        // 启动后台线程接收数据
        new Thread(new Runnable() {
            @Override
            public void run() {
                InputStream inputStream = serialPort.getInputStream();

                while (!Thread.currentThread().isInterrupted()) {
                    try {
                        byte[] receiveData = new byte[1024];
                        int size = inputStream.read(receiveData);
                        final String receiveString = new String(receiveData, 0, size);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                textView.setText(receiveString);
                            }
                        });
                    } catch (IOException e) {
                        e.printStackTrace();
                        break;
                    }
                }
            }
        }).start();
    }

    @Override
    protected