У меня есть приложение, в котором я открываю последовательное устройство (GSM-модем) и создаю псевдо-терминал. Я хотел бы прочитать с устройства последовательного порта, отфильтровать данные и отправить их через псевдотерминал, чтобы другой процесс мог прочитать их, как если бы это была простая «необработанная» последовательная линия.
ptFd
— файловый дескриптор псевдотерминала
devFd
— дескриптор файла последовательного устройства
я использую posix_openpt( O_RDWR | O_NOCTTY )
, grantpt(ptFd)
, unlockpt(ptFd)
для псевдо-терминала и множество пользовательских настроек для последовательной линии. Для первой попытки я бы не стал публиковать это здесь, но сделаю, если это поможет кому-нибудь решить эту проблему.
Моя проблема заключается в следующем:
Прочитайте devFd:
056405c0020001009e59
Прочитайте ptFd:
5e45645e45c05e425e405e415e409e59
Прочитайте devFd:
056405c0020001009e59
Прочитайте ptFd:
5e45645e45c05e425e405e415e409e59
Я пишу байты, полученные от устройства на псевдотерминале, и:
05 меняется на 5e45
00 меняется на 5e40
01 изменяется на 5e41
02 меняется на 5e42
Но все байты, не начинающиеся с 0 в шестнадцатеричном виде (> = 16 десятичных), передаются просто отлично.
И прежде всего … когда я пишу на псевдотерминале и читаю с него в одном и том же процессе, он не должен отражать те байты, которые я только что написал на нем, верно?
Я не знаком с этими терминалами, но я представляю, как открываю терминал, получая имя ведомого с помощью функции ptsname. Из другого процесса я могу открыть это имя (например, / dev / pts / 3), и с этого момента оно работает как «поток».
Скорее всего, я ошибаюсь, но не могли бы вы дать мне краткое пояснение? Заранее спасибо.
Это похоже на то, как когда вы нажимаете Ctrl + C в терминале, ^C
повторяется. Эквивалентное поведение для pty состоит в том, что если символ ASCII, сгенерированный Ctrl + C, то есть, 0x03, записывается в мастер конец, то он возвращается как ^C
, то есть, 0x5E 0x03.
Это поведение можно отключить для Ctrl + C и других управляющих символов, отменив ECHOCTL
флаг в c_lflag
поле терминальных атрибутов.
Вы также можете полностью отключить эхо, отключив ECHO
флаг. (Я не был уверен, хочешь ли ты сделать это; мне не было ясно, что ты делаешь)
Других решений пока нет …