dimedrol
Помогающий
Offline
|
|
« : 18-05-2010 05:14 » |
|
День добрый. Столкнулся с таким неоднозначным результатом в процессе тестирования СОМ порта под Linux Debian Etch. В порт вставляется заглушка RX<->TX, после чего делаю: cat /dev/ttyS0 > ./log & echo "12345" > /dev/ttyS0
в результате наблюдаю непрерывно растущий файл log, содержимое его выглядидт следующим образом: и т.д. короче строка постоянно повторяется с всевозрастающим числом переносов строк. Я проверил такую же комбинацию команд на том что было под рукой - qnx 6.3 - результат нормальный, т.е. в файле log просто строка 12345. Интересно что это значит, это такая особенность работы команды cat или что-то еще?
|
|
|
Записан
|
Как говориться, cемь бед - один Reset
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #1 : 18-05-2010 05:52 » |
|
dimedrol, ttyS0 - это не просто последовательный порт - это терминал. К самому каналу могут подключаться различные дисциплины. Т.ч. нужно писать программу: открывать устройство, конфигурить его и только потом работать.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
dimedrol
Помогающий
Offline
|
|
« Ответ #2 : 18-05-2010 05:55 » |
|
ясно, спасибо, RXL, буду конфигурить.
|
|
|
Записан
|
Как говориться, cемь бед - один Reset
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #3 : 18-05-2010 05:58 » |
|
Читай pinfo libc - раздел Low-Level Terminal Interface. Нужно перевести терминал в неканонический режим.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Maksir
Постоялец
Offline
|
|
« Ответ #4 : 08-10-2011 03:26 » |
|
У меня вопрос. Есть программа для звонков (школа), она взаимодействует с /dev/ttyS0. загружает расписание на табло через компорт. Но расписание в программе позволяет забивать звонки только на сутки, потом расписание повторятся. А нужно делать расписание на неделю.
Мне интересно, есть ли способ прослушать комп порт, что бы записать поток в текстовый файл?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #5 : 08-10-2011 05:56 » |
|
Прослушать на уровне RS232 - легко. Нужен компьютер с одним или двумя COM-портами - в зависимости от того, собираешься ли ты снифить трафик в одном или в двух направлениях. Подключай так: GND - GND, Rx снивера - Tx слушаемого порта. Скорость и битовые настройки порта придется подобрать эмпирически или подсмотреть в исследуемой программе.
Прослушать на уровне драйвера - надо уметь писать драйверы под Linux.
Есть непроверенная идея - подменить устройство ttyS0 на псевдотерминал и замкнуть трафик через свою программу. Тогда сможешь не только снифить, но и подменять данные.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Maksir
Постоялец
Offline
|
|
« Ответ #6 : 08-10-2011 07:27 » |
|
Благодарю.
т.е. проснифить, как обыкновеную сетку... очень экзотично. Попробую подменить ttyS0 на обычный файл, что-то не сообразил. спасибо за идею. Ещё забыл, можно же вообще опросить устройство, может там что всплывёт.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #7 : 08-10-2011 08:27 » |
|
Нет-нет - не на обычный файл - на псевдотерминал! Обычные файлы не поддерживают вызовы ioctl, специфичные для терминалов, и имеют другое поведение в операциях ожидания ввода-вывода. Почитай, что такое pts (псевдотерминал). Это двунаправленный байтовый канал типа unix-сокета, но имеющий API, аналогичный терминалу.
Ну и еще один способ - гибрид вариантов 1 и 3: пропустить трафик через свою машину с двумя портами.
|
|
« Последнее редактирование: 08-10-2011 08:30 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Maksir
Постоялец
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
Пол:
|
|
« Ответ #9 : 08-10-2011 15:29 » |
|
Maksir, ...
1. inittab тут не при чем 2. Если понимаешь код, то попробуй написать программу. 3. Это не C++ — это С.
Попробуй поиском поработать — может твою задачу уже давно решили.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #10 : 08-10-2011 15:35 » |
|
У меня вопрос. Есть программа для звонков (школа), она взаимодействует с /dev/ttyS0. загружает расписание на табло через компорт. Но расписание в программе позволяет забивать звонки только на сутки, потом расписание повторятся. А нужно делать расписание на неделю.
Мне интересно, есть ли способ прослушать комп порт, что бы записать поток в текстовый файл?
Как вариант - сделать n файлов - по количеству учебных дней в неделе, и основной загружаемый (можно обойтись и без него), прописать замену загружаемого по cron-у (или сделать n-записей для каждого дня недели, или просто более-менее интеллектуальный скрипт), там-же, если надо, и выполнить загрузку нового расписания через /dev/ttyS0.
|
|
|
Записан
|
|
|
|
Maksir
Постоялец
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
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #12 : 08-10-2011 18:34 » |
|
Wireshark умеет слушать usb порты. Может быть можно его натравить и на COM порт. Я не испытывал.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #13 : 08-10-2011 19:18 » |
|
Могу лоток CD выдвинуть по расписанию чере cron, что бы тот на рычажок нажимал)) Гениально. (Серьёзно. Для людей, не дружащих с паяльником, но желающих, чтобы что-то физически включалось или выключалось компьютером.)
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #14 : 08-10-2011 19:25 » |
|
Вспомнил тут еще один метод: запустить программу через утилиту strace. Да, будет огроменный лог, но после некоторой тренировки вполне можно научиться делать его меньше и информативнее и получить через него нужную информацию.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
DneprSMV
|
|
« Ответ #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
Пол:
|
|
« Ответ #16 : 08-10-2011 19:32 » |
|
DneprSMV, вопрос не в настройках порта. Он не знает протокола и хочет его перехватить. А уж как его потом применить - дело десятое. Кстати, вопрос задал Maksir.
Еще вариант до кучи: поставить на той Linux-машине виртуалку, на нее винду и запускать программу оттуда. Скажем, для VirtualBox или VMware можно указать вместо последовательного порта использовать указанную программу. Ну и так же - пропустишь через себя трафик, соберешь лог и найдешь в нем логику.
|
|
« Последнее редактирование: 08-10-2011 19:39 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
DneprSMV
|
|
« Ответ #17 : 08-10-2011 19:33 » |
|
dimedrol решение задачи "по тупому" поставь на конвейер и фильтруй чево там лишнее (например sed) Добавлено через 22 минуты и 59 секунд:Maksir, для просмотра протокола желательн заранее знать, он текстового формата или бинарный. Если текстовый, то вариант проще, если бинарный - то сложнее. К томуже если используется минимальное шифрование, то задача усложняется на пару порядков. Как вариант предлагаю взять любую терминальную программу под Win (я пользуюсь Qmodem), позволяющую выводить принимаемый траф. в hex-формате и писать в лог. Если будет просматриваться структура-анализ - идти дальше. Если надо просмотреть оба направления TxRx - использовать 2 программы и 2 порта Альтернатива - использовать сниффер готовый или самому на С написать (режим фильтра или "подслушки").
|
|
« Последнее редактирование: 08-10-2011 19:56 от DneprSMV »
|
Записан
|
"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #19 : 10-10-2011 12:15 » |
|
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Maksir
Постоялец
Offline
|
|
« Ответ #20 : 10-10-2011 13:34 » |
|
Благадарю! Большое спасибо! Всё, пошёл примерять партянки =) Добавлено через 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
Молодой специалист
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
|
|
« Ответ #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
Пол:
|
|
« Ответ #23 : 11-10-2011 14:03 » |
|
Maksir, в лог пишутся не все данные. Смотри опции strace. Там же можно поставить фильтр на список системных вызовов.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Maksir
Постоялец
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
|
|
« Ответ #25 : 11-10-2011 14:15 » |
|
Maksir, аппаратно - это надо подключиться проводками дополнительной машинкой с Win (или любой другой системой, где можно запустить терминалку с выводом в hex). Проводков - 3: Корпус, Gnd, Rx. Ошибаться низзя, можно спалить порт(ы). Если есть на той же ПК свободный порт (не USB, a RS232) и терминалка с выводом в HEX - тоже можно посмотреть. Если надо, напишу подробнее.
|
|
|
Записан
|
"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
|
|
|
darkelf
Молодой специалист
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
Постоялец
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
Молодой специалист
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
Постоялец
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 »
|
Записан
|
|
|
|
|