Как читать и записывать данные в COM/Serial порты в Android?

Мне нужно читать и записывать данные на COM-порты устройства с помощью android, я использую пакет javax.comm для этого, но когда я установил файл apk, он не отображает порты устройства, так что есть разрешение, которое мне нужно добавить в файл манифеста?

Ответ 1

Ваша проблема связана с операционными системами. Android запускает Linux под капотом, а Linux обрабатывает последовательные порты по-другому, чем Windows. javax.comm также содержит win32com.dll, файл драйвера, который вы не сможете установить на устройство Android. Если вы найдете способ добиться того, что вы пытаетесь сделать, вы фактически не можете найти порт "COM" в среде Linux. Последовательные порты будут иметь разные имена.

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

Итак, гипотетически, если бы ваша идея работала, вам нужно искать эти имена.

К счастью для Android у Android есть условия для взаимодействия с USB-устройствами (с которых я предполагаю, что вы хотите подключиться, в отличие от параллельных или RS-232 портов). Для этого вы настроите свое устройство как USB-хост. Вот что вы хотите сделать:

  • Получить USBManager.
  • Найдите свое устройство.
  • Получить USBInterface и USBEndpoint.
  • Откройте соединение.
  • Передача данных.

Вот моя приблизительная оценка того, как вы это сделаете. Конечно, ваш код будет иметь более зрелый способ делать что-то.

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);

Дополнительный материал для удовольствия от чтения: http://developer.android.com/guide/topics/connectivity/usb/host.html

Ответ 2

Я не эксперт, но для всех тех, кто хочет подключить последовательные порты RS-232 или открыть последовательный порт и не может найти свое устройство через UsbManager, вы можете найти все свои устройства, используя такой подход

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]));
            }
        }

После нахождения всех драйверов переберите все драйверы, чтобы получить все ваши устройства, что-то вроде этого

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]);
                    }
                }
            }

Вот конструктор класса драйверов с двумя переменными-членами

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

Для открытия последовательного порта Вы можете использовать последовательный порт Android Api, просто откройте последовательный порт на своем устройстве и запишите (вы должны знать путь к устройству и скорость передачи, мое устройство ttyMt2, скорость передачи 96000)

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

вместо того, чтобы тратить время на этот код, вы можете загрузить полный проект с https://github.com/licheedev/Android-SerialPort-Tool