The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Конфигурация serial port"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Открытые системы на рабочей станции (Драйверы, оборудование / Linux)
Изначальное сообщение [ Отслеживать ]

"Конфигурация serial port"  +/
Сообщение от anastigmat (ok) on 20-Июн-15, 16:46 
День добрый!

Debian. Через USB-com подключена к компу погодная станция. Не могу подобрать настройки для serial port.
Вот он:
[  391.580060] usb 6-3: new full-speed USB device number 5 using ohci_hcd
[  391.748471] usb 6-3: New USB device found, idVendor=10c4, idProduct=ea60
[  391.748486] usb 6-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  391.748496] usb 6-3: Product: CP2102 USB to UART Bridge Controller
[  391.748504] usb 6-3: Manufacturer: Silicon Labs
[  391.748511] usb 6-3: SerialNumber: 0001
[  391.892057] usb 6-3: reset full-speed USB device number 5 using ohci_hcd
[  392.054853] usb 6-3: cp210x converter now attached to ttyUSB1

Производитель пишет о настройке порта:
Serial communication parameters are:
8 data bits, 1 start bit, 1 stop bit, and no parity.
Default baud rate is 19200

Вот мой конфиг (#:stty -F /dev/ttyUSB1 -a):

speed 19200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig -icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

На посыл в порт 'TEST\n' должен получать ответ 'TEST'
Отсылаю в порт: echo 'TEST' > /dev/ttyUSB1
В ответ тишина...
Пробовал echo -n -e '\x54\x45\x53\x54\x0A' > /dev/ttyUSB1
В ответ тишина...
Ответ ловлю hexdump -C /dev/ttyUSB1 на другой консоли. Под виндой работает исправно, присылает ответ 'TEST'

Какие параметры покрутить stty, чтоб настройки были "зеркальные" винде?
Заранее спасибо.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Конфигурация serial port"  +/
Сообщение от eRIC (ok) on 20-Июн-15, 20:26 
>[оверквотинг удален]
> echoctl echoke
> На посыл в порт 'TEST\n' должен получать ответ 'TEST'
> Отсылаю в порт: echo 'TEST' > /dev/ttyUSB1
> В ответ тишина...
> Пробовал echo -n -e '\x54\x45\x53\x54\x0A' > /dev/ttyUSB1
> В ответ тишина...
> Ответ ловлю hexdump -C /dev/ttyUSB1 на другой консоли. Под виндой работает исправно,
> присылает ответ 'TEST'
> Какие параметры покрутить stty, чтоб настройки были "зеркальные" винде?
> Заранее спасибо.

#ls -al /dev/ttyUSB*
#chmod 666 /dev/ttyUSB1 или #chmod 666 /dev/ttyUSB1

пробовали через minicom -s подключится или через GTKterm?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Конфигурация serial port"  +/
Сообщение от anastigmat (ok) on 21-Июн-15, 13:19 
> #ls -al /dev/ttyUSB*
> #chmod 666 /dev/ttyUSB1 или #chmod 666 /dev/ttyUSB1
> пробовали через minicom -s подключится или через GTKterm?

Пользователь в группе dialout. Пробовал и под рутом. Но chmod сделал, попробовал - проблема не решилась...
#ls -la /dev/ttyUSB1
crw-rw---- 1 root dialout 188, 1 июн 21 11:55 /dev/ttyUSB1
#chmod 666 /dev/ttyUSB1
#ls -la /dev/ttyUSB1
crw-rw-rw- 1 root dialout 188, 1 июн 21 11:55 /dev/ttyUSB1
Миником пробовал, ГТКтерм нет.

Обнаружил новую проблему.
#dmesg | grep 'usb 6-3'

[80071.025171] usb 6-3: USB disconnect, device number 27
[80071.292060] usb 6-3: new full-speed USB device number 28 using ohci_hcd
[80071.461077] usb 6-3: New USB device found, idVendor=10c4, idProduct=ea60
[80071.461088] usb 6-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[80071.461097] usb 6-3: Product: CP2102 USB to UART Bridge Controller
[80071.461105] usb 6-3: Manufacturer: Silicon Labs
[80071.461112] usb 6-3: SerialNumber: 0001
[80071.604057] usb 6-3: reset full-speed USB device number 28 using ohci_hcd
[80071.767439] usb 6-3: cp210x converter now attached to ttyUSB1

И таких переподключений 28, как видно...

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Конфигурация serial port"  +/
Сообщение от anastigmat (ok) on 21-Июн-15, 14:35 
update.

Проверил на другом компе.
[    0.000000] Linux version 3.2.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.6.3 (Debian 4.6.3-14) ) #1 SMP Debian 3.2.65-1

