странная замена символов между псевдотерминалом и последовательным устройством

У меня есть приложение, в котором я открываю последовательное устройство (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), и с этого момента оно работает как «поток».

Скорее всего, я ошибаюсь, но не могли бы вы дать мне краткое пояснение? Заранее спасибо.

1

Решение

Это похоже на то, как когда вы нажимаете Ctrl + C в терминале, ^C повторяется. Эквивалентное поведение для pty состоит в том, что если символ ASCII, сгенерированный Ctrl + C, то есть, 0x03, записывается в мастер конец, то он возвращается как ^C, то есть, 0x5E 0x03.

Это поведение можно отключить для Ctrl + C и других управляющих символов, отменив ECHOCTL флаг в c_lflag поле терминальных атрибутов.

Вы также можете полностью отключить эхо, отключив ECHO флаг. (Я не был уверен, хочешь ли ты сделать это; мне не было ясно, что ты делаешь)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]