![]() |
Модераторы: Aliance, skyboy, MoLeX, ksnk |
![]() ![]() ![]() |
|
xZ0RGx |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Здравствуйте!
Есть у меня интересная задачка. Суть в следующем. Имеется железка подключенная к COM-порту. С этой железкой надо общаться по её собственному протоколу. Т.е. я посылаю данные на COM-порт, затем должен получить ответ от железки и т.д. Принцип вопрос-ответ. Проблема в том, что мне надо написать это на PHP. Да, я знаю, что я извращенец, можете не говорить ![]() Для PHP есть замечательный класс PHPSerial, но вот беда в винде не работает чтение из порта и предлагают использовать serproxy например. Ну что же послушаемся совета. Serproxy - я так понимаю ловит все данные "прилетающие" на указанный порт (в конфиге), например для COM1 это 5331 и посылает их на COM-порт. Ну своеобразный уровень абстракции, прокладка эдакая. Ну так вот. Я так понимаю, чтобы работать теперь с моей железкой с помощью serproxy мне надо для начала установить соединение через сокет, а затем послать данные в этот поток. Нюанс: Данные железке надо посылать в виде специально сформированного пакета в HEX.
Вот такой простейший пример кода. Сразу оговорюсь, раньше никогда не работал с сокетами на PHP. Я правильно понимаю, что: fsockopen() - осуществляет коннект на указанный порт (открывает сокет)? fwrite - отправляет данные на указанный порт (пишет в поток), т.е. по сути выполнив fwrite я отправлю данные на нужный мне порт, где их словит serproxy и передаст COM-порту? Т.е. по идее здесь мои данные должны доходить до железки. Но почему-то она никак не реагирует ![]() fread - читает данные . Т.е. по сути здесь я должен получить ответ от железки и увидеть его в браузере, т.к. echo, но тоже тишина и ничего не получаю. Вот это меня настораживает больше всего. Даже если я отправил неверный пакет данных железка должна была ответить кодом ошибки. Поясните мне пожалуйста непонятные для меня моменты, буду признателен ![]() |
|||
|
||||
xZ0RGx |
|
||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
Кое что прояснилось и есть подозрение откуда ноги растут. Поставил порт сниффер.
Вот как работает с железкой родная прога.
А вот такое вижу от PHP :(
Тестировалось с использованием класса PHPSerial (линк в пред. посте) таким вот кодом:
Также проверил serproxy. Тоже самое.
Не пойму в чем косяк. =( |
||||||||
|
|||||||||
youri |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 17.4.2004 Репутация: нет Всего: 16 |
тебе поможет chr ;)
p.s. а вообще у меня есть dll под windows для работы с COM-портом, надо? Это сообщение отредактировал(а) youri - 10.6.2009, 13:39 |
|||
|
||||
xZ0RGx |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
В общем мне тут подсказали, что проблема в том, что как первый пример кода, так и второй посылают данные обычной строкой, а надо byte. Ну я репу почесал и запомнил. Сейчас полез в инет рыться как-бы так извернуться. И меня осенило. В общем.
Я полный кретин! ![]() ![]() ![]() youri: Спасибо за ответ, но уже не очень актуально ![]() |
|||
|
||||
youri |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 17.4.2004 Репутация: нет Всего: 16 |
php extension, могу даже с исходниками |
|||
|
||||
xZ0RGx |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
C удовольствием бы взял, посмотрел что это такое.
Можно и с исходниками. Я так понимаю это сторонняя библиотека которая не входит в PECL? ![]() Это сообщение отредактировал(а) xZ0RGx - 12.6.2009, 21:45 |
|||
|
||||
youri |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 17.4.2004 Репутация: нет Всего: 16 |
ну можешь попробовать посмотреть
p.s. не знаю как исходники соответствуют dll'ке, но расхождения должны быть не сильные p.p.s. тебе может помочь http://msdn.microsoft.com/en-us/library/aa363196(VS.85).aspx Это сообщение отредактировал(а) youri - 13.6.2009, 03:17 Присоединённый файл ( Кол-во скачиваний: 30 ) ![]() |
|||
|
||||
webber |
|
|||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 3.10.2006 Репутация: нет Всего: нет |
xZ0RGx, если не секрет скажите почему именно потребовалось на php?
|
|||
|
||||
xZ0RGx |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
youri: Спасибо большое. Я так понимаю надо положить ее в папку ext и затем подключить в php.ini модулем, типа zend_extension_ts = <full path to php ext folder>\php_serial.dll. Затем подключаем файл класса к проекту и работаем уже через класс? Интересно а расширение не SWIG'ом в дллку завернули?
![]() webber: да, можно и на "ты" ![]() Это сообщение отредактировал(а) xZ0RGx - 19.6.2009, 01:44 |
|||
|
||||
youri |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 17.4.2004 Репутация: нет Всего: 16 |
так же как с другими расширениями - положить в папку ext и подключить: extension = php_serial.dll можно и без класса: класс в некоторой степени показывает, как использовать эту dll'ку нет, это я его писал xZ0RGx, а что за проект? Полностью работает под управлением веб-сервера? Рассчитан на работу в интернете? |
|||
|
||||
xZ0RGx |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
а расширение только для винды я так понимаю? Пока через serproxy сделал, так как сокеты самый кросс платформенный вариант.
респект ![]()
Ну, что за проект не хотелось бы рассказывать на просторах интернета, если очень интересно могу в личку написать. Удивишься. Пока да, работает под управлением веб-сервера только, но думаю, что можно сделать и несколько по-другому. На работу в интернете не совсем рассчитан. Только если демка какая-то. P.S.: А, кстати, ещё есть потребность эмуляции многопоточности. Надо в цикле опрашивать железку о её состоянии, чтобы зафиксировать когда оно изменится. Т.е. опрашиваем ее в одном потоке и когда статус железки изменился, надо как-то сказать об этом в основной поток, чтобы там обработать эвент ![]() Это сообщение отредактировал(а) xZ0RGx - 23.6.2009, 09:13 |
||||
|
|||||
youri |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 17.4.2004 Репутация: нет Всего: 16 |
да
интересно так тебе ж получается скорее event'ы нужны, а не многопоточность. Под unix - это сигналы, как я понимаю. Есть еще вариант делать все это в том же потоке (возможно с помощью асинхронных вызовов). Но может лучше и демон, правда почему под windows "скрипт из CLI запускать с set_time_limit(0)" и как он работать будет. Ты, наверное, имеешь в виду, под windows тоже демон написать. Я бы посмотрел (подумал), как оно будет выглядеть в одном потоке, но скорее писал бы демона p.s. остерегайся циклических ссылок при длительной работе php-скриптов |
|||
|
||||
xZ0RGx |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 5.6.2009 Репутация: нет Всего: нет |
youri, отписал в личку.
|
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Сеть | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |