Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: хитрый СОМ порт  (Прочитано 47155 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
dimedrol
Помогающий

ru
Offline Offline

« : 18-05-2010 05:14 » 

День добрый. Столкнулся с таким неоднозначным результатом в процессе тестирования СОМ порта под Linux Debian Etch. В порт вставляется заглушка RX<->TX, после чего делаю:
Код:
cat /dev/ttyS0 > ./log &
echo "12345" > /dev/ttyS0
в результате наблюдаю непрерывно растущий файл log, содержимое его выглядидт следующим образом:
Код:
12345

12345


12345





и т.д. короче строка постоянно повторяется с всевозрастающим числом переносов строк. Я проверил такую же комбинацию команд на том что было под рукой -  qnx 6.3 - результат нормальный, т.е. в файле log просто строка 12345.
Интересно что это значит, это такая особенность работы команды cat или что-то еще?
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 18-05-2010 05:52 » 

dimedrol, ttyS0 - это не просто последовательный порт - это терминал. К самому каналу могут подключаться различные дисциплины. Т.ч. нужно писать программу: открывать устройство, конфигурить его и только потом работать.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
dimedrol
Помогающий

ru
Offline Offline

« Ответ #2 : 18-05-2010 05:55 » 

ясно, спасибо, RXL, буду конфигурить.
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 18-05-2010 05:58 » 

Читай pinfo libc - раздел  Low-Level Terminal Interface. Нужно перевести терминал в неканонический режим.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Maksir
Постоялец

ru
Offline Offline

« Ответ #4 : 08-10-2011 03:26 » 

У меня вопрос.
Есть программа для звонков (школа), она взаимодействует с /dev/ttyS0. загружает расписание на табло через компорт. Но расписание в программе позволяет забивать звонки только на сутки, потом расписание повторятся. А нужно делать расписание на неделю.

Мне интересно, есть ли способ прослушать комп порт, что бы записать поток в текстовый файл?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 08-10-2011 05:56 » 

Прослушать на уровне RS232 - легко. Нужен компьютер с одним или двумя COM-портами - в зависимости от того, собираешься ли ты снифить трафик в одном или в двух направлениях. Подключай так: GND - GND, Rx снивера - Tx слушаемого порта. Скорость и битовые настройки порта придется подобрать эмпирически или подсмотреть в исследуемой программе.

Прослушать на уровне драйвера - надо уметь писать драйверы под Linux.

Есть непроверенная идея - подменить устройство ttyS0 на псевдотерминал и замкнуть трафик через свою программу. Тогда сможешь не только снифить, но и подменять данные.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Maksir
Постоялец

ru
Offline Offline

« Ответ #6 : 08-10-2011 07:27 » 

Благодарю.

т.е. проснифить, как обыкновеную сетку... очень экзотично.
Попробую подменить ttyS0 на обычный файл, что-то не сообразил. спасибо за идею.
Ещё забыл, можно же вообще опросить устройство, может там что всплывёт.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 08-10-2011 08:27 » 

Нет-нет - не на обычный файл - на псевдотерминал! Обычные файлы не поддерживают вызовы ioctl, специфичные для терминалов, и имеют другое поведение в операциях ожидания ввода-вывода.
Почитай, что такое pts (псевдотерминал). Это двунаправленный байтовый канал типа unix-сокета, но имеющий API, аналогичный терминалу.

Ну и еще один способ - гибрид вариантов 1 и 3: пропустить трафик через свою машину с двумя портами.
« Последнее редактирование: 08-10-2011 08:30 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Maksir
Постоялец

ru
Offline Offline

« Ответ #8 : 08-10-2011 12:13 » 

Мне бы просто понять, на что это похоже)

/etc/inittab мне может помочь в этом? Либо нужно написать скрипт такого типа;
(но только для устройства ttyS0)

The standard STREAMS system calls can access the pseudo-tty devices. The slave devices support the O_NDELAY and O_NONBLOCK flags. 
EXAMPLES =)
Код:
int    fdm fds;
char   *slavename;
extern char *ptsname();

