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
相关产品推荐
相关产品推荐

