Двоичные данные через последовательный терминал - PullRequest
5 голосов
/ 03 февраля 2009

Мой единственный способ связи со встроенным устройством - это последовательный порт. По умолчанию встроенный Linux использует этот порт в качестве терминала. Как отключить этот терминал и использовать последовательную связь для передачи двоичных данных? Я слышал о таких командах, как rx и tx, но не могу их найти.

Я думаю, что я могу просто читать () из и писать () вещи в / dev / tty, но я хочу убедиться, что нет сообщений об ошибках или чего-либо другого, связанного с моим потоком данных.

Ответы [ 6 ]

3 голосов
/ 03 февраля 2009

Вы можете использовать приложение типа xmodem для передачи файла через любой терминал. Является ли последовательный порт, с которого вы говорите, с терминала, или это также консоль ядра.

Если ваше ядро ​​не шумит, то вы можете использовать свое текущее соединение, чтобы сделать xmodem как передачу. На стороне хоста вы можете использовать kermit, который хорош и подходит для сценариев.

Если вы хотите сделать ваш последовательный порт необработанным, и у вас открыт файловый дескриптор ttyfd, Вот один из способов сделать это:

struct termios tty, orig_tty;

...

if(tcgetattr(ttyfd, &tty) < 0)
{
    // error checking
}
// backup tty, make it raw and apply changes
orig_tty = tty;
cfmakeraw(&tty);
if(tcsetattr(ttyfd, TCSAFLUSH, &tty) < 0)
{
    // error checking
}

...
//end of program or error path :
tcsetattr(ttyfd, TCSAFLUSH, &orig_tty)

Не забудьте восстановить настройки в конце вашей программы, если вам все еще нужен терминал с хорошим поведением.

3 голосов
/ 03 февраля 2009

Чтобы отключить консоль Linux, вы должны изменить командную строку Linux, создаваемую загрузчиком, из: Консоль = / Dev / TTYs? к: консоль = нуль

3 голосов
/ 03 февраля 2009

Разве вы не можете просто установить терминал на raw?

Посмотрите этот урок .

2 голосов
/ 09 февраля 2009

Как видно из других заметок, есть несколько вещей, которые можно проверить здесь:

  1. Убедитесь, что ядро ​​Linux не использует последовательный порт. Убедитесь, что в команде bootload нет опции console = в вашем файле grub. Обычно его там нет по умолчанию.
  2. Убедитесь, что на последовательном порту не работает getty. Найдите в / etc / inittab запись для / dev / ttyS0 (последовательный порт A) и закомментируйте ее, если она там есть.
  3. Убедитесь, что ваш процесс может читать / писать / dev / ttyS0. Вы можете создать конкретного пользователя, под которым запускается управляющая программа и которому принадлежит / dev / ttyS0, затем chmod 700 / dev / ttyS0. Это поможет убедиться, что другой пользователь / программа также не пытается использовать последовательный порт.
  4. Используйте open () для ttyS0, чтобы получить fd, затем используйте семейство процедур tcsetattr, чтобы установить скорость линии и дисциплину.

Терминальные программы, вероятно, не будут вам полезны, если вы не сможете запустить ту же программу на встроенном устройстве для управления другим концом соединения.

2 голосов
/ 03 февраля 2009

Вы можете запустить на терминале команду, которая будет передавать данные через протокол уровня приложения. Команды rx и tx, к которым вы обращаетесь для реализации протокола передачи файлов XMODEM . Это может быть решением, если двоичные данные, которые вы хотите передать, состоят из файлов, требования к пропускной способности низкие, и вы не возражаете против административных накладных расходов при выполнении команд. В качестве альтернативы вы можете мультиплексировать последовательный порт для обработки как передачи данных, так и терминала. Отключите команду драйвера последовательного терминала (getty) и запустите протокол PPP по последовательной линии, чтобы установить IP-соединение с вашим устройством. Затем вы можете войти на устройство через ssh или telnet и передать свои данные через IP-сокет.

1 голос
/ 03 февраля 2009

Да, все ваши последовательные порты находятся в /dev/ttyxx. Обратите внимание, что /dev/tty - это ярлык, обозначающий текущий терминал, а не конкретный последовательный порт. Зачастую они принадлежат пользователю root и требуют, чтобы у вас были права или входить в группу adm для доступа к устройству напрямую из вашего приложения.

Возможно, вы захотите chown устройства, чтобы вы могли получить к нему доступ. Я не уверен, каковы последствия смены владельца устройства; IIRC, это легко сделать и хорошо работает. Альтернативой является использование setuid для перевода вашей программы в привилегированное состояние.

Есть программа с именем getty, которая позволяет пользователям входить через последовательный порт. Ваш inittab запустит getty на последовательных портах, чтобы люди могли войти в систему.

Вы хотите отключить getty. В некоторых случаях это помогает менеджер портов.

В некоторых случаях вы можете изменить inittab на mgetty, который является более умной и простой в управлении версией getty.

...