2009-02-03 4 views
5

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

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

ответ

3

Вы можете использовать приложение, такое как 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

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

Посмотрите на this tutorial.

2

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

1

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

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

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

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

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

3

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

2

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

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

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

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