LINUX.ORG.RU
ФорумTalks

Отчего COM порты в linux такие странные?

 ,


2

2

Казалось бы, для com порта по умолчанию ожидается что что подашь на один конец, то и вылезет из другого. Всякие навороты включаются дополнительными опциями. И в мире микроконтроллеров так и есть.

Но в Linux не так. По-умолчанию com порты в linux ведут себя по-другому. Они делают всякие дополнительные вещи. Например, очень любят менять 0x0D ('\r') на 0x0A ('\n'). Я долго пытался понять, что за ерунда происходит и почему у меня приходят не те байты, что я посылал. В итоге нашел, что для того, чтобы com порт просто пересылал данные, надо дополнительный настройки делать.

Зачем так сделано?

★★★★★

Последнее исправление: cvs-255 (всего исправлений: 2)

Это не «ком-порт» так себя ведет, а терминальный клиент! Поставь себе tinyserial - все там нормально!! Ну или правильно настрой порт при помощи stty, а потом уж screen запускай.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Нет, я не из терминального клиента обращался к com порту. У меня программа с бинарным протоклом, работающем через com порт

Про stty то я нашел в итоге сам, просто непонятно, почему по-умолчанию он всякие доп действия делает

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 2)

Они делают всякие дополнительные вещи.
Зачем так сделано?

Что сделано? Команды какие? «Кто» именно делает/неделает «дополнительные вещи»?

Deleted
()

Казалось бы, для com порта по умолчанию ожидается что что подашь на один конец, то и вылезет из другого.

Да. При ОДИНАКОВЫХ настройках портов с обоих концов и отсутствии потерь и дефектов преобразований. <---- вот это надо читать несколько раз, до понимания. Интересно, сколько времени требуется среднему программисту, чтобы осознать смысл этой фразы. Жизнь ?

lenin386 ★★★★
()
Последнее исправление: lenin386 (всего исправлений: 1)
Ответ на: комментарий от cvs-255

Ну вот и смотри, что твоя программа делает. Ты наверняка неправильно выставил настройки. Читай man termios

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от lenin386

А вот фиг. Создал 2 связанных pts,

socat -d -d pty pty

$ od -t x1 /dev/pts/12

и делаешь

$ echo -n -e '\x0D' > /dev/pts/13

и из /dev/pts/12 вылезает

0000000 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a 0a
cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Я изначально не выставлял настройки, кроме как 8N1 115200. Т.е. использовал режим по-умолчанию. И выяснилось, что в этом режиме на выходе может быть совсем не то, что на входе

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Да проверь ты получше! Говорю тебе, стопудово есть разница в настройках входа и выхода! «Само» оно никак не может меняться. Разве что у тебя линия связи ужасная и шума много...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Нет, com порт в linux по умолчанию, как выяснилось, находится в canonical mode, где он как раз меняет в том числе 0x0d на 0x0a

И помехи тут ни при чем. Я вот выше пример с двумя связанными pty привел, там вообще никаких помех нет и не может быть

И мне совсем непонятно, зачем так сделано

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 3)
Ответ на: комментарий от cvs-255

/dev/pts/

Это не ком порты. Если хочешь нормальные связанные «виртуальные пары последовательных портов» - используй модуль ядра tty0tty.

kuzulis ★★
()
Ответ на: комментарий от cvs-255

Сделано это затем, что изначально терминалы по последовательному порту подключались! Поэтому они и настроены по умолчанию на 9600N1 canonical mode, т.е. эхо там тоже есть (а то как видеть, что ты набираешь?)!

Как уже сказали, pty — не совсем то, что тебе нужно. Лучше всего экспериментируй с настоящими аппаратными портами...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от cvs-255

еще раз: читай man termios! Отключи canonical mode. Или пользуйся простым клиентом, если не можешь stty порт настроить.

У меня есть простейший самописный терминальный клиент, которого уже несколько разновидностей - все никак не сяду и не напишу полноценный, чтобы скорость и прочие параметры менять можно было через командную строку! Попробуй. Он ничего не заменяет. Только символ q не выводит - это выход. Но есть у меня где-то на завалах гитхаба и клиент, который по ctrl+c завершается + умеет дублировать ввод/вывод в логфайл.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

еще раз: читай man termios! Отключи canonical mode. Или пользуйся простым клиентом, если не можешь stty порт настроить.

Да настроил я все уже. Просто меня очень удивляет, нафига com порт по-умолчанию предпринимает некоторые не самые очевидные замены.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

еще раз: читай man termios! Отключи canonical mode.

Ты отвечаешь на незаданный вопрос ответ на который у ТС уже есть.

torvn77 ★★★★★
()
Последнее исправление: torvn77 (всего исправлений: 1)
Ответ на: комментарий от torvn77

Ну понятно, что такой режим может быть для чего-то нужен. Непонятно, зачем его держать по-умолчанию

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Да хотя бы потому, что обычно «общение» по порту с железякой идет в текстовом формате: смотри те же GPS, монтировки телескопов и т.п. Кому охота заморачиваться с byte order? И очень редко выдумывают на свою пятую точку бинарный протокол. А потом страдают...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Кому охота заморачиваться с byte order? И очень редко выдумывают на свою пятую точку бинарный протокол. А потом страдают...

Текстовый протокол через чистый com порт не гарантирует доставку и корректность.

