2016-12-16 7 views
1

Я пытаюсь программировать робота, который имеет motordrivers на определенные последовательные порты (т.е. ttyS9)Запись в последовательный порт в Linux

через cutecom (как шестнадцатеричный вход), я могу отправить следующий вход, который дает мне результат я ожидаю:

5aaa0700fffff000 

Сейчас я пытаюсь добиться того же результата с помощью программы C, что делает следующее:

int port9 = open("/dev/ttyS9", O_RDWR | O_NONBLOCK); 

char buff[17] = "5aaa0700fffff000"; 

write(port9, buff, 16); 

Я также попытался инициализировать buff с шестигранными значениями отдельно:

buff[0] = 0x5; 
buff[1] = 0xa; 

и т.д. и т.п.

Оба не работают. Является ли проблема в моем коде или в драйвере?

Скомпилировать, используя gcc, а затем запустить его с помощью sudo. Функция open также возвращает правильные значения (без ошибок), а также запись.

+0

См. [Ask] и укажите [mcve]. И не запускайте такой код, как admin. – Olaf

ответ

4

Заполнение массива символов строками преобразует символы в их представление ascii, а не hex, как вам нужно.

char buff[17] = "5aaa0700fffff000"; // Incorrect for saving 0x5aaa0700fffff000 to buff 

Как я вижу, вы хотите записать 8 байт 0x5aaa0700fffff000 на последовательный порт, полукокс 8bit (1 байт), и вы должны отправить 8 байт не 16, так что код должен быть что-то вроде этого

buff[0] = 0x5a; 
buff[1] = 0xaa; 
... 
write(port9, buff, 8); 
+0

Спасибо, это работает! Тем не менее, я обнаружил, что он работает только при открытии cutecom, который открывает ttyS6 или ttyS9, а затем работает только для этих портов соответственно. Любая идея, как это возможно? –

+0

Мы не знаем, использует ли OP кодировку ASCII. И мы также не знаем, использует ли OP символы. Фактически использование терминальной работы является индикатором, который может быть символом. – Olaf

+0

@ bart-kn - Вдоль строк того, что говорит Олаф ... это работает, когда вы вручную * набираете * эту последовательность из последовательного терминала? И вам нужно нажать 'Enter' или' Return', чтобы команда работала? Если * да * для обоих этих вопросов, у вас может отсутствовать символ конца строки или символы конца строки. Либо '' \ r'', '' \ n'', либо '' \ r \ n "'. Если это так, вам может потребоваться отправить что-то вроде 'char buff [18] =" 5aaa0700fffff000 \ n "'. –

-1

но, возможно, это число так что вам нужен unsigned long long int t= 0x5aaa0700fffff000; write(.., (char *)&t, 8);

это означает, что порядок байт в памяти полностью отличаются от одного вы получите только с присваивающими байтами, как вы читаете его с экрана.

+0

..., который будет вызывать Undefined Behavior ... long long int, вероятно, длиной 64 бит, но наверняка не 128 бит – LPs

+0

@LPs: 'long long' ** ** не менее ** 64 бит. Он может очень хорошо иметь 128 или более бит. – Olaf

+0

это комментарий, а не ответ. – Olaf

Смежные вопросы