Как написать команды на устройство ttyACM0 и получить результирующие информационные данные с помощью C/C++

В настоящее время я застрял в задаче извлечения данных из декодера, который отслеживает 6 положений сустава руки робота. Это устройство имеет интерфейс USB, который работает как последовательное устройство CDC. Набор команд ASCII позволяет хосту настраивать разрешение каждой оси и устанавливать метод доступа. Текущее положение каждой оси выводится в инженерных единицах или в необработанном двоичном формате (преобразованном в ASCII) с заданной пользователем скоростью. Командный протокол аналогичен последовательному протоколу USB (вот ссылка на техническое руководство по декодеру: http://www.soc-robotics.com/pdfs/Quad6X%20Technical%20Manual.pdf)

При использовании Ubuntu это устройство отображается как устройство «ttyACM0», когда я набираю «dmesg» в терминале. Самое далекое, что я получил, это использование «экрана /dev/ttyACM0», и это позволяет мне вводить эти последовательные команды и видеть выходную информацию через терминал, однако это не выполняет задачу, которую я пытаюсь выполнить.

Я пытаюсь написать некоторый код C/C++, который позволил бы программе записывать эти последовательные команды на устройство ttyACM0 для получения информационных данных, которые устройство выводит в результате. Этот код в конечном итоге будет использоваться в ROS, чтобы обеспечить управление с обратной связью по положению в каждом из суставов манипулятора робота с использованием полученных данных.

Это, честно говоря, лучшее, что я мог придумать в слабой попытке записать одну из команд в файл ttyACM0 с информацией, которую я собрал:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp;
    fp = fopen("/dev/ttyACM0", "w");

    if(fp == NULL)
    {
        perror("File failed to open");
        exit(1);
    }

    fprintf(fp, "i");


    fclose(fp);

    return 0;
}

Кто-нибудь знает, как решить эту проблему? Есть ли способ взять код, который позволяет мне делать то, чего я достиг в терминале, но в соответствии с моими потребностями? Я зашел в так много тупиков на форумах, которые рассказывают вам только, как это сделать через терминал или как это сделать для Arduino и его компилятора. Я в своем уме, пытаясь понять это, помощь очень ценится.


person Community    schedule 08.05.2015    source источник
comment
Для начала следует поискать учебники по последовательному программированию и инструкции. Детали будут специфичными для вашего устройства, но сначала вам нужно понять общий подход к работе с последовательными линиями.   -  person lcd047    schedule 08.05.2015
comment
Что сказал lcd047. Вы должны установить скорость передачи данных, длину слова (7 или 8 бит), четность, аппаратное квитирование и т. д. Из оболочки этим можно управлять с помощью команды stty, из C это делается с помощью соответствующих ioctl() / tcsetattr(), последнее является немного более высокий уровень; см. man tcsetattr   -  person wurtel    schedule 08.05.2015


Ответы (1)