fdm = open("/dev/ptmx", O_RDWR);  /* open master */
grantpt(fdm);                     /* change permission of       slave */
unlockpt(fdm);                    /* unlock slave */
slavename = ptsname(fdm);         /* get name of slave */
fds = open(slavename, O_RDWR);    /* open slave */
ioctl(fds, I_PUSH, "ptem");       /* push ptem */
ioctl(fds, I_PUSH, "ldterm");     /* push ldterm*/
Взято здесь

Код мне понятен. Но что-то я слаб ещё в C++. Где тут mail() и заголовочные файлы - библиотеки ? =)
И что-то не особо ясно, как эта тулза будет осуществлять вывод из потока данных порта

Может ссылка есть, именно по моему вопросу?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 08-10-2011 15:29 » 

Maksir, ...

1. inittab тут не при чем
2. Если понимаешь код, то попробуй написать программу.
3. Это не C++ — это С.

Попробуй поиском поработать — может твою задачу уже давно решили.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #10 : 08-10-2011 15:35 » new

У меня вопрос.
Есть программа для звонков (школа), она взаимодействует с /dev/ttyS0. загружает расписание на табло через компорт. Но расписание в программе позволяет забивать звонки только на сутки, потом расписание повторятся. А нужно делать расписание на неделю.

Мне интересно, есть ли способ прослушать комп порт, что бы записать поток в текстовый файл?

Как вариант - сделать n файлов - по количеству учебных дней в неделе, и основной загружаемый (можно обойтись и без него), прописать замену загружаемого по cron-у (или сделать n-записей для каждого дня недели, или просто более-менее интеллектуальный скрипт), там-же, если надо, и выполнить загрузку нового расписания через /dev/ttyS0.
Записан
Maksir
Постоялец

ru
Offline Offline

« Ответ #11 : 08-10-2011 16:32 » 

Как вариант - сделать n файлов - по количеству учебных дней в неделе, и основной загружаемый (можно обойтись и без него), прописать замену загружаемого по cron-у (или сделать n-записей для каждого дня недели, или просто более-менее интеллектуальный скрипт), там-же, если надо, и выполнить загрузку нового расписания через /dev/ttyS0.
Еслиб всё так просто, через crond =)

1. имеется табло (бегущая строка) , в ней встроен таймер для звонков (вприципе всё равно, что подключать). К табло имеется специальная "программулинка" написанная косолапой лапой, которая запускается из под wine, да ещё и старый com-порт ей нужен. Эта строка у нас висит в холле, на вахте. Производство Россия. В общем-то разрабатывалась она для школ. Я даже связывался с производителем, что бы мне дали этот код, либо что-нибудь, что бы создать какой-нибудь шаблон. Но производитель, кроме своей "советской марки" в виде вот это худой проги написанной на Бейсике, ничего не смог предложить.

2. В том и дело, что - прогамма, когда запускается, сразу щупает ком-порт, и опрашивает его, загружая из него существующее расписание звонков. И только тогда можно туда мышой вдолбить новое расписание - на четверг. И вся эта возня каждую субботу вечером. У меня палец скоро посинеет. - просто, кроме меня на школе, это никто не умеет делать, и не станет. Либо ручное управление по четвергам... а это вообще никого не устраивает.

Легче было бы новую прогу написать, только вот вся загвоздка в том, что я не знаю, что эта программа посылает в порт (производитель тоже не вкурсе). Знаю только, что вроде бы туда посылаются AT-команды, как на модем, но что это может быть и в каком формате я это и хочу выяснить.

RXL а разве на C чего-то пишут? просто, я думал, что C++ это просто улучшеный и расширеный язык С. Или просто стандарт другой?

1. Вринципе, если бы было возможно сделать, что бы действительно - через cron как-то задействовать порт, что бы он например - включал и выключал, то можно было бы сделать свой включатель. Ну, всмысле - крон включает порт, а он приводит в действие цепь (только я себе это не представляю, там же 220в.). не знаю, как это можно сделать. Могу лоток CD выдвинуть по расписанию чере cron, что бы тот на рычажок нажимал))
Табло разобрать, мне совесть не позволяет (хотя, если директор разрешит). Может какой-то электронный переключатель есть в КИТе, что бы от ком-порта точно так работал?

