В настоящее время я застрял в задаче извлечения данных из декодера, который отслеживает 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 и его компилятора. Я в своем уме, пытаясь понять это, помощь очень ценится.
stty
, из C это делается с помощью соответствующихioctl()
/tcsetattr()
, последнее является немного более высокий уровень; см.man tcsetattr
- person wurtel   schedule 08.05.2015