Мне нужно читать и записывать данные на COM-порты устройства с помощью android, я использую пакет javax.comm для этого, но когда я установил файл apk, он не отображает порты устройства, так что есть разрешение, которое мне нужно добавить в файл манифеста?
Как читать и записывать данные в COM/Serial порты в Android?
Ответ 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