А значит для надежного обмена нужен некий аналог TCP, но поверх com порта.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

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

Это правильное решение неправильно поставленной задачи. Потому что если вам нужен надёжный обмен, почему вы используете RS ? Сейчас вроде не 1971-й год...

lenin386 ★★★★
()
Ответ на: комментарий от lenin386

Потому что мне сейчас пока лень переделывать железку и подключать к ней ethernet.

К слову, ethernet тоже не гарантирует доставку. Потому поверх него тоже нужен TCP или аналог

Я в итоге сделал реализацию протокола RFC908 (reliable datagram protocol) с некоторыми доработками напильником, работаующую через реализацию datagram через com порт

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 3)
Ответ на: комментарий от Eddy_Em

И очень редко выдумывают на свою пятую точку бинарный протокол.

Ну, это ты очень мощно неправ насчёт «очень редко». По протоколу MODBUS RTU работает до сих пор половина промышленных контроллеров, например. Протокол - полное г-но, но простой СЦК, и до сих пор им мажутся.

lenin386 ★★★★
()
Последнее исправление: lenin386 (всего исправлений: 1)
Ответ на: комментарий от cvs-255

Зачем тебе ethernet? Есть CAN, который не требует никаких мучений с низким уровнем: «оно само» контролирует целостность пакетов. У меня на телескопе так работает система термомониторинга.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от lenin386

MODBUS RTU

Старючее дерьмо мамонта! Но народ в силу своей инерции продолжает ходить по граблям.

Eddy_Em ☆☆☆☆☆
()

В Linux вообще нет COM-портов. Вали обратно на венду!

CYB3R ★★★★★
()
Ответ на: комментарий от lenin386

Можно и поверх голого ethernet TCP сделать

Ethernet обеспечивает передачу датаграмм, для TCP требуется работа поверх протокола, дающего датаграммы.

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Зачем тебе ethernet? Есть CAN,

Не знаю, зачем ему, а мне например ethernet затем, что он легко и нормально заворачивается в оптику, а ваш CAN гвоздями прибит к меди, а медь - когно.

lenin386 ★★★★
()
Ответ на: комментарий от cvs-255

Поэтому желательно заранее выбирать протокол обмена, исходя из длины линии и требований к связи. Но и RS-232 вне особых помех спокойно работает на 30-50-метровых проводах!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Но и RS-232 вне особых помех спокойно работает на 30-50-метровых проводах!

Именно что «вне особых помех», ага.

lenin386 ★★★★
()
Ответ на: комментарий от Eddy_Em

У меня помехи от шаговиков и шпинделя. А значит нужен быстрый протокол с автокоррекцией ошибок. И да, мне нужен дуплекс, т.к. задержки при полудуплексе мне вовсе ни к чему

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от cvs-255

Что ж там за шаговики, что от них помехи мешают RS-232? Мы обычными слабыми (типа NEMA-17) управляли, когда рядом шла полуметровая линия тупого UART'а (то бишь TTL без всяких дифпар и т.п.). И ничего - проблем не было.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Китайские балалайки, вечно глючащие и виснущие. Хотя, весь CAN - это китайские балалайки. Ни одного фирменного адаптера в природе.

lenin386 ★★★★
()
Последнее исправление: lenin386 (всего исправлений: 1)
Ответ на: комментарий от cvs-255

У «псевдо терминалов» урезанный набор ioctl'ов и пр. Если, к примеру, нужна эмуляция сигналов DTR/RTS то pts/pty в пролете.

Кроме того, по личному опыту, связывание при помощи socat хреново работает (по крайней мере для меня, например, быстро открыть/закрыть pts/pty у-во и прочее, часто все это фейлилось) и я перешел полностью на tty0tty, если нужны виртуальные пары.

kuzulis ★★
()
Ответ на: комментарий от lenin386

Скорее китайский USB COM шнурок. Да, помехи не постоянные, но мне нужно, чтобы ВСЕ байты в течении нескольких минут/часов были приняты корректно

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от kuzulis

Если, к примеру, нужна эмуляция сигналов DTR/RTS то pts/pty в пролете.

Ну мне этого и не надо

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от lenin386

весь CAN - это китайские балалайки

При этом работает очень стабильно. У меня никаких глюков за год работы не было!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от cvs-255

Почему сразу шнурок, есть аппаратные COM порты. Но даже в случае кетайских плат, микросхемы UART - фирменные, так что тут нормально. А CAN - это обычно фееричные платы, фееричные драйверы от дяди Ляо, обкуренного.

lenin386 ★★★★
()
Ответ на: комментарий от lenin386

Я хочу сделать так, чтобы можно было с дешевым железом иметь надежную работу за счет алгоритмов

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от lenin386

Реализация протокола собственно вот:

https://github.com/vladtcvs/rdpos

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

Оверхед всего 19 байт на пакет данных.

Осталось реализовать python обертку и отсылку keepalive пакетов по таймеру.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от Harald

Можно. У меня собствено и десктоп есть. Но это же еще место будет занимать лишнее, плюс это рядом с ЧПУ, а значит пыль будет копиться внутри. Ноут все-таки проще от пыли защитить

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от lenin386

Нормальный аппаратный RS-232 можно и по USB организовать — взять ту же PL2303, например! Правда, я не уверен, что кернельный модуль все возможности PL2303 поддерживает.

Ну, как вариант — на дешевенькой STM'ке сделать свое.

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.