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
Форумы портала PHP.SU :: Версия для печати :: Работа с Com портом.
Форумы портала PHP.SU » » Операционная система и системные вызовы » Работа с Com портом.

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

1. stari40k - 18 Октября, 2010 - 09:13:58 - перейти к сообщению
Добрый день Уважаемый All.
В связи с нестандартной задачей, столкнулся с проблемой чтения из ком порта.
Задача состоит в следующем - организовать работу Сом порта в асинхронном режиме, т.е. написал в него - послушал, если тихо еще раз написал, если ответили отработал и т.д.. Проблема возникает при чтении из порта, в момент когда от него ничего не приходит, fread($tty,1) просто ждет, ждет и ждет. Можно как-то ограничить не по количеству считанных символов, а по времени считывания например в 10мс?
Да и вообще может кто-то пробовал делать, что-то подобное на PHP?
2. Ch_chov - 18 Октября, 2010 - 10:25:24 - перейти к сообщению
Цитата:
ожно как-то ограничить не по количеству считанных символов, а по времени считывания например в 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 портом, то удобней все таки его писать на С++ и др.
3. stari40k - 18 Октября, 2010 - 13:00:51 - перейти к сообщению
Ch_chov спасибо за ответ, а как насчет dio ?
4. Ch_chov - 18 Октября, 2010 - 13:14:51 - перейти к сообщению
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.
5. JustUserR - 18 Октября, 2010 - 16:27:55 - перейти к сообщению
stari40k пишет:
Да и вообще может кто-то пробовал делать, что-то подобное на PHP?
Для реализации предлооженной вами коммуникационной задачи по асинхрононму обмену информации с COM-портом целесообразно использовать соответствующий язык программрования - в частности Perl имеет достаточное число библиотек CPAN для реализации требуемой задачи - в частности вы можете просмотреть функциональность этого пакета расширений http://search[dot]cpan[dot]org/~galileo/[dot][dot][dot]1/PortScanner[dot]pm и его зависимостей
stari40k пишет:
Можно как-то ограничить не по количеству считанных символов, а по времени считывания например в 10мс?
Для осуществления проверки времени считывания информации из коммуникационного порта необходимо использовать достаточно низкоуровненый подход - дело в том что во-первых замеряемой сресдвтами прилоежния время в многопоточной системе не является достаточно точной величиной - и во-вторых возможно создание отдельного потока или процесса в котором производится ожидание считывания последующего байта - в то время как родительский процесс произвродит расчет времени
6. stari40k - 20 Октября, 2010 - 09:48:42 - перейти к сообщению
Забыл отписаться.
Используя 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. Еще раз всем спасибо за написаные ответы, удачного кодинга.
7. орешек - 16 Мая, 2011 - 12:14:38 - перейти к сообщению
Ch_chov пишет:
Если php работает на windows, то можешь использовать dll расширение php_ser от наших румынских друзей. Радость
http://www.thebyteworks.com

подскажете, где таблетку для этого расширения достать? А то после нескольких сообщений в порт он намертво виснет до перезагрузки=(
8. Ch_chov - 17 Мая, 2011 - 14:59:05 - перейти к сообщению
Таблеток нет, 1150 руб. не так уж и дорого.
9. kolio - 02 Февраля, 2016 - 19:44:41 - перейти к сообщению
тоже заинтересовала тема работы с портами через 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

 

Powered by ExBB FM 1.0 RC1