2

我为 Android 编写了一个 C/C++ 应用程序 (NDK),它可以打开一个虚拟端口进行串行通信。它在同一进程中从端口写入和读取字节。到目前为止,这是可行的,我不必为了做到这一点而根植我的设备。这是一个简单的程序,它执行以下操作:

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 目录后我有一个睡眠功能,以便等待从机。

我应该怎么办?有任何想法吗?

4

1 回答 1

3

我已经解决了这个问题,所以我会发布解决方案以防其他人感兴趣:

(1) 你的手机应该已经root了。

(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 shell 完成)。从外壳将是:

  • chmod 666 pts_name(例如 chmod 666 /dev/pts/4)。

(4) 执行正好打开这个端口的从机。例如 int fd = open("/dev/pts/4", O_RDWR);

(5) 瞧!

于 2016-09-16T14:59:56.263 回答