Android 串行端口 API 概述与应用

在移动设备中,串行端口通信是实现设备间数据传输的重要方式之一。Android 系统虽然提供了一些基本的 USB 和蓝牙通信功能,但对于直接串行端口的支持并不是特别完备。本篇文章将详细介绍 Android 串行端口 API,提供一些示例代码,帮助开发者理解如何在实际应用中使用这一 API。

什么是串行端口?

串行端口是一种通信协议,允许计算机或其他设备通过单一通道进行数据传输。在以前的计算机中,串行端口通常用于连接调制解调器、打印机等外围设备。它的数据传输通常是按位(bit)顺序进行的。尽管现代设备一般使用 USB 或其他更高级的传输协议,但了解串行端口仍然是开发嵌入式系统或在Android设备上进行低级别硬件交互的基础。

Android 中的串行端口 API

Android 没有内置的直接操作串行端口的 API,开发者可以使用第三方库,如 [UsbSerial]( 或者 Kivy 的 Comport 模块,来实现串行通信。这些库提供了对 USB 串行设备的支持,便于开发者进行数据传输。

主要特性
  • 支持 USB 和蓝牙串行连接。
  • 易于集成,提供了简单的 API 来发送和接收数据。
  • 兼容多种设备,提供更广泛的用途。
安装 UsbSerial 库

在项目的 build.gradle 文件中添加依赖项:

dependencies {
    implementation 'com.hoho.android.usbserial.driver:usb-serial-for-android:3.4.6'
}
  • 1.
  • 2.
  • 3.

示例代码

以下是一个简短的示例,展示了如何使用 UsbSerial 库来打开串行端口并发送数据:

1. 权限

在 AndroidManifest.xml 中申请 USB 权限:

<uses-permission android:name="android.permission.USB_PERMISSION" />
<application>
    ...
</application>
  • 1.
  • 2.
  • 3.
  • 4.
2. 打开 USB 串行端口

以下代码演示了如何打开 USB 串行端口并发送数据:

import android.app.Activity;
import android.hardware.usb.UsbManager;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.hoho.android.usbserial.driver.UsbSerialDevice;
import com.hoho.android.usbserial.driver.UsbSerialPort;
import com.hoho.android.usbserial.driver.UsbSerialProber;

import java.util.HashMap;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private UsbManager usbManager;
    private UsbSerialPort serialPort;

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

        usbManager = (UsbManager) getSystemService(USB_SERVICE);
        openSerialPort();
    }

    private void openSerialPort() {
        HashMap<String, UsbSerialPort> portMap = UsbSerialProber.getDefaultProber().probeSingleDevice(usbManager);
        if (portMap != null) {
            serialPort = portMap.values().iterator().next();
            try {
                serialPort.open(usbManager.openDevice(serialPort.getUsbDevice()));
                serialPort.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);

                // 发送数据
                String data = "Hello, Serial Port!";
                serialPort.write(data.getBytes(), data.length());
                Log.d(TAG, "Data sent: " + data);
            } catch (Exception e) {
                Log.e(TAG, "Error opening serial port: " + e.getMessage());
            }
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
3. 接收数据

接收数据的代码示例:

private void readData() {
    new Thread() {
        @Override
        public void run() {
            byte[] buffer = new byte[16];
            while (true) {
                try {
                    int numBytesRead = serialPort.read(buffer, 1000);
                    if (numBytesRead > 0) {
                        String dataReceived = new String(buffer, 0, numBytesRead);
                        Log.d(TAG, "Data received: " + dataReceived);
                    }
                } catch (Exception e) {
                    Log.e(TAG, "Error reading data: " + e.getMessage());
                }
            }
        }
    }.start();
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
4. 使用序列图表示数据传输

下面是一个简单的序列图,展示了发送和接收数据的过程:

USBSerialPort App User USBSerialPort App User Request to send data Send data through serial port Data sent confirmation Read data from serial port Send data Receive data

常见问题

1. 如何处理 UART 数据格式?

在进行串行通信时,需要注意数据的格式,包括波特率、数据位、停止位等。上面的示例中,我们使用了 115200 波特率、8 数据位、1 停止位和无校验位。在与设备通信前,一定要确认这些参数的一致性。

2. 串行端口通信的安全性问题

在实现串行端口通信时,确保连接设备的安全性非常重要。开发者应遵循最佳实践,避免未授权的设备连接。

结论

Android 串行端口 API 是处理 USB 串行设备的重要工具。结合学习到的理论与实践,开发者可以轻松实现设备间的高效数据传输。通过使用第三方库如 UsbSerial,您可以快速构建出支持串行通信的 Android 应用。希望本文能对您的开发工作有所帮助!如有任何疑问,欢迎讨论与交流。