Как я могу контролировать данные на последовательном порту в Linux?
Я отлаживаю связь с последовательным устройством, и мне нужно увидеть все данные, проходящие в обоих направлениях.
Кажется, что это должно быть легко в Linux, где последовательный порт представлен файлом. Есть ли способ, которым я могу сделать своего рода "двунаправленный тройник", где я говорю своей программе о подключении к каналу, который копирует данные в файл, а также перемещает его в/из реального устройства последовательного порта?
Я думаю, что я даже знаю, как писать такого зверя, но кажется нетривиальным, особенно для того, чтобы получить все ioctls, прошедшие через конфигурацию портов и т.д.
Кто-нибудь уже построил такую вещь? Кажется слишком полезным (для людей, отлаживающих драйверы последовательных устройств) уже не существовать.
Ответы
Ответ 1
strace очень полезен для этого. У вас есть визуализация всех ioctl, с соответствующей декодированной структурой. В вашем случае особенно полезны следующие варианты:
-e read = set
Выполните полное шестнадцатеричное и ASCII дамп всех данных, считанных с файловые дескрипторы, перечисленные в указанный набор. Например, чтобы увидеть все входная активность в файловых дескрипторах 3 и 5 используют -e read = 3,5. Обратите внимание, что это не зависит от обычной трассировки системного вызова read (2), который управляемый опцией -e след = читать.
-e write = set
Выполните полное шестнадцатеричное и ASCII дамп всех данных, записанных в файл дескрипторы, указанные в указанных задавать. Например, чтобы увидеть весь вывод активность файловых дескрипторов 3 и 5 используйте -e write = 3,5. Обратите внимание, что это независимо от нормального отслеживания системный вызов write (2), который управляемый опцией -e трассировать = запись.
Ответ 2
Я нашел pyserial, чтобы быть вполне пригодным для использования, поэтому, если вы используете python, он не должен слишком сложно написать такую вещь.
Ответ 3
Простым методом было бы написать открытое приложение
ведущей стороной pty и тестируемой tty. Тогда вы
передайте приложение tty на подчиненную сторону pty как "устройство tty".
Вам нужно будет отслеживать атрибуты pty с помощью tcgetattr()
на pty
мастер и вызов tcsetattr()
в реальном tty, если атрибуты изменены.
Остальное будет простым select()
как для двух копий, так и для копирования в журнал.
Ответ 4
Я смотрю много серийных снифферов. Все они основаны на идее создания виртуального последовательного порта и sniff-данных из этого порта. Однако любые изменения бод/четности/потока будут прерывать соединение.
Итак, я написал свой собственный сниффер:). Большинство последовательных портов теперь представляют собой только USB- > последовательные преобразователи. Мой сниффер собирает данные с USB через debugfs, анализирует его и выводит на консоль. Также записываются любые изменения скорости, управление потоком, события линии, последовательные ошибки. Проект на ранней стадии разработки и на данный момент поддерживается только FTDI.
http://code.google.com/p/uscmon/