Android USB主机连续处理数据

时间:2019-05-27 20:46:10

标签: android usb usb-hostcontroller

我正在使用Arduino从机器中获取一些数据并将其发送到Android应用。设备打开时我的应用程序启动(单应用程序设备)。我想在应用启动时开始获取和处理从Arduino接收到的数据,即使用户正在进行其他活动,也不要停止。

我正在从BroadcastReceiver类创建对象的方法,但不确定这是否是最合适的解决方案,因为如果MainActivity结束,则对象本身也会结束。

AndroidManifest:

<receiver android:name="com.myapp.producao.ArduinoBroadcastReceiver"
  android:enabled="true">
  <intent-filter>
    <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/>
  </intent-filter>
</receiver>

ArduinoBroadcastReceiver:

public class ArduinoBroadcastReceiver extends BroadcastReceiver {

    long new_signal;
    long last_signal = System.currentTimeMillis();
    long countCycle;
    private String TAG = this.getClass().toString();
    private static final String ACTION_USB_PERMISSION = "com.myapp.producao.USB_PERMISSION";

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        Log.d(TAG, "Started");
        Log.d(TAG, context.toString());
        Log.d(TAG, intent.toString());
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
                UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 
                Log.d(TAG, "VendorID: " + device.getVendorId());
                Log.d(TAG, "DeviceName: " + device.getDeviceName());
                Log.d(TAG, "ProductID: " + device.getProductId());
                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    if (device != null) {
                        UsbManager UsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
                        UsbDeviceConnection connection = UsbManager.openDevice(device);
                        UsbSerialDevice serialPort = UsbSerialDevice.createUsbSerialDevice(device, connection);
                        if (serialPort != null) {
                            if (serialPort.open()) { 
                                serialPort.setBaudRate(9600);
                                serialPort.setDataBits(UsbSerialInterface.DATA_BITS_8);
                                serialPort.setStopBits(UsbSerialInterface.STOP_BITS_1);
                                serialPort.setParity(UsbSerialInterface.PARITY_NONE);
                                serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF);
                                serialPort.read(datareceived);
                                Log.d(TAG, "Ciclo");

                            } else {
                                Log.d(TAG, "PORT NOT OPEN");
                            }
                        } else {
                            Log.d(TAG, "PORT IS NULL");
                        }
                    } else {
                        Log.d(TAG, "PERM NOT GRANTED");
                    }
                }
            }
        } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
            Log.d(TAG, "Attached");
        } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
            UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
            Log.d(TAG, "Detached");
            if (device != null) {

            }
        }


    UsbSerialInterface.UsbReadCallback datareceived = new UsbSerialInterface.UsbReadCallback() {
        @Override
        public void onReceivedData(byte[] arg0) {
                String data = new String(arg0, StandardCharsets.UTF_8);
                int pino = Integer.parseInt(data.substring(1,2));
                int estado = Integer.parseInt(data.substring(2,3));
                handleResult(pino, estado);
        }
    };
}

也许我对类,如何以及何时创建该对象并使之保持活动状态(只要应用程序正在运行)感到困惑。 有想法吗?

0 个答案:

没有答案