Не могу открыть последовательный порт в g ​​++ в Ubuntu - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь запустить примеры программ, которые поставляются вместе с прибором для лидарного анализа (RPLIDAR A1M8 360 Degree Laser Scanner Kit). Пример кода для цели Linux компилируется без ошибок с использованием g ++ (Ubuntu 7.4.0-1ubuntu1 ~ 18.04.1) 7.4.0, однако, когда я запускаю его, он останавливается с сообщением «Ошибка, не может привязаться к указанному последовательному порту» / DEV / ttyUSB0' . Используя gdb, я могу отследить код до открытого вызова последовательного порта в __libc_open64, где у меня больше нет источника ...

__ libc_open64 (file = 0x5555557832a9 "/ dev / ttyUSB0", oflag = 2306) в ../sysdeps/unix/sysv/linux/open64.c:36‹

36 ../sysdeps/unix/sysv/linux/open64.c: такого файла нет или каталог.

Вот что я до сих пор пытался устранить очевидные режимы сбоев:

  1. Последовательный порт, конвертер USB-to-serial на ttyUSB0, прекрасно работает с Putty (115200, 8, нет, 1, только программное управление потоком). Я подключаю его к Raspberry Pi в качестве консоли для получения большого объема данных без проблем и могу двунаправленно взаимодействовать с консолью. Поэтому я пришел к выводу, что порт и конвертер работают нормально
  2. Раздел кода, который вызывает __libc_open64: ...
bool raw_serial::open(const char * portname, uint32_t baudrate, uint32_t flags) 
{ 
if (isOpened()) close(); 
serial_fd = ::open(portname, O_RDWR | O_NOCTTY | O_NDELAY);

Я посмотрел константы, которые объединены в OR и жестко запрограммированы значение (04403) на случай, если возникла проблема с версией заголовочных файлов. Как ни странно, значение отключено на 1 от значения oflag в строке GDB. Скомпилировал и запустил его, без разницы

Я проверил вызов :: open, возвратил -1, что рассматривается как сбой в коде сразу после

В dmesg я вижу, что ttyUSB0 открыт и доступно

Я не парень с ++. Это выглядит как проблема с кодом g ++ __libc_open64, но это также маловероятно. Я не знаю, где go дальше. Буду признателен за любой совет.

Первые полученные комментарии указывают на разрешения. Я chmoded / dev / ttyUSB0 широко открыт перед началом этого упражнения.

Я запустил strace и вижу строчку ...

openat(AT_FDCWD, "/dev/ttyUSB0", O_ACCMODE|O_NOCTTY|O_NONBLOCK) = -1 ENOENT (No such file or directory)

Ну, это неловко! Возвращает разрешение отказано! Да, я chmoded разрешения широко открыты, а затем быстро забыл, что, будучи USB-устройством, оно исчезает и получает новое определение, когда я снова отключить / подключить его. Спасибо за помощь!

1 Ответ

0 голосов
/ 03 марта 2020

Предсказание, что strace покажет «Отказано в доступе», было верным. Я забыл, что это не фиксированный последовательный порт, а преобразователь USB-последовательный порт. Несмотря на то, что я изменил разрешения и проверил их использование с Putty, я забыл, что, как только я перезагрузил или отключил USB, устройство / dev / ttyUSB0 исчезает и воссоздается заново, когда я перезагружаюсь или подключаю его, требуя, чтобы я снова установите разрешения.

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