Чтение устройства Linux с помощью fstream - PullRequest
0 голосов
/ 20 мая 2011

Я пытаюсь получить обратную связь от некоторого оборудования, которое используется через USB TMC и SCPI.Я могу читать и записывать на устройство, используя /dev/usbtmc0 в C ++ [io] fstream, чередуя чтение и запись для отправки и получения сообщений.Большинство команд заканчиваются одной новой строкой, поэтому легко узнать, когда получен конец ответа.Упрощенный код, который я использую для этого:

fstream usb;
usb.open("/dev/usbtmc0", fstream::in);
if (usb.good())
{
    string output;
    getline(usb, output);
    usb.close();
    // do things with output
}
// additional cleanup code...

Однако есть одна вещь, которая ускользает от меня, и она определена в спецификации SCPI / IEEE как "* LRN?".После отправки подключенное устройство отправит обратно произвольные данные (фактические формулировки из спецификации), которые можно использовать для последующего перепрограммирования устройства, если оно перейдет в странное состояние.

Проблема с ответным сообщениемэта команда LRN состоит в том, что она содержит один или несколько символов новой строки.Он действительно завершает все сообщение новой строкой, но тот факт, что есть встроенные новые строки, делает работу действительно сложной.Некоторое оборудование префиксует полезную нагрузку длиной, а некоторые - нет.

При чтении данных с оборудования в драйвер ядра Linux usbtmc встроен тайм-аут на 5 секунд, который блокирует любые вызовы чтения, если выпопробуйте прочитать прошлое, что доступно.Использование fstream :: eof, похоже, не возвращает ничего полезного.Это действует как сокет.Есть ли способ, которым я могу прочитать все данные на устройстве, не зная о его длине, обрыве и избегая времени ожидания ядра?

1 Ответ

2 голосов
/ 20 мая 2011

Проблема с использованием fstream для этого заключается в том, что fstream имеет внутреннюю буферизацию, нет никакой корреляции 1: 1 между вызовами fileOps->read устройства и fstream операциями.

Для взаимодействия с драйверами устройств вам действительно необходимо использовать низкоуровневые функции open, read, write из unistd.h и fcntl.h.

...