В настоящее время я застрял с задачей извлечения данных из декодера, который контролирует 6 совместных положений руки робота. Это устройство имеет интерфейс USB, который работает как последовательное устройство CDC. Набор команд ASCII позволяет хосту конфигурировать каждую ось для разрешения и устанавливать метод доступа. Текущее положение каждой оси выводится в технических единицах или в двоичном формате (в преобразованном виде).
в ASCII) с определенной пользователем скоростью. Протокол команд аналогичен последовательному протоколу USB (вот ссылка на техническое руководство декодера: http://www.soc-robotics.com/pdfs/Quad6X%20Technical%20Manual.pdf)
Используя Ubuntu, это устройство становится устройством ttyACM0, когда я набираю «dmesg» в терминале. Самое большее, что я получил, это использование «screen / 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 и его компилятора. Я нахожусь в своем уме, чтобы понять это, помощь очень ценится.
Основным ресурсом по программированию последовательных каналов в средах POSIX является «Руководство по последовательному программированию для операционных систем POSIX». Обратите внимание, что в случае устройства CDC ACM настраивается не так много. И даже если вы попробуете, устройство может с радостью проигнорировать все, что касается скорости передачи, длины слова и так далее.
На самом деле с CDC ACM то, что вы сделали, уже в основном правильно. Однако вся эта буферизация stdio будет на вашем пути. Свободно добавляя fflush
звонки помогут.