You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中Java实现UART协议的光照传感器数据处理问题

Android 光照传感器数据UART传输与存储实现方案

一、UART通信实现(Android平台)

Android原生无直接UART API,需根据硬件场景选择实现方式:

1. USB转UART设备(普通手机适配)

通过USB转UART模块(如CH340、PL2303)实现串口通信,步骤如下:

  • 声明权限:在AndroidManifest.xml中添加USB相关权限
<uses-feature android:name="android.hardware.usb.host" android:required="false" />
<uses-permission android:name="android.permission.USB_PERMISSION" />
  • 设备检测与权限申请:通过UsbManager扫描USB设备,向系统申请访问权限
  • 打开串口并读写:权限通过后,获取USB接口和端点,用bulkTransfer完成数据收发
private UsbDeviceConnection mUsbConn;
private UsbInterface mUsbInterface;

public void openUsbSerial(UsbDevice device) {
    UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
    // 发送权限请求广播
    PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent("com.example.USB_PERMISSION"), 0);
    usbManager.requestPermission(device, permissionIntent);
    
    // 权限通过后初始化连接
    if (usbManager.hasPermission(device)) {
        mUsbConn = usbManager.openDevice(device);
        mUsbInterface = device.getInterface(0);
        mUsbConn.claimInterface(mUsbInterface, true);
        
        // 获取收发端点(根据设备手册确认编号,一般1为输出,2为输入)
        UsbEndpoint outEp = mUsbInterface.getEndpoint(1);
        // 发送处理后的光照数据(1或0)
        byte[] sendData = new byte[]{(byte) processedValue};
        mUsbConn.bulkTransfer(outEp, sendData, sendData.length, 5000);
    }
}

2. 内置UART的定制设备

针对带硬件串口的安卓设备(如工业平板),直接访问系统串口节点(如/dev/ttyS0),需root权限或系统签名,代码示例:

private OutputStream mSerialOut;
private InputStream mSerialIn;

public void openBuiltInSerial() throws IOException {
    // 打开串口,设置波特率9600,参数8N1
    File serialFile = new File("/dev/ttyS0");
    RandomAccessFile raf = new RandomAccessFile(serialFile, "rw");
    mSerialOut = raf.getOutputStream();
    mSerialIn = raf.getInputStream();
    
    // 写入数据
    mSerialOut.write(processedValue);
    mSerialOut.flush();
}

注:需自行封装串口的打开、关闭逻辑,确保资源及时释放。

二、光照数据处理与存储

基于已实现的传感器读取逻辑,完成数据转换、传输和存储:

1. 数据转换逻辑

在SensorEventListener回调中完成数值转换:

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_LIGHT) {
        float luxValue = event.values[0];
        // 按规则转换为1或0
        int processedData = luxValue >= 50.0f ? 1 : 0;
        
        // 异步发送到UART(避免阻塞主线程)
        new Thread(() -> sendDataViaUART(processedData)).start();
        // 存储数据
        saveLightData(processedData);
    }
}

2. 本地存储方案

方案1:SharedPreferences(适合少量数据)

private void saveLightData(int value) {
    SharedPreferences sp = getSharedPreferences("LightSensorData", MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();
    // 以时间戳为键存储,便于追溯
    editor.putString(String.valueOf(System.currentTimeMillis()), String.valueOf(value));
    editor.apply();
}

方案2:SQLite数据库(适合大量数据统计)

先创建数据库帮助类:

public class LightDbHelper extends SQLiteOpenHelper {
    private static final String DB_NAME = "light_records.db";
    private static final int DB_VERSION = 1;
    private static final String TABLE_RECORDS = "light_data";
    private static final String COL_ID = "_id";
    private static final String COL_VALUE = "data_value";
    private static final String COL_TIMESTAMP = "record_time";

    public LightDbHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createSql = "CREATE TABLE " + TABLE_RECORDS + " (" +
                COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COL_VALUE + " INTEGER NOT NULL, " +
                COL_TIMESTAMP + " INTEGER NOT NULL)";
        db.execSQL(createSql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_RECORDS);
        onCreate(db);
    }

    public void insertRecord(int value) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COL_VALUE, value);
        values.put(COL_TIMESTAMP, System.currentTimeMillis());
        db.insert(TABLE_RECORDS, null, values);
        db.close();
    }
}

调用存储方法:

private void saveLightData(int value) {
    LightDbHelper dbHelper = new LightDbHelper(this);
    dbHelper.insertRecord(value);
}

三、关键注意事项

  • 线程安全:UART读写、数据库操作必须放在子线程,避免ANR
  • 异常处理:串口操作易抛出IO异常,需添加try-catch块,确保流和USB资源及时关闭
  • 权限适配:Android 6.0+需动态申请USB权限,内置串口需确保APP有设备节点访问权限

内容的提问来源于stack exchange,提问作者fedebert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 11:12:07