Наверное же, есть какие-то приборы, с которых можно свинтить такую чтучку?
В табло стоит чип какой-то, который приводит в действие этот переключатель. Другой вопрос, еслиб был какое -нибудь устройство умеющее разговаривать с com-портом напрямую, какой-нибудь влючатель светильника например...
Что-то мне на ум ничего не приходит. - Включить порт, выключить - вот и всё, что требуется впринципе. Тогда можно сделать самодельное устройство по типу часовой бомбы, как в "крепком орешке")))
Либо порт прослушать, что бы понять, что ему туда засылать нужно.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #12 : 08-10-2011 18:34 » 

Wireshark умеет слушать usb порты. Может быть можно его натравить и на COM порт. Я не испытывал.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 08-10-2011 19:18 » 

Цитата: Maksir
Могу лоток CD выдвинуть по расписанию чере cron, что бы тот на рычажок нажимал))
Гениально. (Серьёзно. Для людей, не дружащих с паяльником, но желающих, чтобы что-то физически включалось или выключалось компьютером.)
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 08-10-2011 19:25 » 

Вспомнил тут еще один метод: запустить программу через утилиту strace. Да, будет огроменный лог, но после некоторой тренировки вполне можно научиться делать его меньше и информативнее и получить через него нужную информацию.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
DneprSMV
Помогающий

kz
Offline Offline
Пол: Мужской

« Ответ #15 : 08-10-2011 19:30 » 

dimedrol
за линукс ничего сказать не могу, но наверное есть нечто подобное как в QNX
Смотри утилиты настроек сериального устройства
В QNX есть утилита stty - дает настройки на /dev/ser1 итд. (их там много)
в том числе режим управления потоком, квитирования, упр. сигналов интерфейса RS232
#stty baud=9600 +DTR +RTS -ohpaged </dev/ser1  (кажется так)
Это для работы с устройством из кода С, без терминальной обработки (режим RAW)
т.е. для работы нужно заранее настроить порт и возможно терминал, привязанный на порт.
Кажется так, мог чевой забыть, уже года 2 не в теме.
Записан

"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 08-10-2011 19:32 » 

DneprSMV, вопрос не в настройках порта. Он не знает протокола и хочет его перехватить. А уж как его потом применить - дело десятое. Кстати, вопрос задал Maksir.

Еще вариант до кучи: поставить на той Linux-машине виртуалку, на нее винду и запускать программу оттуда. Скажем, для VirtualBox или VMware можно указать вместо последовательного порта использовать указанную программу. Ну и так же - пропустишь через себя трафик, соберешь лог и найдешь в нем логику.
« Последнее редактирование: 08-10-2011 19:39 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
DneprSMV
Помогающий

kz
Offline Offline
Пол: Мужской

« Ответ #17 : 08-10-2011 19:33 » 

dimedrol
решение задачи "по тупому"
поставь на конвейер и фильтруй чево там лишнее  Улыбаюсь
(например sed)

Добавлено через 22 минуты и 59 секунд:
Maksir,
для просмотра протокола желательн заранее знать, он текстового формата или бинарный.
Если текстовый, то вариант проще, если бинарный - то сложнее.
К томуже если используется минимальное шифрование, то задача усложняется на пару порядков.
Как вариант предлагаю взять любую терминальную программу под Win (я пользуюсь Qmodem), позволяющую выводить принимаемый траф. в hex-формате и писать в лог.
Если будет просматриваться структура-анализ - идти дальше.
Если надо просмотреть оба направления TxRx - использовать 2 программы и 2 порта  Улыбаюсь
Альтернатива - использовать сниффер готовый или самому на С написать (режим фильтра или "подслушки").
« Последнее редактирование: 08-10-2011 19:56 от DneprSMV » Записан

"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
Maksir
Постоялец

ru
Offline Offline

« Ответ #18 : 10-10-2011 11:41 » 

Благодарю! =)
Я всё попробую. Просто я не каждый раз с компом на вахте) попробую. спасибо!

Вот ещё, нарыл всяких кодов на C++, пока не тестил. Но интересно, что вы скажите;

Процедура инициализации порта RS-232 в Linux/GCC
http://www.anthillsolutions.com/cpp.html

И вот ещё интересный вариант, но очень лохматый; (там что-то про тестирование)
http://www.comptechdoc.org/os/linux/programming/c/linux_pgcserial.html

Ну а остальные так, для windows там всяких разных.

