Проблемы с USB-последовательным соединением для UBUNTU C

Я пытаюсь управлять сервоприводами из кода C++ на Odroid-U2. У меня есть сервопривод SSC-32 от LynxMotion, подключенный к Odroid с помощью кабеля USB-Serial.

Простые последовательные команды управляют сервоприводами, например, "#n Puuu" с последующим возвратом каретки, где n=номер контакта для сервопривода, а uuu=ширина импульса. Я могу нормально управлять сервоприводами при использовании PUTTY из Odroid, но у меня возникают проблемы при использовании кода C++ для управления сервоприводами. Например, в моем коде я делаю следующее:

fstream f;
f.open("/dev/ttyUSB0");
f << "#0 P600\r";
f.close();

В какой-то момент мне удалось запустить этот код, и сервопривод соответствующим образом пошевелился, но теперь терминал зависает, когда я пытаюсь запустить этот код. Я сузил проблему до строки f.open("/dev/ttyUSB0"), которая препятствует запуску кода. Я предполагаю, что мне нужно каким-то образом настроить порт USB. Я знаю, что мне нужна скорость 115200 бод, и я установил ее соответствующим образом, но я вроде Ubuntu n00b, поэтому я не уверен, какие другие типы конфигураций мне нужны.

Моя версия Linux — Linaro 12.11.

Когда я набираю stty, набор конфигураций не по умолчанию выглядит следующим образом:

speed 115200 baud; line = 0;
-brkint ixoff -imaxbel
-iexten

person Garrison_Laforge    schedule 01.10.2013    source источник


Ответы (1)


Вы не можете полагаться на настройки вашего последовательного порта по умолчанию (и вам не следует пытаться использовать stty для их настройки вне вашей программы). Вы должны написать код в своей программе, который правильно настроит ваш последовательный порт. Для этого вы должны использовать такие функции, как tcsetattr/tcgetattr, cfsetspeed и т. д., см. man termios.

Кроме того, fstream может не предоставить доступ к нужным параметрам функции open(), так как открытие последовательного порта в UNIX должно выполняться с флагом O_NOCTTY.

person Laszlo Valko    schedule 01.10.2013
comment
Это правильно, и вы можете получить больше информации об этом API, посмотрев Руководство по последовательному программированию для операционных систем Posix: cmrr.umn.edu/~strupp/serial.html - person Preston; 02.10.2013
comment
Хорошо, я думаю, что мой код C++ должен был работать раньше, так как PUTTY был открыт в то же время и, вероятно, настроил порт USB. Похоже, у меня есть еще кое-какие исследования. - person Garrison_Laforge; 03.10.2013