Добрый день Уважаемый All.
В связи с нестандартной задачей, столкнулся с проблемой чтения из ком порта.
Задача состоит в следующем - организовать работу Сом порта в асинхронном режиме, т.е. написал в него - послушал, если тихо еще раз написал, если ответили отработал и т.д.. Проблема возникает при чтении из порта, в момент когда от него ничего не приходит, fread($tty,1) просто ждет, ждет и ждет. Можно как-то ограничить не по количеству считанных символов, а по времени считывания например в 10мс?
Да и вообще может кто-то пробовал делать, что-то подобное на PHP?
1. stari40k - 18 Октября, 2010 - 09:13:58 - перейти к сообщению
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 пишет:
Для реализации предлооженной вами коммуникационной задачи по асинхрононму обмену информации с COM-портом целесообразно использовать соответствующий язык программрования - в частности Perl имеет достаточное число библиотек CPAN для реализации требуемой задачи - в частности вы можете просмотреть функциональность этого пакета расширений http://search[dot]cpan[dot]org/~galileo/[dot][dot][dot]1/PortScanner[dot]pm и его зависимостейДа и вообще может кто-то пробовал делать, что-то подобное на PHP?
stari40k пишет:
Для осуществления проверки времени считывания информации из коммуникационного порта необходимо использовать достаточно низкоуровненый подход - дело в том что во-первых замеряемой сресдвтами прилоежния время в многопоточной системе не является достаточно точной величиной - и во-вторых возможно создание отдельного потока или процесса в котором производится ожидание считывания последующего байта - в то время как родительский процесс произвродит расчет времени
Можно как-то ограничить не по количеству считанных символов, а по времени считывания например в 10мс?
6. stari40k - 20 Октября, 2010 - 09:48:42 - перейти к сообщению
Забыл отписаться.
Используя dio данная задача легко реализуется.
Привожу простой пример.
Используя dio данная задача легко реализуется.
Привожу простой пример.
Дальше можно делать все вообще иначе. Например ожидать ответа 1-2мс если нет -повторить запрос, если ответ пришел считывать по одному байту и и проверять контрольную сумму. Что собственно сейчас уже и реализовано.
Пример привел для наглядности, и последующих кодеров на PHP. Еще раз всем спасибо за написаные ответы, удачного кодинга.