# dmesg | grep -E "(usb|cp210x|ttyUSB0)"

[  207.725854] usb 3-4: new full-speed USB device number 6 using xhci_hcd
[  207.743603] usb 3-4: New USB device found, idVendor=10c4, idProduct=ea60
[  207.743612] usb 3-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  207.743617] usb 3-4: Product: CP2102 USB to UART Bridge Controller
[  207.743622] usb 3-4: Manufacturer: Silicon Labs
[  207.743626] usb 3-4: SerialNumber: 0001
[  207.790922] usbcore: registered new interface driver usbserial
[  207.790968] usbcore: registered new interface driver usbserial_generic
[  207.790970] usbserial: USB Serial Driver core
[  207.799749] USB Serial support registered for cp210x
[  207.799763] cp210x 3-4:1.0: cp210x converter detected
[  207.965746] usb 3-4: reset full-speed USB device number 6 using xhci_hcd
[  207.983071] usb 3-4: cp210x converter now attached to ttyUSB0
[  207.983108] usbcore: registered new interface driver cp210x
[  207.983113] cp210x: v0.09:Silicon Labs CP210x RS232 serial adaptor driver

# stty -a -F /dev/ttyUSB0
speed 19200 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

# ls -la /dev/ttyUSB0
crw-rw---- 1 root tty 188, 0 Июн 21 14:24 /dev/ttyUSB0
# chmod 666 /dev/ttyUSB0
# ls -la /dev/ttyUSB0
crw-rw-rw- 1 root tty 188, 0 Июн 21 14:28 /dev/ttyUSB0


На echo откликается, hexdump считывает, даже какое-то время работает. Потом hexdump прерывается, возвращается в командную строку...
при попытке:

$ hexdump -C /dev/ttyUSB0
hexdump: /dev/ttyUSB0: Отказано в доступе
$ ls -la /dev/ttyUSB0
crw-rw---- 1 root tty 188, 0 Июн 21 14:32 /dev/ttyUSB0

dmesg никаких новых событий не показывает. Кто(что) меняет атрибуты ttyUSB0? Куда копать?


Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Конфигурация serial port"  +/
Сообщение от eRIC (ok) on 21-Июн-15, 15:33 
> На echo откликается, hexdump считывает, даже какое-то время работает. Потом hexdump прерывается,
> возвращается в командную строку...
> при попытке:
> $ hexdump -C /dev/ttyUSB0
> hexdump: /dev/ttyUSB0: Отказано в доступе
> $ ls -la /dev/ttyUSB0
> crw-rw---- 1 root tty 188, 0 Июн 21 14:32 /dev/ttyUSB0
> dmesg никаких новых событий не показывает. Кто(что) меняет атрибуты ttyUSB0? Куда копать?

все действия и считывание с утройства под root выполняете?

скорее всего после переподключения, права теряются. попробуйте создать правило для UDEV типа:
# touch /etc/udev/rules.d/60-ttyUSB.rules
# (прописать в нем правило для ttyUSB* устройств, подставив свою группу и права 0666 или 0777)
KERNEL=="ttyUSB[0-9]*",NAME="tty/USB%n",SYMLINK+="%k",GROUP="tty",MODE="0666"


Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Конфигурация serial port"  +/
Сообщение от anastigmat (ok) on 21-Июн-15, 15:52 
> все действия и считывание с утройства под root выполняете?
> скорее всего после переподключения, права теряются. попробуйте создать правило для UDEV
> типа:
> # touch /etc/udev/rules.d/60-ttyUSB.rules
> # (прописать в нем правило для ttyUSB* устройств, подставив свою группу и
> права 0666 или 0777)
> KERNEL=="ttyUSB[0-9]*",NAME="tty/USB%n",SYMLINK+="%k",GROUP="tty",MODE="0666"

