Что означает отсутствие такого устройства или адреса (код ошибки 6) - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь открыть последовательный порт с помощью кода c, и я создал узел с помощью следующей команды;

mknod /tmp/ttyACM0 c 100 0; 
chmod 700 /tmp/ttyACM0;

и затем запустите исполняемый файл, который открывает последовательный порт, следующим способом:

static int OpenSerialPort(const char *bsdPath)
{
int                fileDescriptor = -1;
struct termios    options;

fileDescriptor = open(bsdPath, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fileDescriptor == -1 || flock(fileDescriptor, LOCK_EX) == -1 )
{
    printf("Error opening serial port %s - %s(%d).\n",
           bsdPath, strerror(errno), errno);
    goto error;
}

if (fcntl(fileDescriptor, F_SETFL, 0) == -1)
{
    printf("Error clearing O_NONBLOCK %s - %s(%d).\n",
        bsdPath, strerror(errno), errno);
    goto error;
}

if (ioctl(fileDescriptor, TIOCEXCL, (char *) 0) < 0) {
  printf("Error setting TIOCEXCL %s - %s(%d).\n",
      bsdPath, strerror(errno), errno);
  goto error;
}
memset(&options,0,sizeof(options));

options.c_iflag=0;
options.c_oflag=0;
options.c_cflag=CS8|CREAD|CLOCAL;
options.c_lflag=0;
options.c_cc[VMIN]=1;
options.c_cc[VTIME]=5;
cfsetospeed(&options, B115200);
cfsetispeed(&options, B115200);

if (tcsetattr(fileDescriptor, TCSANOW, &options) == -1)
{
    printf("Error setting tty attributes %s - %s(%d).\n",
        bsdPath, strerror(errno), errno);
    goto error;
}

return fileDescriptor;
error:
if (fileDescriptor != -1)
{
    close(fileDescriptor);
}
exit(1);
return -1;
}

и он возвращается;

Error opening serial port /tmp/ttyACM0 - No such device or address(6).

На самом деле в каталоге / tmp есть файл ttyACM0, но он возвращает мне сообщение об ошибке. Что я могу сделать, чтобы передать эту ошибку?

EDIT: Когда я смотрю на файл / proc / devices, устройства ttyACM0 нет. Теперь я думаю, что причина моей проблемы может быть в этом.

1 Ответ

1 голос
/ 11 апреля 2019

Узел устройства не означает, что устройство действительно существует. Когда вы открываете его, ядро ​​пытается найти подходящее устройство, и если оно не существует, вы получаете сообщение об ошибке выше.

Любая система Linux последнего десятилетия будет автоматически создавать узлы устройств для существующих устройств через udevd. То, что вы должны были создать его вручную, убедительно свидетельствует о том, что устройства вообще не существует, как и говорит ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...