LINUX.ORG.RU

Linux теряет данные с последовательного порта

 ,


0

5

Приветствую.

Есть master-девайс. Orange PI.

Есть slavesecondary-девайс. Гибридный инвертор.

Между ними установлена связь через встроенный последовательный порт Апельсинки, забинденный на /dev/ttyS0. Естественно все systemd-подсеры и прочее отключено.

Протокол обмена - modbus, хотя не суть. Работает это так: шлем в /dev/ttyS0 команду, читаем /dev/ttyS0 до символа /r - это значит мы получили строку.

Последнее время строка перестала прилетать полностью. Проблема не в программе, проверяется это простым способом: открываем две консоли, в одной screen /dev/ttyS0 2400, в другой echo "команда" > /dev/ttyS0. Даже в скринах видно, что строка прилетает, но она прилетает не полной.

Я бы мог грешить на сам инвертор, но - после ребута Апельсинки - все работает отлично, включая две консоли со screen.

Кто знает - есть ли в Линуксах какой-то скрытый неизвестный сервис, который может перехватывать последовательный порт?

★★★★★

Че такое подсеры?

А есть возможность поглядеть что данные приходят правильные? Ну там осциллограф, логический анализатор?

А если апельсин ку поменять на что-нибудь для теста? А если использовать usb-uart с этой же платой?

pihter ★★★★★
()

Ну посмотрите вывод ″lsof /dev/ttyS0″, может там ваш процесс и болтается.

Ещё можете смотреть tx/rx счётчики (/proc/tty/driver/serial или другой файл в этом каталоге), если uart-драйвер на малинке их поддерживает. И перед/после каждой команды смотреть изменение счётчиков.

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

Че такое подсеры?

serial-getty service

А есть возможность поглядеть что данные приходят правильные? Ну там осциллограф, логический анализатор?

Данные приходят, скажем так.

А если апельсин ку поменять на что-нибудь для теста? А если использовать usb-uart с этой же платой?

USB-UART работает, и даже на этой Апельсинке с этой же программой.

Мне кажется что этот порт занимается чем-то консольным, только никак не пойму чем.

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

Ну посмотрите вывод ″lsof /dev/ttyS0″, может там ваш процесс и болтается.

Ещё можете смотреть tx/rx счётчики (/proc/tty/driver/serial или другой файл в этом каталоге), если uart-драйвер на малинке их поддерживает. И перед/после каждой команды смотреть изменение счётчиков.

Благодарствую !

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

Зачем тебе getty на этом порту? Зачем ты вообще какие-то телодвижения делал? Драйвер загрузил, порт появился, всё, пользуйся. tty этот и жрет твои байты, когда успевает.

Нет, так оно не работает, во всяком случае с Debian.

Порт есть, но по дефолту конкретно этот порт (а мне вот прям хочется этот - UART0) используется консолью, пока в systemd не поотключать это.

Я на это напоролся еще когда клиппер на 3д-принтер ставил. Там на Апельсинке UART'ы выведены два через распберри-подобную гребенку, и один на трех пинах. Вот хочу использовать три пина, и все =)

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

Нет, Modbus работает не так. Читай спецификацию.

Modbus не имеет отношения ни к Апельсине, ни к моей проблеме. Я же говорю, все отлично обменивается до определенного момента, после которого запросы принимаются, но ответ приходит не полностью.

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

Вот хочу использовать три пина, и все =)

АААА! ТАк ты про эти три пина – так там ядерная консоль. Отключи в raspbian_config.txt или как там его.

А вообще, имхо, переехать на уарт1 на гребенку и проблемы нет как класса

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

достаточно конвертора уровней, этого

Китайцы делают клон за три копейки. А еще к пулсвью подходит RPi Pico в качестве лог анализатора. Задача решена навеки за 200 руб!

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

Подключись к ним, пинам, внешним уарт-терминалом и ребутни борду – посыпется выхлоп убута и линукса, если я прав. В таком случае придется еще и убут ковырять, чтоб он туда не шумел

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

Есть только один 100% рабочий способ решить эту проблему. Нужно переписать на php. Что переписать? Всё!

Оно и написано на PHP.

https://ibb.co/Fbq0T3sR

И не вижу причин переписывать это на каком-то другом языке.

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

ну так возьми не апельсинку и проверь

Я там писал выше. Все идеально работает, даже на данной Апельсинке, если вставить переходник RS232->USB.

С этим же софтом.

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

Осциллограф уже советовали подключить?

К чему именно? К RX? Ну логично что на этот пин прилетают данные. Они прилетают даже если светодиод подкинуть. Проблема же в отображении, а не в данных.

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

АААА! ТАк ты про эти три пина – так там ядерная консоль. Отключи в raspbian_config.txt или как там его.

Так отключил. И включил.

Но что-то видимо перехватывает управление портом. Пока избавился от этого периодическим переоткрыванием его - хз почему, но работает.

Загрузилась Апельсина. Открыл две консоли, в одной скрины в другой шелл.

Несколько раз послал команду. В скринах ответ.

Немного подождал.

Послал заново. В скринах пол-ответа (не только в них, но скринами я абстрагировался от своих возможных косяков).

Запустил мою программу, где грубо говоря порт открывается и закрывается.

Послал опять команду. В скринах ответ.

Чё за нафиг - хз, но костыль работает.

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

Оно и написано на PHP.

И не вижу причин переписывать это на каком-то другом языке.

Естественно, ведь если у тебя в руках молоток, всё остальное становится похожим на гвозди.

В твоих темах чётко виден один сюжет: кроме php ты ничего не знаешь, но считаешь всё остальное говном. Но в итоге говном оказывается твой код.

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

Естественно, ведь если у тебя в руках молоток, всё остальное становится похожим на гвозди.

Пхп вполне катит как скриптовый язык общего назначения, какие к нему вопросы?

Но в итоге говном оказывается твой код

Тебе ненависть глаза заливает, там не в коде проблема, а в администрирование, с юсб свистом код же работает, да и сложно там написать чтоб не работал)

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

В твоих темах чётко виден один сюжет: кроме php ты ничего не знаешь, но считаешь всё остальное говном. Но в итоге говном оказывается твой код.

Screen и echo написаны на С.

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

Ну, если lsof не палит, кто ещё открывает /dev/ttyS0, то можно auditd настроить. Чтобы он логировал, кто открывал это файл. Конечно, лучше, на всякий случай, сделать чтобы auditd фильровал по типу файла (character special) и его MAJOR MINOR, но не знаю, можно ли так сделать.

P.S. У вас из параметров ядра (/proc/cmdline) убрана ″console″ на этом ″/dev/ttyS0″ или ″serial0″?

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

Ну, если lsof не палит, кто ещё открывает /dev/ttyS0, то можно auditd настроить.

Просто переинициализирую порт. Пока работает.

P.S. У вас из параметров ядра (/proc/cmdline) убрана ″console″ на этом ″/dev/ttyS0″ или ″serial0″?

root=UUID=1351aef6-01b9-4461-9662-6f631c24f65e rootwait rootfstype=ext4 splash=verbose console=tty1 hdmi.audio=EDID:0 disp.screen0_output_mode=1920x1080p60 consoleblank=0 loglevel=0 ubootpart=746abd60-01 ubootsource=mmc usb-storage.quirks=0x2537:0x1066:u,0x2537:0x1068:u sunxi_ve_mem_reserve=0 sunxi_g2d_mem_reserve=0 sunxi_fb_mem_reserve=16 cgroup_enable=memory

windows10 ★★★★★
() автор топика
  1. Порт может перехватывать ModemManager из состава NetworkManager.
  2. Серийный порт в Linux это TTY, со всеми последствиями. Убедитесь, что перевели его в RAW-режим (проверьте stty), иначе к нему будут применяться преобразования.
  3. Может, включён XON/XOFF?
ValdikSS ★★★★★
()