В том то и дело, что права поменялись без переподключения. По крайней мере dmesg ничего о переподключении не указал. Прямо во время считывания с порта hexdump`ом. Считывание прекратилось, hexdump остановился, все вернулось в командную, по ls показал новые права.

Выполнял от простого пользователя, пользователь в группе tty.
Под рутом тоже гонял. Проблем меньше, хотя бы с правами, но все равно нестабильно "отрабатывает" ttyUSB. Те команды, что под виндой работали исправно, под дебианом или через раз срабатывают или вообще не срабатывают. Такое впечатление, что каки либо символы или недопосылает в порт или игнорирует на приеме из порта.
Ушел читать про udev.

Спасибо за участие.

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

7. "Конфигурация serial port"  +/
Сообщение от Аноним (??) on 24-Июн-15, 06:28 
Некоторые посказки:

> равно нестабильно "отрабатывает" ttyUSB.

1. Работать с uart-ами через echo - достаточно проблемное начинание. И там довольно много грабель. Потому что файл девайса, конечно, файл. Но есть нюансы. Напишите какую-нибудь простенькую программу, шелл неважно работает с произвольными бинарными данными и спецсимволами. А чтение из UART имеет некоторую специфику.

2. Анализировать состояние порта логично какой-нибудь более специализированой программой. Скажем jpnevulator. Он дотошно показывает что и как с конкретным портом. Может даже состояния линий flow control и прочее. Поищите в репах по словам типа RS232 или serial.

3. У дебиана таки древнее ядро. И как оно там поддерживает этот конвертор - отдельный вопрос. Ядру 3.2 стукнул не один год, если что.

4. Простой тест работы UART: замкнуть RX и TX и послать что-нибудь. Из-за соединения линий - должно приехать назад то что вы ввели. Удобно делать в терминалке типа picocom (тоже есть в репах). Главное при этом убедиться что терминал не делает локальное эхо. Популярный minicom использовать не советую, если у вас на порту не модем - очень уж minicom переклинен на диалапных модемах. Это сильно мешает во всех остальных случаях.

> Те команды, что под виндой работали исправно,

Вообще не аргумент. COM порт - хоть и файл, но имеет некие тонкие особенности, отличающие его от файлов в файловой системе. И эти особенности в винде и линухе разные.

> Ушел читать про udev.

Там все просто: с одной стороны рулес по которому делается совпадение при событии (например, "добавился девайс", пример вам привели). С этой стороны выражения - сравнеия, позволяющие отфильтровать нужные девайсы и нужные действия по этому поводу. С другой стороны выражения - что делать при наступлении события.

Присвоения прав, вызов программ, создание симлинков, или что там еще. Эти выражения - сравнения (==) и присвоения в си-подобном стиле, "=" (присвоить, т.е. выставить параметр в это значение) или += (добавить к тому что было раньше еще и это).

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

9. "Конфигурация serial port"  +/
Сообщение от anastigmat (ok) on 24-Июн-15, 10:18 
> Некоторые посказки:
> 2. Анализировать состояние порта логично какой-нибудь более специализированой
> рограммой. Скажем jpnevulator.

Нашел - установил - буду пробовать.

> 3. У дебиана таки древнее ядро.

К сожалению  систему не могу выбирать.

> 4. Простой тест работы UART: замкнуть RX и TX и послать что-нибудь.

Если ничего не поможет, то так и сделаю.


>> Те команды, что под виндой работали исправно,
> Вообще не аргумент.

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


>> Ушел читать про udev.
> Там все просто:

Вообще спасибо за советы! Очень путные!

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

10. "Конфигурация serial port"  +/
Сообщение от Аноним (??) on 26-Июн-15, 07:07 
> Нашел - установил - буду пробовать.

Достаточно полезная штука для изучения что вообще происходит. Может показывать не только данные, но и управляющие сигналы и их изменения.

И кстати вот еще какой момент: безбашенным echo и прочим - вы могли ... загадить себе файл девайса. Дело в том что /dev/ttyUSB0 - не только девайс, но и некий СПЕЦИАЛЬНЫЙ файл, реально существующий в файловой системе на диске. Как часть иерархии ФС. А ваше "echo" и прочие "обычные" утилиты - не в курсе что файл СПЕЦИАЛЬНЫЙ. И могут, натурально, снести его куда подальше и создать на месте /dev/ttyUSB ... обычный файл, в который запишут тот же текст из echo. Файловой системе все-равно. Просите нормальный файл по этому пути - сделаем нормальный, значит. Единственная проблема: этот файл ... не будет иметь никакого отношения к UART-ам и вас ждет много интересных открытий. Когда вы будете пытаться читать обычный текстовичок как якобы UART и внезапно обнаружите что творится какая-то фигня. Если терминалки и прочие jpnevulator "глючат" и вопят что не удалось получить статус модемных линий и что там еще - это оно. У простого текстового файла нет модемных линий, IOCTL завалится с ошибкой. Не надо эхать в спецфайлы, это источник грабель. С файлами в /dev вообще стоит поаккуратнее.

Workaround такой ситуации, если это она:
1) Удаляем кривой файл - от рута: rm /dev/ttyUSB0
2) отключите адаптер на CP2102 от компьютера.
3) переподключите адаптер.
4) Убедитесь что /dev/ttyUSB0 пересоздался (таким как изначально задуман).
5) Больше не эхайте в спецфайлы!

А еще, для понимания того что реально происходит в плане системных вызовов - есть хотя-бы strace. Покажет какие системные вызовы были и чем закончились. Может навести на мысли. Если оно отлупляет нечто типа inappropriate IOCTL for device, это хорошая подсказка что идут "неожиданные" файловые операции.

> К сожалению  систему не могу выбирать.

Ну так проверьте что ваш UART для начала работает как надо. CP210x древние и возможно нормально работают даже в этом дебиане.

Как-то примерно так:
1) picocom /dev/ttyUSB0  
(При старте напишет параметры порта, если все ок. Возможно надо будет еще указать правильный baud rate, т.к. не факт что дефолтный - такой какой вам надо)

2) Напечатайте что вы там хотели. Посмотрите приехал ли ответ от вашего девайса.

Если есть какие-то непонятки, делаем тот самый тест UART с замыканием линий: запускаем picocom, CP2102 - не подключен ни к чему. Печатаем. Убеждаемся что ничего не печатается (локального эха нет). Соединяем TX и RX вашего CP2102. Проверяем что теперь - печатается (т.е. то что шлется в TX, прилетает назад по RX). Если это так - ок, порт работает и дело в чем-то другом (baud rate, flow control, кривая работа с портом, ...). Если не ок - напишет в чем проблема. Если не рабтает даже picocom, простой как 5 копеек, то у вас таки проблемы системного характера.

> Если ничего не поможет, то так и сделаю.

Это имеет смысл сделать одной из первых вещей - позволяет понять насколько работает UART, в обе стороны. Если этот тест не прошел - у вас что-то не так и остальное работать и подавно не будет.

> Под виндой сделал за пару часов, а тут борюсь уже пару недель.

Как я уже сказал, винда и линукс - разные вещи. И есть некоторые нюансы. Поэтому если вы будете лезть с виндовым бэкграундом в линух - будете получать граблями по лбу. Примите как данность: Linux - это не еще один вариант винды. Это другая система. И у него свои особенности. Вот файлы девайсов - в том числе. Не стоит в них лишний раз соваться general purpose утилитами, особенно от рута, без четкого понимания последствий.

> То что девайс работает - это точно, затык именно в линухе.

ИМХО затык в том что вы пытаетесь применять виндовый бэкграунд к линуху. А это чревато интересными обломами. Чтобы работать с системой - надо ее все-таки знать.

А чтобы подсмотреть как работать с UART в Linux в явно работающих программах, в дебиане и прочих убунтах есть фирменный чит: apt-get source <какая-нибудь программа работающая с UART>. Желательно маленькая, чтобы разбираться поменьше было. Например, stm32flash (прошивалка STM32 по UART). Или тот же picocom (но он работает с текстовыми данными и не лучшим образом, это отдельный случай и его я не порекомендую). Получите сорц программы, при том - заведомо более-менее рабочей. Позволит посмотеть "а как это делали другие". Вообще, пакетный менеджер и открытый софт - штука хорошая. В винде такой чит не получится, хоть там что.

> Вообще спасибо за советы! Очень путные!

Ну еще бы - я по таким грабелькам уже попрыгал :).

А еще - за неделю можно было бы задолбаться и накормить поисковик очевидными кейвордами. И в первых строках найти что-то типа http://tldp.org/HOWTO/Serial-Programming-HOWTO/index.html - с рассказом что есть UART и с какого бока к нему заходить. Кстати говоря, даже в винде с UART есть свои бестолковости, особенности и грабли. Самая очевидная грабля с которой я столкнулся: винда врет про успех установки baud rate, каким бы он ни был, даже бредовым. Это вынуждает городить нефиговые костыли иной раз. В линухе соотв. вызовы честно отлупляют статус: если порт такой baud не умеет - выставить его и не дадут, собственно.

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

11. "Конфигурация serial port"  +1 +/
Сообщение от anastigmat (ok) on 26-Июн-15, 10:18 
Начну с конца:
Спасибо! Все заработало!
Далее по пунктам.

> И кстати вот еще какой момент: безбашенным echo и прочим - вы
> могли ... загадить себе файл девайса.

Благо обошлось без этого.

> 5) Больше не эхайте в спецфайлы!

Полностью согласен. И не читайте всякими hexdum`пами и cat`ами и иже с ними. Особенно миникомами. Действительно уйму времени угробил, пока понял, что не все они "читают".

> А еще, для понимания того что реально происходит в плане системных вызовов
> - есть хотя-бы strace.

"Опустился" уже в какой-то момен и до неё. Но полностью применить её мощь не позволило недостаточность моих знаний.


> Если есть какие-то непонятки, делаем тот самый тест UART с замыканием линий:

[...]
> Это имеет смысл сделать одной из первых вещей

Это было сделать не тривиально: UART бридж на основе CP210x физически спрятан (впаян) внутри устройства, а не классический кабель-переходник, а разбираться в схемотехнике самого устройства у меня знаний не хватает.


>> Под виндой сделал за пару часов, а тут борюсь уже пару недель.
> Как я уже сказал, винда и линукс - разные вещи. И есть
> некоторые нюансы. Поэтому если вы будете лезть с виндовым бэкграундом в
> линух - будете получать граблями по лбу.

Согласен, но с чего-то начинать нужно.

> Чтобы работать с системой - надо
> ее все-таки знать.

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

> А чтобы подсмотреть как работать с UART в Linux в явно работающих
> программах, в дебиане и прочих убунтах есть фирменный чит: apt-get source
> <какая-нибудь программа работающая с UART>.

Это действительно так. И я так и поступил. Правда влез в stty.

> Или тот же picocom
> (но он работает с текстовыми данными и не лучшим образом, это
> отдельный случай и его я не порекомендую).

И тут можно "плохому" научиться)) Так что не все сорсы одинакого полезны?

>> Вообще спасибо за советы! Очень путные!
> Ну еще бы - я по таким грабелькам уже попрыгал :).

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

> А еще - за неделю можно было бы задолбаться и накормить поисковик
> очевидными кейвордами. И в первых строках найти что-то типа http://tldp.org/HOWTO/Serial-Programming-HOWTO/index.html

Это было одно из первых, что я прочитал. Только без *никсового бекграунда это очень тяжело воспринимается снаскоку. Это теперь я вижу, перечитывая, как все _почти_ очевидно))
И да, работаю в режиме "многозадачности" и конечно чистого времени на эту проблему не пара недель. Просто когда вижу, что мысли начали заходить в тупик, переключался на другую задачу, где "бери лопату и кидай"))

Ну а как решил:
взял в руки что потяжелее, c++ например. Так отконфигурил, вот кусок кода:
      tcgetattr(port.fd, &port.config_old);
      port.config_new=port.config_old;
      port.config_new.c_oflag = 0;
      port.config_new.c_iflag=0;
      port.config_new.c_cflag=CS8|CREAD|CLOCAL;
      port.config_new.c_lflag=0;
      cfsetispeed(&port.config_new, B19200);
      cfsetospeed(&port.config_new, B19200);
      if(tcsetattr(port.fd, TCSAFLUSH,&port.config_new)!=0)
          {
            cout<<"tcsetattr() failed."<<endl;
            return (-1);
          }

Ну а потом select в руки и read. И все заработало.
Параллельно большое спасибо за udev! Так как и сам девайс не подарок. Как оказалось переодически отваливался от компьютера, и премонтировался под разными /dev/ttyUSB#. grep показал, что "USB port nn disabled by hub (EMI?)". Причину EMI искать в устройстве-компе не стал, провода точно хорошие, а внутрь устройства лезть не буду. Прописал в рулезах и теперь постоянно поднимается симлинк с постоянным именем для девайса. Только в удев_рулёзе так и смог команду RUN заставить работать... Пробовал и RUN+="_команда_" и RUN{"_команда_"} все равно не исполняется. Но это уже мелочи.

Еще раз, всем огромное спасибо!

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

12. "Конфигурация serial port"  +/
Сообщение от Аноним (??) on 28-Июн-15, 12:09 
> Спасибо! Все заработало!

Отлично :)

> Благо обошлось без этого.

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

> Полностью согласен. И не читайте всякими hexdum`пами и cat`ами и иже с ними.

Ну это все-таки не совсем обычный файл. Там буферизация, настройки таймаутов, потенциально - процессинг ввода. И какие настройки по дефолту и насколько это то что вы хотели - отдельный вопрос. И в разных системах все это по разному.

> Особенно миникомами.

Он переклинен на диалапных модемах. Терминалка для обзвона BBS-ок. Остальное там - "можно, но сложно".

> Действительно уйму времени угробил, пока понял, что не все они "читают".

Миником ожидает модем. А обычные утили - обычные файлы. Попытки кормить софт не тем чем он ожидал - ни к чему хорошему не ведут.

> мощь не позволило недостаточность моих знаний.

Да там все достаточно просто. Хотя спама может быть многовато. Можно обрубить лишнее, встроенным фильтром или просто каким-нибудь редиректом в grep.

> Это было сделать не тривиально: UART бридж на основе CP210x физически спрятан

Извиняюсь, невнимательно читал что у вас погодная станция. Думал что кабель все-таки отдельно. А с отдельными кабелями бывает много грабель в электрическом уровне, вот я "по инерции" и посоветовал.

> схемотехнике самого устройства у меня знаний не хватает.

На самом деле это не так уж сложно, в том плане что найти надо этот самый CP2102 и посмотреть куда идут его лапки TX и RX (даташит на CP210x - общедоступен). Скорее всего к процу этой штуки, на его UART. В лучшем случае могут быть контактные площадки или даже разъем с UART-ом. Но разбирать готовый девайс и правда как-то не очень.

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

На самом деле я сам когда-то прогрмамил компорты в винде. А теперь в линухе. Они не настолько уж разные. Но отличия все-таки есть. И желание срезать угол на предыдущих знаниях может сыграть дурную шутку иной раз.

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

Ну это на самом деле нечто типа random. Может и получится, в зависимости от. Параметры порта - можно выставить утилитой типа setserial, например. Но изначально ее может в системе и не быть. И мне кажется надежнее явно впрогрмамить заведомо правильные настройки порта и проверять статус операций. Так по крайней мере в случае чего - понятно что не так.

> Это действительно так. И я так и поступил. Правда влез в stty.

Да не принципиально в кого именно, единственное что всякие "терминалы" и т.п. - могут использовать "канонический" процессинг текста, а насколько вы хотели это при работе с произвольным девайсом - отдельный вопрос.

> И тут можно "плохому" научиться)) Так что не все сорсы одинакого полезны?

Как написано в том мануале на который я сослался, есть канонический ввод, ориентированый сугубо на построение терминалок. И есть неканонический, где система не пытается умничать и делать строки из того что строками может и не являться. По понятным причинам, с произвольными данными работать надо в неканоническом режиме. Если этот момент упустить - можно удивляться тому что данные "портятся".

> Уже тоже имееться своя узкая тропинка, усыпаная грабельками...

Да на самом деле там не все так страшно, особенно если подсмотреть у кого-нибудь заведомо работающего как это делать.

> Это было одно из первых, что я прочитал.

Даже так? Про это можно было бы упомянуть :)

> Только без *никсового бекграунда это очень тяжело воспринимается снаскоку.

Я бы не сказал что я - такой уж крутой *никсовый программер. Там вроде все достаточно логично написано и не то чтобы мне требовался при чтении этого какой-то бэкграунд.

> И да, работаю в режиме "многозадачности" и конечно чистого времени на эту
> проблему не пара недель. Просто когда вижу, что мысли начали заходить
> в тупик, переключался на другую задачу, где "бери лопату и кидай"))

А, ну понятно :). А я то удивлялся - как за 2 недели можно не найти тот how to и что там в нем 2 недели читать. Я то в него более-менее въехал ну может часа за 2.

> взял в руки что потяжелее, c++ например. Так отконфигурил, вот кусок кода:

...
> Ну а потом select в руки и read. И все заработало.

Ну вот я тоже как-то так предпочитаю :). Там ничего особо страшного.

> Параллельно большое спасибо за udev! Так как и сам девайс не подарок.
> Как оказалось переодически отваливался от компьютера,

Вот это уже может быть глюками старого ядра. Как бы там ни клялись про стабильность фанаты дебиана, мне ядра до 3.10 в плане работы usb не очень нравятся. На самом деле, чипы и чипсеты в мамках - достаточно бажные. А драйвера наполовину состоят из "quirks" и воркэраундов глюков чипов. Одна из причин по которым я не люблю старые ядра - чем новее ядро тем о большем количестве нестандартных закидонов чипов оно знает и знает как правильно выходить из таких штопоров или вообще не допускать их.

> и премонтировался под разными /dev/ttyUSB#.

Ну да, если ttyUSB0 уже занят, очередной адаптер сядет на ttyUSB1, и так далее.

> grep показал, что "USB port nn disabled by hub (EMI?)". Причину
> EMI искать в устройстве-компе не стал, провода точно хорошие,

Тогда может быть это какие-то глюки чипа или чипсета а относительно старый кернел не все воркэраунды содержал.  С другой стороны, качество проводов для usb на глаз прикинуть тоже нелегко. Это скоростная дифференциальная пара, там волновое сопротивление роялит и прочие отражения сигнала. На глаз это проверить не то чтобы просто.

> симлинк с постоянным именем для девайса.

Вариант. Заодно можно какое-то более логичное название девайса дать. Скажем /dev/weatherstation. Из недостатков: прога будет по идее сталкиваться с ошибками чтения когда девайс отпал. Но если написать там переоткрытие порта - работать по идее будет. Хоть это и костыль и по хорошему так быть не должно.

> Только в удев_рулёзе так и смог команду RUN заставить работать...

Я в правилах обычно пользуюсь чем-то типа: RUN+="/usr/bin/program %k" (отдает /usr/bin/program как argv[1] параметр %k, который "название девайса по мнению ядра"). Да, там надо указывать ПОЛНЫЙ путь к программе. И там не будут работать всякие фичности шелла типа перенаправлений или раскрытия wildcard, насколько я помню. Это просто выполнение программы а не шелл. Но можно передать кучу параметров и прочая. Путь к программе - ***обязательно*** полный. А примеры подсмотреть можно в системных правилах, их немеряно в каком-нибудь /lib/udev/rules.d/ :)

> все равно не исполняется.

Странно, у меня исполняется. Например, на нотике я делаю как-то так:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNEL=="wlan*", RUN+="/usr/bin/macchanger -r %k"

Этот рулес при появлении сетевого устройства "wlan*" в системе - запускает программу macchanger, которая ставит на указанном интерфейсе (%k - имя девайса по версии ядра) рандомный MAC. Небольшой подарок любителям слежки за перемещениями людей через отслеживание MAC в периодических probe requests :P. Или "как запилить это более честно чем apple" :)

> Еще раз, всем огромное спасибо!

Да не за что - приятно помочь сообразительному человеку.

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

6. "Конфигурация serial port"  +/
Сообщение от kostya_from_berdsk on 23-Июн-15, 12:42 
> Под виндой работает исправно,
> присылает ответ 'TEST'
> Какие параметры покрутить stty, чтоб настройки были "зеркальные" винде?
> Заранее спасибо.

В винде кодировка CP1551, строки обычно заканчиваются кодами 10,13 возврат каретки, перевод строки.
С портом в дебиане Вы работаете в UTF-8 и строки заканчиваются только возврат каретки

https://ru.wikipedia.org/wiki/п÷п╣я─п╣п╡п╬п╢_я│я┌я─п╬п╨п╦

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

8. "Конфигурация serial port"  +/
Сообщение от Аноним (??) on 24-Июн-15, 06:30 
А еще может быть например flow contorl не соответствующий действительности. Скажем если по дефолту аппаратный, но сигналы никто не дергает - передача встрянет навечно, т.к. ожидаемые изменения сигналов никогда не приедут.
Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2023 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру