web-dev-qa-db-fra.com

Comment lire et écrire des données sur des ports COM / série sous Android?

Je dois lire et écrire des données sur les ports COM de l'appareil en utilisant Android, j'utilise le package javax.comm pour cela, mais lorsque j'ai installé le fichier apk, il n'affiche aucun port de l'appareil, donc y a-t-il une autorisation que je besoin d'ajouter dans le fichier manifeste?

13
piks

Votre problème concerne les systèmes d'exploitation. Android exécute Linux sous le capot , et Linux traite les ports série différemment de Windows. javax.comm contient également win32com.dll, un fichier de pilote , que vous ne pourrez pas installer sur un appareil Android. Si vous trouvez un moyen de réaliser ce que vous essayez) pour ce faire, vous ne pouvez pas réellement rechercher un port "COM" dans un environnement Linux. Les ports série porteront des noms différents.

 Windows Com Port   Linux equivalent  
      COM 1           /dev/ttyS0  
      COM 2           /dev/ttyS1
      COM 3           /dev/ttyS2 

Donc, hypothétiquement, si votre idée devait marcher, vous devez chercher ces noms.

Heureusement pour vous, Android a des dispositions pour l'interfaçage avec des périphériques USB (auxquels je suppose que vous souhaitez vous connecter, par opposition aux ports parallèles ou RS-232). Pour ce faire, vous devrez définir votre appareil en tant que SB Host. Voici ce que vous voudrez faire:

  1. Obtenez un USBManager.
  2. Trouvez votre appareil.
  3. Obtenez USBInterface et USBEndpoint .
  4. Ouvrez une connexion.
  5. Transférer des données.

Voici mon estimation approximative de la façon dont vous allez le faire. Votre code aura, bien sûr, une façon plus mature de faire les choses.

String YOUR_DEVICE_NAME;
byte[] DATA;
int TIMEOUT;

USBManager manager = getApplicationContext().getSystemService(Context.USB_SERVICE);
Map<String, USBDevice> devices = manager.getDeviceList();
USBDevice mDevice = devices.get(YOUR_DEVICE_NAME);
USBDeviceConnection connection = manager.openDevice(mDevice);
USBEndpoint endpoint = device.getInterface(0).getEndpoint(0);

connection.claimInterface(device.getInterface(0), true);
connection.bulkTransfer(endpoint, DATA, DATA.length, TIMEOUT);

Matériel supplémentaire pour votre plaisir de lecture: http://developer.Android.com/guide/topics/connectivity/usb/Host.html

21
gobernador

Je ne suis pas un expert mais pour tous ceux qui cherchent à connecter des ports série RS-232 ou à ouvrir un port série et ne peuvent pas trouver leur appareil via UsbManager, vous pouvez trouver tous vos appareils en utilisant une approche comme celle-ci

mDrivers = new Vector<Driver>();
LineNumberReader r = new LineNumberReader(new FileReader("/proc/tty/drivers"));
        String l;
        while ((l = r.readLine()) != null) {
            String drivername = l.substring(0, 0x15).trim();
            String[] w = l.split(" +");
            if ((w.length >= 5) && (w[w.length - 1].equals("serial"))) {
                mDrivers.add(new Driver(drivername, w[w.length - 4]));
            }
        }

Après avoir trouvé tous les pilotes, parcourez tous les pilotes pour obtenir tous vos appareils, quelque chose comme ça

mDevices = new Vector<File>();
            File dev = new File("/dev");

            File[] files = dev.listFiles();

            if (files != null) {
                int i;
                for (i = 0; i < files.length; i++) {
                    if (files[i].getAbsolutePath().startsWith(mDeviceRoot)) {
                        Log.d(TAG, "Found new device: " + files[i]);
                        mDevices.add(files[i]);
                    }
                }
            }

Voici le Driver Class Constructor avec deux variables membres

public Driver(String name, String root) {
        mDriverName = name;
        mDeviceRoot = root;
    }

Pour ouvrir un port série, vous pouvez utiliser Android Serial Port Api simplement ouvrir le port série sur votre appareil et écrire (vous devez connaître le chemin de votre appareil et le débit en bauds, mon appareil est ttyMt2, avec le débit en bauds) 96000)

 int baurate = Integer.parseInt("9600");
 mSerialPort = new SerialPort(mDevice.getPath(), baurate, 0);
        mOutputStream = mSerialPort.getOutputStream();
        byte[] bytes = hexStr2bytes("31CE");
        mOutputStream.write(bytes);

au lieu de perdre du temps sur ce code, vous pouvez télécharger le projet complet depuis https://github.com/licheedev/Android-SerialPort-Tool

1
Muhammad Ali