Двоичные данные через последовательный терминал
Мой единственный способ связи со встроенным устройством - это последовательный порт. По умолчанию встроенный Linux использует этот порт в качестве терминала. Как отключить этот терминал и использовать последовательную связь для передачи двоичных данных? Я слышал о таких командах, как rx и tx, но не могу их найти.
Я думаю, что я могу просто читать () из и писать () вещи в /dev/tty, но я хочу убедиться, что нет сообщений об ошибках или каких-либо путаницы с моим потоком данных.
6 ответов
Вы можете использовать приложение, такое как 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)
Не забудьте восстановить настройки в конце вашей программы, если вам все еще нужен терминал с хорошим поведением.
Чтобы отключить консоль Linux, вы должны изменить командную строку Linux, создаваемую загрузчиком, из: console=/dev/ttyS? to: console=null
Разве вы не можете просто установить терминал на raw?
Взгляните на этот урок.
Как и другие заметки, есть несколько вещей, которые нужно проверить, собранные здесь:
- Убедитесь, что ядро Linux не использует последовательный порт. Убедитесь, что в команде bootload в вашем файле grub нет опции console =. Это обычно не там по умолчанию.
- Убедитесь, что на последовательном порту не работает getty. Найдите в / etc / inittab запись для /dev/ttyS0 (последовательный порт A) и закомментируйте ее, если она есть.
- Убедитесь, что / dev / ttyS0 доступен для чтения и записи вашим процессом. Вы можете создать конкретного пользователя, под которым запускается управляющая программа и которому принадлежит /dev/ttyS0, а затем chmod 700 /dev/ttyS0. Это поможет убедиться, что другой пользователь / программа также не пытается использовать последовательный порт.
- Используйте open() для ttyS0, чтобы получить fd, затем используйте семейство процедур tcsetattr, чтобы установить скорость и дисциплину линии.
Терминальные программы, вероятно, не будут вам полезны, если вы не сможете запустить ту же программу на встроенном устройстве для управления другим концом соединения.
Вы можете запустить на терминале команду, которая будет передавать данные через протокол уровня приложения. Команды rx и tx, к которым вы обращаетесь для реализации протокола передачи файлов XMODEM. Это может быть решением, если двоичные данные, которые вы хотите передать, состоят из файлов, требования к пропускной способности низкие, и вы не возражаете против административных накладных расходов при выполнении команд. В качестве альтернативы вы можете захотеть мультиплексировать последовательный порт для обработки как передачи данных, так и терминала. Отключите команду драйвера последовательного терминала (getty) и запустите протокол PPP по последовательной линии, чтобы установить IP-соединение с вашим устройством. Затем вы можете войти в устройство через ssh или telnet и передать свои данные через IP-сокет.
Да, все ваши последовательные порты находятся в /dev/ttyxx
, Обратите внимание, что /dev/tty
это ярлык, который обозначает ваш текущий терминал, а не конкретный последовательный порт. Зачастую они принадлежат пользователю root и требуют, чтобы вы либо имели права, либо adm
группа для доступа к устройству прямо из вашего приложения.
Вы можете захотеть chown
устройство, чтобы вы могли получить к нему доступ. Я не уверен, каковы последствия смены владельца устройства; IIRC, это легко сделать и хорошо работает. Альтернатива заключается в использовании setuid
поднять вашу программу в привилегированное состояние.
Там есть программа с именем getty
это позволяет пользователям войти в систему с последовательного порта. Ваш inittab
начнет getty
на последовательных портах, чтобы люди могли войти.
Вы хотите отключить getty
, В некоторых случаях есть менеджер портов, который помогает сделать это.
В некоторых случаях вы можете изменить inittab
использовать mgetty
Разумнее и проще контролировать версию getty
,