Я написал C / C ++ приложение (NDK) для Android, которое может открыть виртуальный порт для последовательной связи. Он пишет и читает байты из порта в том же процессе. Пока это работает, и мне не нужно было рутировать мое устройство, чтобы сделать это. Это простая программа, которая выполняет следующие действия:
int fd = open("/dev/ptmx", O_RDWR | O_NOCTTY);
if (fd == -1) {
LOGW("error opening file");
return 1;
}
grantpt(fd);
unlockpt(fd);
char* pts_name = ptsname(fd);
LOGI("ptsname: %s\n", pts_name);
char* inputbyte = "This is a test\n";
char byte;
int numOfBytesWritten = write(fd, inputbyte, strlen(inputbyte));
LOGI("Number of bytes written: %d\n", numOfBytesWritten);
while (read(fd, &byte, 1) == 1) {
LOGI("Byte: %c\n", byte);
}
close(fd);
Теперь проблема в том, что если я хочу сделать то же самое в двух процессах (двух приложениях), это не сработает. Один процесс открывает / dev / ptmx, а другой должен открыть каталог / dev / pts. Каждый раз, когда ведомый пытается открыть каталог / dev / pts, я получаю сообщение об ошибке «ошибка открытия файла» (-1). Я рутировал свое устройство, и оно все еще не работает. У меня есть функция сна после открытия каталога / dev / ptmx, чтобы дождаться ведомого.
Что я должен делать? Есть идеи?
Я решил проблему, поэтому опубликую решение на случай, если кто-то заинтересован:
(1) Ваш телефон должен быть рутирован.
(2) Мастер открывает порт в форме «/ dev / pts / N» (переменная pts_name в этом примере) где N является числом. Этот порт задан:
int fd = open("/dev/ptmx", O_RDWR | O_NOCTTY);
if (fd == -1) {
LOGW("error opening file");
return 1;
}
char* pts_name = ptsname(fd);
LOGI("ptsname: %s\n", pts_name);
(3) Дайте разрешения порту (это можно сделать программно или из оболочки adb). Из оболочки было бы:
(4) Запустите подчиненный, который открывает именно этот порт. Например, int fd = open («/ dev / pts / 4», O_RDWR);
(5) Вуаля!
Других решений пока нет …