Значение connection.controlTransfer - PullRequest
       20

Значение connection.controlTransfer

1 голос
/ 19 февраля 2020

Я занимаюсь разработкой приложения Android, которое может связываться с mbed через последовательный порт. Но Я понятия не имею, как использовать connection.controlTransfer , который в настоящее время возвращает отрицательное значение. Какое значение я должен установить на этот метод? Я знаю, что это для настройки конфигурации между android и mbed, однако Я не могу понять значения каждого значения . Пожалуйста, дайте мне несколько советов!

Код

Android код приложения

package com.example.pilot_display;

import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbDeviceConnection;
import android.os.Bundle;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbEndpoint;
import android.os.Handler;
import android.os.Looper;
import android.widget.TextView;
import android.widget.Toast;
import java.util.HashMap;

public class MainActivity extends AppCompatActivity {

    UsbDevice myusbdevice;
    UsbManager myusbmanager;
    UsbDeviceConnection connection;
    UsbEndpoint endpoint;
    UsbInterface intf;
    UsbEndpoint readEndpoint;

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

    public void onResume() {
        super.onResume();
        myusbmanager = (UsbManager) getSystemService(USB_SERVICE);
        TextView checker = (TextView) findViewById(R.id.check);

        if (ConnectCheck(checker)) {
            myusbdevice = (UsbDevice) getIntent().getParcelableExtra(UsbManager.EXTRA_DEVICE);

            if (myusbmanager.hasPermission(myusbdevice)) {
                intf = myusbdevice.getInterface(0);
                for (int i = 0; i < intf.getEndpointCount(); i++) {
                    endpoint = intf.getEndpoint(i);
                    if (endpoint.getDirection() == UsbConstants.USB_DIR_IN) {
                        if (endpoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
                            readEndpoint = endpoint;
                        }
                    }
                }
                connection = myusbmanager.openDevice(myusbdevice);
                if (connection.claimInterface(intf, true)) {

                    int baudrate = 9600;
                    byte[] msg = new byte[]{(byte)(baudrate & 255), (byte)(baudrate >> 8 & 255), (byte)(baudrate >> 16 & 255), (byte)(baudrate >> 24 & 255), (byte)0, (byte)0, (byte)8};
                    connection.controlTransfer(33, 32, 0, 0, msg, msg.length, 5000);
                    //this is the very part that I can't understand!

new Thread(new Runnable() {
                        @Override
                        public void run() {
                            while(true) {
                                final byte[] buffer = new byte[30];
                                int bytescounts = connection.bulkTransfer(readEndpoint, buffer, 30, 5000);
                                if (bytescounts >= 0) {
                                    new Handler(Looper.getMainLooper()).post(new Runnable() {
                                        @Override
                                        public void run() {
                                            onRead();
                                        }
                                    });
                                }
                            }
                        }
                    }).start();
                }
            }
        }
    }

    public void onPause() {
        super.onPause();
        myusbmanager = null;
    }

    public void onRead(){
        Toast toast = Toast.makeText(MainActivity.this,"Data received!",Toast.LENGTH_LONG);
        toast.show();
    }

    private boolean ConnectCheck(TextView checker){
        HashMap<String, UsbDevice> deviceList = myusbmanager.getDeviceList();

        if(deviceList == null || deviceList.isEmpty()){
            checker.setText("unconnected");
            checker.setTextColor(Color.RED);
            return false;
        }
        else{
            checker.setText("connected");
            checker.setTextColor(Color.GREEN);
            return true;
        }
    }
}

1 Ответ

0 голосов
/ 06 апреля 2020

ARM mbed реализует USB-протокол CD C -ACM. Вместо того, чтобы реализовать это самостоятельно, вы можете использовать библиотеку типа usb-serial-for- android для доступа к USB-устройству с помощью простого последовательного интерфейса API.

...