Спасибо!
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 10-10-2011 12:15 » 

Maksir, первую ссылку одобрям - вполне достаточно.
Мои пять копеек: https://forum.shelek.ru/index.php/topic,26486.msg269788.html#msg269788
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Maksir
Постоялец

ru
Offline Offline

« Ответ #20 : 10-10-2011 13:34 » 

Maksir, первую ссылку одобрям - вполне достаточно.
Мои пять копеек: https://forum.shelek.ru/index.php/topic,26486.msg269788.html#msg269788

Благадарю!
Большое спасибо!
Всё, пошёл примерять партянки =)


Добавлено через 1 день, 2 минуты и 25 секунд:
По-моему я чего-то выловил..
RX - утилита strace

Значит, делал так;

1. pacman -Ss strace
2. pacman -S strace
=)
3. strace --help
4. wine zvonki.exe
5. ps ax | grep wine (выбрал тот pid, где wine взаимодействует с портом -p 2869)
6. strace -p 2869 -o logwine (порт на прослушке)
7. Нажимаю в меню управления расписанием - "обновить". Идёт поток на /dev/ttyS0 - утилита всё записывает в файл, который я задал logwine

Ох..рен..есть!  Улыбаюсь)

Теперь бы разобрать, что это было. =)

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

Цитата
gettimeofday({1318335971, 905944}, NULL) = 0
epoll_wait(9, {{EPOLLIN, {u32=13, u64=13}}}, 128, 27909) = 1
gettimeofday({1318335976, 335713}, NULL) = 0
epoll_ctl(9, EPOLL_CTL_MOD, 28, {0, {u32=13, u64=13}}) = 0
poll([{fd=28, events=POLLIN}], 1, 0)    = 1 ([{fd=28, revents=POLLIN}])
write(22, "\314\3712\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 16
epoll_wait(9, {{EPOLLIN, {u32=7, u64=7}}}, 128, 23479) = 1
gettimeofday({1318335976, 336095}, NULL) = 0
read(20, "\271\0\0\0\0\0\0\0\0\0\0\0\210\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64
write(21, "\0\0\0\0\0\0\0\0,\0\2\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64
epoll_wait(9, {{EPOLLIN, {u32=7, u64=7}}}, 128, 23478) = 1
gettimeofday({1318335976, 336291}, NULL) = 0
read(20, "\221\0\0\0\0\0\0\0\0\0\0\0,\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64
write(21, "\0\0\0\0\0\0\0\0,\0\2\0,\0\2\0\27\0\0\0\30\0\0\0\1\200\0\0\1\0\0\0"..., 64) = 64
epoll_wait(9, {{EPOLLIN, {u32=7, u64=7}}}, 128, 23478) = 1
gettimeofday({1318335976, 336474}, NULL) = 0
read(20, "{\0\0\0\0\0\0\0\0\0\0\0\30\0\0\0\2\0\0\0\0\0\0\0,\0\2\0\6\0\0\200"..., 64) = 64
write(67, "T\3623\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 16
write(21, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64
epoll_wait(9, {{EPOLLIN, {u32=7, u64=7}}, {EPOLLIN, {u32=52, u64=52}}}, 128, 23478) = 2
gettimeofday({1318335976, 336723}, NULL) = 0
read(20, "\265\0\0\0\0\0\0\0\0\0\0\0\t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64
write(21, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64
read(65, "~\0\0\0\0\0\0\0\0\1\0\0\1\0\377\4\0\0\0\0\0\0\0\0\377\377\377\377\0\0\0\0"..., 64) = 64
write(66, "\0\0\0\0\0\0\0\0,\0\2\0\6\0\0\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64
epoll_wait(9, {{EPOLLIN, {u32=7, u64=7}}, {EPOLLIN, {u32=52, u64=52}}}, 128, 23478) = 2
gettimeofday({1318335976, 337155}, NULL) = 0
read(20, "\273\0\0\0\0\0\0\0\0\0\0\0\210\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64
write(21, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64
read(65, "~\0\0\0\0\0\0\0\0\1\0\0\1\0\377\4\0\0\0\0\0\0\0\0\377\377\377\377\0\0\0\0"..., 64) = 64
write(66, "\3\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64
epoll_wait(9, {{EPOLLIN, {u32=7, u64=7}}, {EPOLLIN, {u32=52, u64=52}}}, 128, 23477) = 2
gettimeofday({1318335976, 337659}, NULL) = 0
read(20, "\225\0\0\0\0\0\0\0\374\1\0\0\0\0\0\0,\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64
writev(21, [{"\0\0\0\0 \0\0\0\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64}, {"\210\0\1\0\224\0\1\0\204\0\1\0\202\$
read(65, "\30\0\0\0,\0\0\0\0\0\0\0\4\0\0\0T\3623\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64
read(65, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 44) = 44
write(66, "\3\1\0\0\0\0\0\0\377\377\377\377\377\377\377\177\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64
epoll_wait(9, {{EPOLLIN, {u32=7, u64=7}}}, 128, 23477) = 1
gettimeofday({1318335976, 338205}, NULL) = 0
read(20, "\221\0\0\0\0\0\0\0\0\0\0\0\204\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64

Это лог вот этого процесса (повторно перезаупстил - pid теперь другой, компорт через переходник на USB. т.е. ttyUSB0 это и есть компорт, так как на нём переходник, - программа взаимодействует через этот переходник)
# ps ax | grep wine
 3764 ttyUSB0  Ss+    0:00 /usr/bin/wineserver
 3770 ?        Sl     0:00 C:\windows\system32\winedevice.exe MountMgr                                      
 3786 pts/0    S+     0:00 grep wine

Что делать с этим логом? Что-то мне не всё понятно.

-------

По кодам пробовал, не получилось (да не разобрался я, но очень хотелось, что бы овладеть хоть каким-то навыком - для работы было бы очень полезно)
Дело в том что, - программа на C вырубает порт из под программы, которую я хочу прослушать. Ну вот, не знаю как с этим бороться. Выход один, - создать паралельное устройство. Но только я не знаю как это делается.
« Последнее редактирование: 11-10-2011 13:37 от Maksir » Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #21 : 11-10-2011 13:39 » 

Протокол, что Вы привели, это список системных вызовов, которые выполнил wine по требованию zvonki.exe. В нём частично есть данные, которые читаются и выводятся, но судя по всему - не все. Общий формат: системный_вызов(параметры, системного, вызова) = результат_выполнения
для чтения/записи это число прочитанных/записанных байт, для операции открытия файла - номер файлового дескриптора.

Можно посмотреть можно-ли strace настроить, чтобы полностью сохранял данные для write()/read, и так-же посмотреть по протоколу который из файловых дескрипторов Вас интересует(это первый параметр read() и write()) узнать его можно поискав выше по тексту open("/dev/ttyUSB0") или нечто похожее..

К сожалению wine не пользовался, но судя по тому, что нашел в inet-е, можно в локальной папке dosdevices подменить ссылку comX -> /dev/ttyUSB0 на просто файл (если получится, там можно будет увидеть все данные, что выводились) или, если так просто не получится - на псевдотерминал.
« Последнее редактирование: 11-10-2011 13:44 от darkelf » Записан
DneprSMV
Помогающий

kz
Offline Offline
Пол: Мужской

« Ответ #22 : 11-10-2011 13:47 » 

Maksir,
выводит лог, но чтоб понять, желетельно чтобы выдавало не в десятичном, а в шестнадцатиричном-hex.


Добавлено через 9 минут и 12 секунд:
Maksir,
ps - если нужно решить задачу (анализ протокола), и сэкономить время - надо:
1. использовать второй ПК с Windows
2. Подключиться аппаратно к линии обмена между твоими устройствами (если надо, подскажу).
3. На пк (п.1) запустить программу-терминалка QmodemPro,
- настроить ее на нужную скорость и режим обмена (неизвестно, используются ли в обмене CTS-RTS, DTR-DSR, XON-XOFF, скорее всего - нет )
- настроить режим вывода/эмуляции терминала на hex-debug
- включить режим записи в лог.
4. запустить обращение по линии связи, смотреть в онлайн что будет на экране.
5. Проанализировать
-----------
Кому не нравится, прошу не пинать, просто делюсь опытом как на мой взгляд сделать проще всего.
По крайней мере, для начала.
« Последнее редактирование: 11-10-2011 13:56 от DneprSMV » Записан

"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #23 : 11-10-2011 14:03 » 

Maksir, в лог пишутся не все данные. Смотри опции strace. Там же можно поставить фильтр на список системных вызовов.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Maksir
Постоялец

ru
Offline Offline

« Ответ #24 : 11-10-2011 14:04 » 

Протокол, что Вы привели, это список системных вызовов, которые выполнил wine по требованию zvonki.exe. В нём частично есть данные, которые читаются и выводятся, но судя по всему - не все. Общий формат: системный_вызов(параметры, системного, вызова) = результат_выполнения
для чтения/записи это число прочитанных/записанных байт, для операции открытия файла - номер файлового дескриптора.

Можно посмотреть можно-ли strace настроить, чтобы полностью сохранял данные для write()/read, и так-же посмотреть по протоколу который из файловых дескрипторов Вас интересует(это первый параметр read() и write()) узнать его можно поискав выше по тексту open("/dev/ttyUSB0") или нечто похожее..

К сожалению wine не пользовался, но судя по тому, что нашел в inet-е, можно в локальной папке dosdevices подменить ссылку comX -> /dev/ttyUSB0 на просто файл (если получится, там можно будет увидеть все данные, что выводились) или, если так просто не получится - на псевдотерминал.
1. понял, я там поправил в посте.
файл я не весь выложил, просто для наглядности. Если я ничего не делаю, а программа strace слушает порт, то пустой файл выглядет так;
# cat log
gettimeofday({1318339754, 504864}, NULL) = 0
epoll_wait(9,  <unfinished ...>

open("/dev/ttyUSB0") - там такого нет. это же просто лог.

2. wine запускает программу, которая ищет COM1 устройство. Следовательно на ноутбуке у себя я сделал так;
ln -s /dev/ttyS0 /dev/ttyUSB0

/dev/ttyUSB0 - это теперь COM1, так как я воткнул туда переходник.

3. У меня никаких мыслей по поводу "псевдотерминала". Я не знаю, как его настроить. =)
Если есть что почитать, я бы не отказался.

DneprSMV, спасибо, попробую.
(просто Windows у меня нет. но я придумаю что-нибудь)
как это - "аппаратно"? - значит на прямую, но я чего-то не догоняю...
скорость 9600
Записан
DneprSMV
Помогающий

kz
Offline Offline
Пол: Мужской

« Ответ #25 : 11-10-2011 14:15 » 

Maksir,
аппаратно - это надо подключиться проводками дополнительной машинкой с Win (или любой другой системой, где можно запустить терминалку с выводом в hex).
Проводков - 3:  Корпус, Gnd, Rx.  Ошибаться низзя, можно спалить порт(ы).
Если есть на той же ПК свободный порт (не USB, a RS232) и терминалка с выводом в HEX - тоже можно посмотреть.
Если надо, напишу подробнее.

Записан

"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #26 : 11-10-2011 14:22 » 

1. понял, я там поправил в посте.
файл я не весь выложил, просто для наглядности. Если я ничего не делаю, а программа strace слушает порт, то пустой файл выглядет так;
# cat log
gettimeofday({1318339754, 504864}, NULL) = 0
epoll_wait(9,  <unfinished ...>

open("/dev/ttyUSB0") - там такого нет. это же просто лог.


Странно, у меня есть. Попробуйте поискать open("/dev/ttyS0");

для вызова cat /dev/ttyS0 лог выглядит следующим образом (начальные строки с запуском программы и подгрузкой библиотек убраны)

Код:
...
open("/dev/ttyS0", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFCHR|0660, st_rdev=makedev(4, 64), ...}) = 0
read(3, 0x9719000, 4096)                = ? ERESTARTSYS (To be restarted)

2. wine запускает программу, которая ищет COM1 устройство. Следовательно на ноутбуке у себя я сделал так;
ln -s /dev/ttyS0 /dev/ttyUSB0

/dev/ttyUSB0 - это теперь COM1, так как я воткнул туда переходник.

Скорее всего просто надо сделать более правильно. Посмотрите в домашнем каталоге подкаталог .wine/dosdevices, в нём, судя по интернету, должна быть ссылка com1 на /dev/ttyS0, более корректно, наверное, будет установить её на прямую, на /dev/ttyUSB0.

3. У меня никаких мыслей по поводу "псевдотерминала". Я не знаю, как его настроить. =)
Если есть что почитать, я бы не отказался.
http://www.linuxquestions.org/questions/linux-general-1/using-linux-pseudo-terminal-pairs-659374/
« Последнее редактирование: 11-10-2011 14:25 от darkelf » Записан
Maksir
Постоялец

ru
Offline Offline

« Ответ #27 : 11-10-2011 14:30 » 

Maksir, в лог пишутся не все данные. Смотри опции strace. Там же можно поставить фильтр на список системных вызовов.

Там конечно есть опции, но что нужно?

Вот так попробовал;
strace -p 3764 -xx -o wzvonki0

Теперь всё в hex;

Код:
read(20, "\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"..., 64) = 64
write(21, "\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x00\x01\x00\x00\x00\x00\x00\x88\x00\x01\x00\x88\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00"..., 64) = 64

Как же это всё записывается, не пойму. Выходит что, - на том устройстве, на котором записываются звонки, и куда посылается весь этот код, - там нужно открыть какой-то сокет, или порт, для записи в него. А он, в свою очередь, вносит этот код куда надо в память. Так чтоли?

Тоже самое происходит, когда я открываю на своём компьютере эту программу - она сначала ищет СОМ-порт, затем считывает данные с того устройства - и вот, всё расписание у меня в этой программке. -- Если соединения с устройством нет, то программка напишет ошибку - не найден порт. И таблица с расписанием будет пуста. т.е. - всё расписание хранится в устройстве табло, с него и считывается, и в него же и записывается. По этому я думаю, что там какая-то мини-операционная система есть, с которой мне нужно взаимодейстовать. И этот код - в логе, для этой "мини-системы" в табло.

Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #28 : 11-10-2011 14:35 » 

Там конечно есть опции, но что нужно?

Вот так попробовал;
strace -p 3764 -xx -o wzvonki0

Посмотрите в сторону опций -e read= и -e write=, возможно ещё поможет опция -s
« Последнее редактирование: 11-10-2011 14:37 от darkelf » Записан
Maksir
Постоялец

ru
Offline Offline

« Ответ #29 : 11-10-2011 14:48 » 

Скорее всего просто надо сделать более правильно. Посмотрите в домашнем каталоге подкаталог .wine/dosdevices, в нём, судя по интернету, должна быть ссылка com1 на /dev/ttyS0, более корректно, наверное, будет установить её на прямую, на /dev/ttyUSB0.
Нету там этой ссылки для COM порта =) это просто виртуалка. Да и какое это имеет значение - в Linux каждый процесс можно так запускать и использовать по символичной ссылке на устройство. Так всё и работает. В этом нет никакой ошибки. Да и вопрос не в этом)
В папке /dev - это тоже всё такие же ссылки на устройства, только генерируются они ядром.

Там конечно есть опции, но что нужно?

Вот так попробовал;
strace -p 3764 -xx -o wzvonki0

Посмотрите в сторону опций -e read= и -e write=, возможно ещё поможет опция -s

Благодарю, спасибо! посмотрю.
Но вот вопрос теперь (из поста выше) - допустим, я получил этот код. И что мне теперь с ним делать. - В посте всё описанно. Я думаю, что моя программка из под Wine взаимодействует с этим табло - т.е. - в табло стоит вторая половинка этой проги/терминала, которая принимает этот код. Но вот как раз в этом и вопрос - открыть нужно тот удалённый терминал, перед вводом данных. (ну, типа, - так же как мы пишим АТ-команды на модем)

Вот, я нашёл кое-что, что-то типа этого мне нужно сделать;

http://lkml.indiana.edu/hypermail/linux/kernel/9903.2/0523.html

То есть, задача такая - программа, которую я использую, - ищет COM-порт, по нему соединяется с таблом и открывает там нужный сокет (какие-то команды использует для табло, перед записью в него) <- Вот это всё я прослушал, когда ставил на прослушку strace, и записал только те данные, которые посылает программа, но уже на открытый сокет в табло. То есть, серединку я только записал.
(млин, вечно я не фтеме...)
« Последнее редактирование: 11-10-2011 15:08 от Maksir » Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines