Серийный комм с PHP на Windows

Я ищу способ общения с последовательным COM-портом RS232 на окнах. Я нашел 2 решения в сети, один из которых не является полностью бесплатным (вводит преднамеренные задержки в функции), а другой с ограниченными возможностями в Windows. Последний может записывать только на COM-порт в Windows, а не читать.

Я не могу смотреть на код первого решения, так как он скомпилирован в .dll (имеет смысл, иначе люди могут просто отредактировать задержку, а не купить его …), а второй, похоже, только для использования fopen () чтобы открыть порт, а затем fwrite () для записи, как и поток. Но, по-видимому, он ничего не возвращает.

Я знаю, что это возможно, поскольку это первое решение, хотя Apache использует модуль php-cgi вместо php5module.

Есть идеи?

Solutions Collecting From Web of "Серийный комм с PHP на Windows"

Каждое решение выше либо неэффективно, либо слишком много работы.

Вы можете просто использовать библиотеку PHP-DIO (dio_fcntl, dio_open, dio_read, dio_write, dio_seek, …). Это также в записи руководства PHP для DIO :

По умолчанию этот пакет PECL недоступен. Чтобы получить его для Windows, если у вас есть PHP 5.2.x больше 5.2.6, вы можете скачать его как часть ZIP:

  • Thread-safe (для Apache)

  • Non-thread-safe (для IIS)

Обе эти ссылки были найдены в http://www.deveblog.com/index.php/download-pecl-extensions-for-windows/

Вот сборка из Linux , просто получите ее и выполните установку phpize / configure / make / make install.

Я не знаю, следует ли использовать его в сеансе Apache, но ищите его.

Самый простой способ справиться с этим – написать программу на другом языке (например, C ++), а затем выполнить ее из своего php-скрипта с помощью system() . Выполнение операций ввода-вывода в C ++ тривиально.

Это предполагает, что у вас достаточно доступа к серверу для его настройки, чтобы позволить исполняемому файлу запускаться php и т. Д.

Другим возможным способом было бы использовать Win32 API через что-то вроде w32api_register_function() или ffi, а затем использовать вызовы последовательной связи, чтобы заставить его работать под Windows.

У меня была такая же проблема, и я уже рассматривал возможность написания собственного расширения php, когда я столкнулся с этим решением, которое популярно у разработчиков Arduino – «serproxy» (нашел его во многих местах, т. Е. http://www.lspace.nildram.co. uk / freeware.html ) устанавливает стек tcp в / из последовательных портов и разрешает мне использовать функции сокета php для связи с ним.

Вам нужно установить com с помощью команды dos, например:

 $output = `mode COM1: BAUD=115200 PARITY=N data=8 stop=1 XON=off TO=on `; 

Следующая команда выполняет команду dos через php:

 echo"$output"; 

Создайте идентификатор ресурса:

 $fp = fopen('COM1', 'r+'); if(!$fp){ echo"Port not accessible"; }else{ echo"Port COM1 opened successfully"; } 

Запись в порт:

 $writtenBytes = fputs($fp, "Hello"); echo"Bytes written to port: $writtenBytes"; 

Чтение из порта:

 $buffer = fgets($fp); echo"Read from buffer: $buffer"; 

Может быть, кто-нибудь поможет мне с проблемой fgets. Он укладывается туда ровно на одну минуту, если TO = on или стекирует там навсегда, если TO = выключено. Кажется, это вариант «MODE COM», поэтому может помочь эксперт DOS.

Возможно, вместо fgets следует использовать fgetc, поскольку fgets захватывает новую строку. Если новая строка не встречается, она может блокироваться до тех пор, пока не будет один или пока буфер не будет сброшен. Задержка в одну минуту может быть окном, промывающим его буфер с интервалом.

Другой вариант – использовать объект через ActiveX в окнах. Есть несколько, в основном коммерческих серийных объектов для COM на окнах. Вы также можете открыть объект на основе .Net и зарегистрировать его для использования COM. Конечно, это предполагает, что у вас есть контроль над сервером для регистрации COM-управления, поскольку вам потребуется последовательный интерфейс.

Другая проблема – это конфликт ресурсов, если он используется через Интернет. Например, если это относится к последовательному принтеру, то диспетчер очереди печати будет лучшим вариантом для прямой связи.

Если вы хотите иметь дело с смс с помощью COM-порта, то вот самый известный класс последовательной связи php от Rémy Sanchez с образцом кода Google . Вот поток, который включает эту тему.