Как я могу контролировать данные на последовательном порту в Linux? - PullRequest
24 голосов
/ 02 июня 2009

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

Кажется, что это должно быть легко в Linux, где последовательный порт представлен файлом. Есть ли какой-нибудь способ, которым я могу сделать своего рода «двунаправленный тройник», где я говорю своей программе подключиться к каналу, который копирует данные в файл, а также перетасовывает их на / с фактического устройства последовательного порта?

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

Кто-нибудь уже создал такую ​​вещь? Это кажется слишком полезным (для людей, отлаживающих драйверы последовательных устройств), чтобы уже не существовать.

Ответы [ 4 ]

20 голосов
/ 03 июня 2009

strace очень полезен для этого. У вас есть визуализация всех вызовов ioctl с соответствующей декодированной структурой. Следующие опции кажутся особенно полезными в вашем случае:

-e read = set

Выполнить полный шестнадцатеричный и ASCII-дамп всех данных, считанных из файловые дескрипторы, перечисленные в указанный набор. Например, чтобы увидеть все входная активность по файловым дескрипторам 3 и 5 использовать -e читать = 3,5. Обратите внимание, что это не зависит от обычной трассировки системного вызова read (2), который контролируется опцией -e след = читать.

-e write = set

Выполнить полный шестнадцатеричный и ASCII сброс всех данных, записанных в файл дескрипторы, перечисленные в указанном задавать. Например, чтобы увидеть все выходные активность по файловым дескрипторам 3 и 5 используйте -e write = 3,5. Обратите внимание, что это не зависит от обычной трассировки системный вызов write (2), который контролируется опцией -e трассировать = запись.

4 голосов
/ 02 июня 2009

Я обнаружил, что pyserial вполне пригоден для использования, поэтому, если вы в Python, вам не составит труда написать такую ​​вещь.

2 голосов
/ 03 июня 2009

Простым способом было бы написать приложение, которое открылось основная сторона pty и тестируемого tty. Вы бы тогда передать ваше приложение tty подчиненной стороне pty как «устройство tty».

Вы должны будете отслеживать атрибуты pty с помощью tcgetattr() на pty мастер и вызовите tcsetattr() в реальном времени, если атрибуты изменились.

Остальное будет простым select() как для двунаправленного копирования данных fd, так и для копирования их в журнал.

1 голос
/ 26 сентября 2012

Я посмотрел много серийных снифферов. Все они основаны на идее создания виртуального последовательного порта и перехвата данных с этого порта. Однако любые изменения скорости передачи / четности / потока нарушат соединение.

Итак, я написал свой собственный сниффер :). Большинство последовательных портов сейчас представляют собой просто преобразователи USB-последовательный порт. Мой сниффер собирает данные с USB через debugfs, анализирует их и выводит на консоль. Также записываются любые изменения скорости передачи, управление потоком, линейные события и последовательные ошибки. Проект находится на ранней стадии разработки, и на данный момент поддерживается только FTDI.

http://code.google.com/p/uscmon/

...