Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Работа с Com портом.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Работа с Сом портом в асинхронном режиме.
stari40k
Отправлено: 18 Октября, 2010 - 09:13:58
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Окт. 2010  


Помог: 0 раз(а)




Добрый день Уважаемый All.
В связи с нестандартной задачей, столкнулся с проблемой чтения из ком порта.
Задача состоит в следующем - организовать работу Сом порта в асинхронном режиме, т.е. написал в него - послушал, если тихо еще раз написал, если ответили отработал и т.д.. Проблема возникает при чтении из порта, в момент когда от него ничего не приходит, fread($tty,1) просто ждет, ждет и ждет. Можно как-то ограничить не по количеству считанных символов, а по времени считывания например в 10мс?
Да и вообще может кто-то пробовал делать, что-то подобное на PHP?
 
 Top
Ch_chov
Отправлено: 18 Октября, 2010 - 10:25:24
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Цитата:
ожно как-то ограничить не по количеству считанных символов, а по времени считывания например в 10мс?

Думаю, нет.

Если php работает на windows, то можешь использовать dll расширение php_ser от наших румынских друзей. Радость
http://www[dot]thebyteworks[dot]com

В нём есть функция ser_inputcount( void ) // кол-во байтов в буфере чтения

Библиотека платная (1150 руб.), в демо версии есть два ограничения:
1. Искусственно увеличено время открытия порта
2. Установлен лимит на общее кол-во байтов для отправки в com порт.

Если php работает в режиме модуля apache, то можно использовать постоянное соединение с com портом. Соответственно первое ограничение не критично т.к. соединение устанавливается только один раз.
Второе ограничение не срабатывает если php работает в CGI режиме.


Все зависит от конкретной задачи.
Если нужно desktop приложение для работы с com портом, то удобней все таки его писать на С++ и др.
 
 Top
stari40k
Отправлено: 18 Октября, 2010 - 13:00:51
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Окт. 2010  


Помог: 0 раз(а)




Ch_chov спасибо за ответ, а как насчет dio ?
 
 Top
Ch_chov
Отправлено: 18 Октября, 2010 - 13:14:51
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




dio не пробовал, я думаю там такая же проблема с чтением com порта:

http://www.php.net/manual/en/function.dio-read.php пишет:
Note that dio_read on Windows (other platforms unknown) will not timeout if there is no data to read. There is no way to specify a timeout or do a non-blocking read on Windows.
 
 Top
JustUserR
Отправлено: 18 Октября, 2010 - 16:27:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




stari40k пишет:
Да и вообще может кто-то пробовал делать, что-то подобное на PHP?
Для реализации предлооженной вами коммуникационной задачи по асинхрононму обмену информации с COM-портом целесообразно использовать соответствующий язык программрования - в частности Perl имеет достаточное число библиотек CPAN для реализации требуемой задачи - в частности вы можете просмотреть функциональность этого пакета расширений http://search[dot]cpan[dot]org/~galileo/[dot][dot][dot]1/PortScanner[dot]pm и его зависимостей
stari40k пишет:
Можно как-то ограничить не по количеству считанных символов, а по времени считывания например в 10мс?
Для осуществления проверки времени считывания информации из коммуникационного порта необходимо использовать достаточно низкоуровненый подход - дело в том что во-первых замеряемой сресдвтами прилоежния время в многопоточной системе не является достаточно точной величиной - и во-вторых возможно создание отдельного потока или процесса в котором производится ожидание считывания последующего байта - в то время как родительский процесс произвродит расчет времени


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
stari40k
Отправлено: 20 Октября, 2010 - 09:48:42
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Окт. 2010  


Помог: 0 раз(а)




Забыл отписаться.
Используя dio данная задача легко реализуется.
Привожу простой пример.
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. function mt(){
  3.         list($usec,$sec)=explode(' ',microtime());
  4.         return ((float)$usec+(float)$sec);
  5. }
  6. $now = $this->mt();
  7. $end = $now + .1;
  8. $result = '';
  9.      while ($now < $end) {
  10.         $result .= dio_read($tty,1);
  11.         $now = time();
  12.    }
  13.  

Дальше можно делать все вообще иначе. Например ожидать ответа 1-2мс если нет -повторить запрос, если ответ пришел считывать по одному байту и и проверять контрольную сумму. Что собственно сейчас уже и реализовано.
Пример привел для наглядности, и последующих кодеров на PHP. Еще раз всем спасибо за написаные ответы, удачного кодинга.
 
 Top
орешек
Отправлено: 16 Мая, 2011 - 12:14:38
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




Ch_chov пишет:
Если php работает на windows, то можешь использовать dll расширение php_ser от наших румынских друзей. Радость
http://www.thebyteworks.com

подскажете, где таблетку для этого расширения достать? А то после нескольких сообщений в порт он намертво виснет до перезагрузки=(
 
 Top
Ch_chov
Отправлено: 17 Мая, 2011 - 14:59:05
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Таблеток нет, 1150 руб. не так уж и дорого.
 
 Top
kolio
Отправлено: 02 Февраля, 2016 - 19:44:41
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Февр. 2016  


Помог: 0 раз(а)




тоже заинтересовала тема работы с портами через web
так как я знаю php+css+html+jquery+mysql то для меня создать веб морду для управления портами не проблема
также разрабатываю под android - вот тут то стало интересно - ведь можно иметь условно говоря "сайт" - залогиниться на нём с под мобилки через написанное android-приложение и например выполнять какие-то действия на стороне сервера apache

и тоже столкнулся с этой библиотекой
еще пробовал работать с dio, но там нет функций ser_setDTR, ser_setRTS
но как мы все знаем в ser++ библиотеке задержка на открытие порта в 5 сек + выводит trial надпись при возврате версии библиотеки

немного поковырявшись в php_ser++.dll убрал надпись и задержку при открытии порта
и щас хочу убрать ограничение на 1КБ передаваемых данных (хотя думаю это не есть проблема, так как я решил загнать 2Кб на выход и получил Version: 20140531.2 0 in 2010 out)

хотелось бы на самом деле работать с LPT, так как он мне нужен, но пока особо не нашел готовых решений под php

(Отредактировано автором: 02 Февраля, 2016 - 20:02:34)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Операционная система и системные вызовы »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB